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

 
 
> Малоресурсный алгоритм измерения температуры
ARV
сообщение Jun 9 2009, 05:03
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



прошу помощи в плане общего алгоритма... лучшей темы для своего вопроса не нашел...

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

что сделано сейчас и что не удовлетворяет (псевдо-Си-код)
t2 = 0;
do{
t1 = t2;
pause_1s();
t2 = get_temperature();
} while (t1 != t2);

это дает отличный результат при измерении температуры воды (большая теплоемкость, контакт с датчиком идеальный, быстро его нагревает) - за 15 секунд получается верный результат. для тела человека как правило цикл завершается за 0,3-0,6°С до реальной температуры, что не устраивает. кроме того, процесс длится не менее 30 секунд...

какие будут советы?


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
il--ya
сообщение Jul 2 2009, 10:41
Сообщение #2





Группа: Новичок
Сообщений: 1
Регистрация: 2-07-09
Пользователь №: 50 842



Цитата(ARV @ Jun 9 2009, 09:03) *
что сделано сейчас и что не удовлетворяет (псевдо-Си-код)
t2 = 0;
do{
t1 = t2;
pause_1s();
t2 = get_temperature();
} while (t1 != t2);


Попробуйте так (код написан исходя из 16-битной разрядности int)
Код
// Допустимые колебания показаний,
// вы говорите, что дрожат младшие 2 бита, накинем еще один, чтобы избежать ложного перезапуска осреднения
#define ERROR 8
#define AVERAGE_SHIFT 4
// Количество показаний для осреднения,
// whatever you like чтобы получить больше точность, в данном случае 16
#define AVERAGE_COUNT (1<<AVERAGE_SHIFT)

#define ABS(a) ((a)>=0 ? (a) : -(a))

int t1;
int t2;
long int average = 0; // если разрядности хватит для суммирования температур из области
                               //допустимых значений, то long может и не нужен
int count = 0

t2 = get_temperature();
do
{
  t1 = t2;
  if (!count)
    pause_long(); // достаточно долго, чтобы датчик успел нагреться/остыть на величину больше ERROR
  else
    pause_1s(); // при осреднении интервалы короче (может, можно и чаще чем раз в секунду?)

  t2 = get_temperature();
  if (ABS(t2-t1)<ERROR)
  {
    // если температура устаканилась, начинаем считать среднее
    average+=t2;
    count++;
  }
  else
  {
    // если температура не устаканилась, или опять начала меняться, сбрасываем среднее и опять ждём
    average=0;
    count=0;
  }
} while (count<AVERAGE_COUNT);

average>>=AVERAGE_SHIFT; // результат

Надеюсь, четыре int в стеке - это не слишком большие ресурсы.

Сообщение отредактировал il--ya - Jul 2 2009, 10:58
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 24th August 2025 - 13:40
Рейтинг@Mail.ru


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