Сделал так: 40 выборок в течении 2секунд потом деление на 40. Работает более чем классно! Осталось только сделать табличную подстановку. У кого есть пример кода на СИ?
PS: Молодцы ребята! Помогаете дружно! Так держать! Форум отличный!! Ни где так оперативно не отвечают когда надо помощь
Есть алгоритм оконного фильтра, который работает более эффективно, чем простое усреднение. 1. Определяем в оперативной памяти место под хранение данных от АЦП. Оптимально 16 или 32. При 10 битном АЦП понадобится соответственно 32 или 64 байта - это так называемое окно. 2. Каждое значение перед записью в оперативную память проверяем на максимальное отклонение (дельту) от уже подсчитанного отфильтрованного значения. Если оно сильно отличается - на стек не помещаем - то есть проводим отбраковку. 3. Сдвигаем информацию в окне - самое старое затираем следующим и так далее и помещаем в начало окна вновь поступившее значение. 4. Считаем среднее значение в окне Достоинства - высокая помехозащищенность, высокое быстродействие при хорошей фильтрации. Недостаток - надо много места в ОЗУ для окна. Например в обработке данных от тензодатчика в весах - вообще незаменимая вещь. Работает значительно лучше и красивее, чем простое усреднение, потому как не надо времени на накопление данных, в течении которого нет изменения результата на индикаторе. Пункт 2 можно и не делать, как у меня: Спойлер
Код:
;пп сглаживания показаний на основе алгоритма "скользящее окно" window: ; определяем и сдвигаем данные в окне ldi yl,$60 ;указатель на начало окна ldi yh,$0 ldi zl,$62 ;второй указатель на следующее значение в окне ldi zh,$0 ;смещаем содержимое окна на один элемент ldi temp3,31 stack: ld temp1,z+ ld temp2,z+ st y+,temp1 st y+,temp2 dec temp3 brne stack ;вновь поступившее значение помещаем в конец sts $9e,buf_adc_l ; 9e 7e sts $9f,buf_adc_h ; 9f 7f
;теперь суммируем все,что находится в окне для усреднения ldi yl,$60 ;начало окна ldi yh,$0 ldi zh,32 ;количество элементов в окне
;теперь делим сдвигом вправо на количество элементов (усредняем значение) ldi zh,5 div: clc ror temp2 ror temp1 dec zh brne div ;все готово - назад в буфер
Кому сколько линий надо. Это один общий даташит. Только обращайте внимание на буквы после номера. Там суть точность и их стоимость чуть разная. Мне 4 канала надо было. Вытащил модуль на С - пошло сразу.
Работает значительно лучше и красивее, чем простое усреднение, потому как не надо времени на накопление данных, в течении которого нет изменения результата на индикаторе.
Обычное среднеарифметическое усреднение с выводом результата при каждом снятии значений АЦП. Пример Спойлер
Код:
#define MAX_LEN_BUFER 128 // размер буфера хранения измерений
unsigned long SUMM_ADC_VALUE=0; // переменная хранения суммы показаний unsigned char SUMM_COUNTS=0; // количество интераций unsigned int ADC_VALUE=0; // переменная хранения значения ADC unsigned int RESULT=0; // переменная среднеарифметического значения ADC
unsigned int ADC_VALUE_BUFFER[MAX_LEN_BUFER]; //кольцевой буфер хранения измерений предназначен для вычисления среднеарифметического
SUMM_ADC_VALUE -= ADC_VALUE_BUFFER[SUMM_COUNTS]; // вычесть из суммы значение кольцевого буфера по указателю SUMM_COUNTS
ADC_VALUE_BUFFER[SUMM_COUNTS] = ADC_VALUE; // записать новое значение в кольцевой буфера по указателю SUMM_COUNTS
SUMM_ADC_VALUE += ADC_VALUE; // накопление в переменную для усреднения
SUMM_COUNTS++; // двигаем указатель
if ( SUMM_COUNTS>= MAX_LEN_BUFER) // если указатель вышел за предел кольцевого буфера { SUMM_COUNTS = 0; // указатель обнулить, в начало кольцевого буфера } RESULT =(SUMM_ADC_VALUE / MAX_LEN_BUFER); // среднеарифметическое значение сумма накопленных значений / количесво операций сложения
Добрый день Всем! А можно так сделать? у меня сильно большие отклонения температуры, никак не удается откалибровать датчик... у него получается нелинейная зависимость .
if (temp_buff==0) temp=1; if (temp_buff==1) temp=2; ............. ............. if (temp_buff==30) temp=34; if (temp_buff > 29 && temp_buff < 35) temp +=5; temp += temp_buff;
у меня сильно большие отклонения температуры, никак не удается откалибровать датчик... у него получается нелинейная зависимость
Эээ... Раз у него нелинейная зависимость, то не проще тогда и использовать "нелинейную" формулу для калибровки? Жизнь не ограничивается ax+c, еще есть ax^2+bx+c, a/(b+x)+c, продолжать можно бесконечно. Просто надо понять что за там нелинейность и выбрать нужное уравнение. Иногда проще использовать таблицу, это да.
Пробовал я подставлять таблицу.... Гемор еще тот Я же точно не знаю какая температура в данный момент... Я знаю примерно температуру от 200 до 400град. а от 0 до 200 не знаю.. Пытался калибровать показаниям паяльной станции . Более менее настроил. Буду высылать заказчику. Пусть замеряет всю шкалу на разбег температуры. Тогда я сразу же и подставлю значения с таблицы
Зависимость термодатчика не понятная.... 3 дня пытался настроить с помощью программного кода и трех подстроечников
я не против по ней шкалу сделать. Вот только как посчитать коэфицыент усиления ОУ и где найти точный документ к датчику? PT1000 5x25 Просто PT1000 нахожу (но не сбегается таблицы). А вот 5х25 что это за маркировка - не понятно...
----------
вернее, как проводить правильно настройку/калибровку термометров? А то я не метролог Я задолбался настраивать усиление... То настроил хорошо в диапазоне 200 - 300. А дальше - каша. То нормально настроил 300 - 400 а все что ниже - бред... При комнатной потом вообще показывает +5 , а в комнате реально +28 ....
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения