Перейти к содержанию
    

Формат с плавающей точкой

Проблема состоит в том, что у меня контроллев F2013, соответственно у него 2к памяти. Для преобразования напряжения с АЦП в температуру используется полиномы 6й и 9й степени.

Что бы не потерять точность необходимо использовать формат с плавающей точкой, но при его использовании и совершении операций над ним библиотеки умножения занимают минимум 700 байт. Вообщем это слишком жирно.

Пробовал сделать свой формат, тоже плавающий, но умножать на 2в степени. После того как перемножал два int, получал long, потом сдвигал вправо до int и увеличивал степень. Но при этом точность падала. В некоторых случаях стала неудовлетворительной.

Предложите, чем можно заменить, как обойти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что вы дальше с температурой делаете? если посылаете на компьютер или записываете куда, тогда можно так и оставить, а перерасчёт оставтиь компьютеру.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Действительно, посылаю на ПК через RS485. Но дело в том, что это датчик температуры с RS выходом, и он должен выдавать значение температуры. Да и работая в сети с самыми разными устройствами нежелательно вешать вычисление на ПК.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что бы не потерять точность необходимо использовать формат с плавающей точкой, но при его использовании и совершении операций над ним библиотеки умножения занимают минимум 700 байт. Вообщем это слишком жирно.

Не понял: 700 байт флеши жалко?

Или 700 ОЗУ? - /не верю, многовато что-то/

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообщем то жалко и даж очень. Тут еще должно быть много чего. И протокол Modbus RS485 с перестройкой скоростей и опрос АЦП и получение температуры холодного спая от внутреннего сенсора, и еще куча параметров, стандартных для датчиков температуры.

А 700 байт это на вскидку. Реально при линковании еще больше пойдет...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообщем то жалко и даж очень. Тут еще должно быть много чего. И протокол Modbus RS485 с перестройкой скоростей и опрос АЦП и получение температуры холодного спая от внутреннего сенсора, и еще куча параметров, стандартных для датчиков температуры.

А 700 байт это на вскидку. Реально при линковании еще больше пойдет...

1) Кусочно-линейная аппроксимация в целых числах не поможет? Я именно так и делаю. Одно значение long на один градус, правда датчик NTC.

2) Теоретически все можно перевести в целочисленную математику, только диапазоны нужно тщательно проверять.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблема состоит в том, что у меня контроллев F2013, соответственно у него 2к памяти. Для преобразования напряжения с АЦП в температуру используется полиномы 6й и 9й степени.

Что бы не потерять точность необходимо использовать формат с плавающей точкой, но при его использовании и совершении операций над ним библиотеки умножения занимают минимум 700 байт. Вообщем это слишком жирно.

Пробовал сделать свой формат, тоже плавающий, но умножать на 2в степени. После того как перемножал два int, получал long, потом сдвигал вправо до int и увеличивал степень. Но при этом точность падала. В некоторых случаях стала неудовлетворительной.

Предложите, чем можно заменить, как обойти.

Какую же точность по температуре и в каком диапазоне Вы пытаетесь получить на выходе, что приходится пускаться в такие тяжкие? Неужели характеристика датчика (какого?) и преобразователя до такой степени нелинейна, что не позволяет обойтись какой-либо кусочной аппроксимацией с 1-байтовой коррекцией? имхо, целочисленной 2-байтовой арифметики с промежуточными результатами в 3-байтовом виде вполне достаточно.

Ну и методическая ошибка - утаптывать задачу в приглянувшийся контроллер, а не подобрать контроллер под задачу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Какую же точность по температуре и в каком диапазоне Вы пытаетесь получить на выходе, что приходится пускаться в такие тяжкие? Неужели характеристика датчика (какого?) и преобразователя до такой степени нелинейна, что не позволяет обойтись какой-либо кусочной аппроксимацией с 1-байтовой коррекцией? имхо, целочисленной 2-байтовой арифметики с промежуточными результатами в 3-байтовом виде вполне достаточно.

Ну и методическая ошибка - утаптывать задачу в приглянувшийся контроллер, а не подобрать контроллер под задачу.

 

На счет ошибки согласен. Но контроллер был выбран до того как поручили развели плату и сделали. Осталось писать код и подстраиваться под условия.

Точность по температуре надо 0.25% в диалазоне -50-1250. Сигнал обрабатывается от термопары(ТХА). Там для преобразования напряжения в температуру используются полиномы 6й и 9й степени. Вот и выходит что числа слишком большие выходят.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если не нужна точность (в пределах +- 1градус) и небольшой диапазон температур, то можна обойтись и заданием температуры в виде таблицы, т.е. каждому значению АЦП - соответствующая температура с таблицы.

Итого, при диапазоне в 100 град, получится таблица в 200 байт, что очень экономно.

Удачи!!! :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1) Кусочно-линейная аппроксимация в целых числах не поможет? Я именно так и делаю. Одно значение long на один градус, правда датчик NTC.
+1. Причем cаму таблицу можно вынести в отдельную м/с EEPROM, которую при необходимости (для снижения энергопотребления) запитать прямо от пина MSP430.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На счет ошибки согласен. Но контроллер был выбран до того как поручили развели плату и сделали. Осталось писать код и подстраиваться под условия.

В MSP не копенгаген, но неужели нет pin2pin и функционально совместимого контроллера с 4 КБ флеша?

Точность по температуре надо 0.25% в диалазоне -50-1250. Сигнал обрабатывается от термопары(ТХА). Там для преобразования напряжения в температуру используются полиномы 6й и 9й степени. Вот и выходит что числа слишком большие выходят.

На память не надеюсь, но грызут меня сомнения насчет точности ТХА в диапазоне >500 C. И коэффициенты в полиноме аппроксимации ТХА, по-моему, присутствуют все, а не только 6-й и 9-й степени.

Варианты:

1) кусочно-линейная аппроксимация (с большой кучей кусочков);

2) аппроксимация 2-й степенью (на меньшем числе кусочков).

При этом Вы уложитесь в целочисленную 3-4-байтовую арифметику.

При желании внутри каждого кусочка операцию разбиения можно повторить до достижения требуемой точности аппроксимации. Н-р, первая кусочно-линейная нарезка выполняется с 1% точностью, вторая кусочно-линейная нарезка обеспечивает требуемые 0.25%; результат соответствует параболической аппроксимации, считается быстрее (на одно умножение), но таблиц будет чуть больше (с другой стороны, эти таблицы можно будет свести вообще к 1-байтовым).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В MSP не копенгаген, но неужели нет pin2pin и функционально совместимого контроллера с 4 КБ флеша?
Пин-ту-пин с бОльшим объемом Flash нету. Мне, если честно, тоже непонятен выбор такого МК с учетом наличия в устройстве RS485. У MSP430F2013 нету аппаратного модуля USART или USCI, поддерживающего функцию UART. Имеющийся у него модуль USI поддерживает только синхронные интерфейсы SPI и I2C.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приглянулась мне мысль насчет кусочно линейной апроксимации после того как построил эти полиномы. Поделив на кусков 50 и записать во флеш-инфо коэффициенты, должно получиться. Спасибо за дельные советы:)

А насчет выбора контроллера, так вышлоо, потому что не подумали. Делали схему. Кто то сказал:"я подобное в 1к помещал" так и порешили(((

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вы на чем пишете? Судя по всему на С.

Попробуйте функции программной реализации RS-485, переделать на asm-e. Я думаю, что в этом случае, существено уменьшиться код программы и все влезет в 2 кБ, без всякой апроксимации термопары.

 

Пин-ту-пин с бОльшим объемом Flash нету. Мне, если честно, тоже непонятен выбор такого МК с учетом наличия в устройстве RS485. У MSP430F2013 нету аппаратного модуля USART или USCI, поддерживающего функцию UART. Имеющийся у него модуль USI поддерживает только синхронные интерфейсы SPI и I2C.

 

Но зато у данного контроллера есть 16-битный АЦП с усилителем, наверняка когда данное устройство делали, то преждевременно думали о преобразовании сигнала с термопары. А если использовать внешний 16-битный АЦП + операционник + контроллер, то схема увеличивается как по стоимости, так и по размерам.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кто то сказал:"я подобное в 1к помещал" так и порешили(((

Ну так и флаг ему в руки!

Не надо однако забывать, что в 1к флеши в 8 и 16-битных контроллерах разное количество инструкций влезает...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...