реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Формат с плавающей точкой, подскажите как заменить
Алексей Савченко
сообщение Sep 1 2008, 06:51
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 20-08-08
Из: г.Чернигов, Украина
Пользователь №: 39 704



Проблема состоит в том, что у меня контроллев F2013, соответственно у него 2к памяти. Для преобразования напряжения с АЦП в температуру используется полиномы 6й и 9й степени.
Что бы не потерять точность необходимо использовать формат с плавающей точкой, но при его использовании и совершении операций над ним библиотеки умножения занимают минимум 700 байт. Вообщем это слишком жирно.
Пробовал сделать свой формат, тоже плавающий, но умножать на 2в степени. После того как перемножал два int, получал long, потом сдвигал вправо до int и увеличивал степень. Но при этом точность падала. В некоторых случаях стала неудовлетворительной.
Предложите, чем можно заменить, как обойти.
Go to the top of the page
 
+Quote Post
msalov
сообщение Sep 1 2008, 06:57
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



А что вы дальше с температурой делаете? если посылаете на компьютер или записываете куда, тогда можно так и оставить, а перерасчёт оставтиь компьютеру.
Go to the top of the page
 
+Quote Post
Алексей Савченко
сообщение Sep 1 2008, 07:17
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 20-08-08
Из: г.Чернигов, Украина
Пользователь №: 39 704



Действительно, посылаю на ПК через RS485. Но дело в том, что это датчик температуры с RS выходом, и он должен выдавать значение температуры. Да и работая в сети с самыми разными устройствами нежелательно вешать вычисление на ПК.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Sep 1 2008, 07:26
Сообщение #4


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Алексей Савченко @ Sep 1 2008, 10:51) *
Что бы не потерять точность необходимо использовать формат с плавающей точкой, но при его использовании и совершении операций над ним библиотеки умножения занимают минимум 700 байт. Вообщем это слишком жирно.

Не понял: 700 байт флеши жалко?
Или 700 ОЗУ? - /не верю, многовато что-то/


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Алексей Савченко
сообщение Sep 1 2008, 07:39
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 20-08-08
Из: г.Чернигов, Украина
Пользователь №: 39 704



Вообщем то жалко и даж очень. Тут еще должно быть много чего. И протокол Modbus RS485 с перестройкой скоростей и опрос АЦП и получение температуры холодного спая от внутреннего сенсора, и еще куча параметров, стандартных для датчиков температуры.
А 700 байт это на вскидку. Реально при линковании еще больше пойдет...
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Sep 1 2008, 09:09
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Алексей Савченко @ Sep 1 2008, 10:39) *
Вообщем то жалко и даж очень. Тут еще должно быть много чего. И протокол Modbus RS485 с перестройкой скоростей и опрос АЦП и получение температуры холодного спая от внутреннего сенсора, и еще куча параметров, стандартных для датчиков температуры.
А 700 байт это на вскидку. Реально при линковании еще больше пойдет...

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


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
xemul
сообщение Sep 1 2008, 10:47
Сообщение #7



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(Алексей Савченко @ Sep 1 2008, 10:51) *
Проблема состоит в том, что у меня контроллев F2013, соответственно у него 2к памяти. Для преобразования напряжения с АЦП в температуру используется полиномы 6й и 9й степени.
Что бы не потерять точность необходимо использовать формат с плавающей точкой, но при его использовании и совершении операций над ним библиотеки умножения занимают минимум 700 байт. Вообщем это слишком жирно.
Пробовал сделать свой формат, тоже плавающий, но умножать на 2в степени. После того как перемножал два int, получал long, потом сдвигал вправо до int и увеличивал степень. Но при этом точность падала. В некоторых случаях стала неудовлетворительной.
Предложите, чем можно заменить, как обойти.

Какую же точность по температуре и в каком диапазоне Вы пытаетесь получить на выходе, что приходится пускаться в такие тяжкие? Неужели характеристика датчика (какого?) и преобразователя до такой степени нелинейна, что не позволяет обойтись какой-либо кусочной аппроксимацией с 1-байтовой коррекцией? имхо, целочисленной 2-байтовой арифметики с промежуточными результатами в 3-байтовом виде вполне достаточно.
Ну и методическая ошибка - утаптывать задачу в приглянувшийся контроллер, а не подобрать контроллер под задачу.
Go to the top of the page
 
+Quote Post
Алексей Савченко
сообщение Sep 1 2008, 11:06
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 20-08-08
Из: г.Чернигов, Украина
Пользователь №: 39 704



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


На счет ошибки согласен. Но контроллер был выбран до того как поручили развели плату и сделали. Осталось писать код и подстраиваться под условия.
Точность по температуре надо 0.25% в диалазоне -50-1250. Сигнал обрабатывается от термопары(ТХА). Там для преобразования напряжения в температуру используются полиномы 6й и 9й степени. Вот и выходит что числа слишком большие выходят.
Go to the top of the page
 
+Quote Post
SergeyBorshch
сообщение Sep 1 2008, 11:11
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 100
Регистрация: 28-09-05
Из: Чернигов, Украина
Пользователь №: 9 053



Если не нужна точность (в пределах +- 1градус) и небольшой диапазон температур, то можна обойтись и заданием температуры в виде таблицы, т.е. каждому значению АЦП - соответствующая температура с таблицы.
Итого, при диапазоне в 100 град, получится таблица в 200 байт, что очень экономно.
Удачи!!! smile.gif
Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 1 2008, 11:37
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Dog Pawlowa @ Sep 1 2008, 15:09) *
1) Кусочно-линейная аппроксимация в целых числах не поможет? Я именно так и делаю. Одно значение long на один градус, правда датчик NTC.
+1. Причем cаму таблицу можно вынести в отдельную м/с EEPROM, которую при необходимости (для снижения энергопотребления) запитать прямо от пина MSP430.
Go to the top of the page
 
+Quote Post
xemul
сообщение Sep 1 2008, 13:24
Сообщение #11



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(Алексей Савченко @ Sep 1 2008, 15:06) *
На счет ошибки согласен. Но контроллер был выбран до того как поручили развели плату и сделали. Осталось писать код и подстраиваться под условия.

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

На память не надеюсь, но грызут меня сомнения насчет точности ТХА в диапазоне >500 C. И коэффициенты в полиноме аппроксимации ТХА, по-моему, присутствуют все, а не только 6-й и 9-й степени.
Варианты:
1) кусочно-линейная аппроксимация (с большой кучей кусочков);
2) аппроксимация 2-й степенью (на меньшем числе кусочков).
При этом Вы уложитесь в целочисленную 3-4-байтовую арифметику.
При желании внутри каждого кусочка операцию разбиения можно повторить до достижения требуемой точности аппроксимации. Н-р, первая кусочно-линейная нарезка выполняется с 1% точностью, вторая кусочно-линейная нарезка обеспечивает требуемые 0.25%; результат соответствует параболической аппроксимации, считается быстрее (на одно умножение), но таблиц будет чуть больше (с другой стороны, эти таблицы можно будет свести вообще к 1-байтовым).
Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 1 2008, 13:31
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(xemul @ Sep 1 2008, 19:24) *
В MSP не копенгаген, но неужели нет pin2pin и функционально совместимого контроллера с 4 КБ флеша?
Пин-ту-пин с бОльшим объемом Flash нету. Мне, если честно, тоже непонятен выбор такого МК с учетом наличия в устройстве RS485. У MSP430F2013 нету аппаратного модуля USART или USCI, поддерживающего функцию UART. Имеющийся у него модуль USI поддерживает только синхронные интерфейсы SPI и I2C.
Go to the top of the page
 
+Quote Post
Алексей Савченко
сообщение Sep 1 2008, 13:52
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 20-08-08
Из: г.Чернигов, Украина
Пользователь №: 39 704



Приглянулась мне мысль насчет кусочно линейной апроксимации после того как построил эти полиномы. Поделив на кусков 50 и записать во флеш-инфо коэффициенты, должно получиться. Спасибо за дельные советыsmile.gif
А насчет выбора контроллера, так вышлоо, потому что не подумали. Делали схему. Кто то сказал:"я подобное в 1к помещал" так и порешили(((
Go to the top of the page
 
+Quote Post
SergeyBorshch
сообщение Sep 2 2008, 12:14
Сообщение #14


Частый гость
**

Группа: Участник
Сообщений: 100
Регистрация: 28-09-05
Из: Чернигов, Украина
Пользователь №: 9 053



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

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


Но зато у данного контроллера есть 16-битный АЦП с усилителем, наверняка когда данное устройство делали, то преждевременно думали о преобразовании сигнала с термопары. А если использовать внешний 16-битный АЦП + операционник + контроллер, то схема увеличивается как по стоимости, так и по размерам.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Sep 2 2008, 12:24
Сообщение #15


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Алексей Савченко @ Sep 1 2008, 17:52) *
Кто то сказал:"я подобное в 1к помещал" так и порешили(((

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


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 22:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.01486 секунд с 7
ELECTRONIX ©2004-2016