Плывут показания АЦП Atmega8A - PU

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Плывут показания АЦП Atmega8A - PU

Сообщение ploop »

Если нужен настоящий ФНЧ (а не усреднение) советую почитать: http://we.easyelectronics.ru/drvlas/pro ... yadka.html
Реклама
Аватара пользователя
saschai
Говорящий с текстолитом
Сообщения: 1596
Зарегистрирован: Вс дек 14, 2008 20:36:47
Откуда: SPb

Re: Плывут показания АЦП Atmega8A - PU

Сообщение saschai »

Хочу 2секунды делать десяток замеров а потом вычислять результат

Не знаю, насколько критично по ТЗ, может не стоит городить лишнее, а делать один замер в 2-3 сек.
Реклама
Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Re: Плывут показания АЦП Atmega8A - PU

Сообщение Artos »

saschai писал(а):Не знаю, насколько критично по ТЗ, может не стоит городить лишнее, а делать один замер в 2-3 сек.


Пробовал, хрень самая настоящая :)
orinoko

Re: Плывут показания АЦП Atmega8A - PU

Сообщение orinoko »

ploop писал(а):Если нужен настоящий ФНЧ (а не усреднение) советую почитать: http://we.easyelectronics.ru/drvlas/pro ... yadka.html
Сорри, но вроде бы у меня так и реализовывается, только другими словами
Реклама
Эиком - электронные компоненты и радиодетали
Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Re: Плывут показания АЦП Atmega8A - PU

Сообщение Artos »

Сделал так:
40 выборок в течении 2секунд
потом деление на 40.
Работает более чем классно!
Осталось только сделать табличную подстановку.
У кого есть пример кода на СИ?

PS: Молодцы ребята! Помогаете дружно! Так держать! Форум отличный!! Ни где так оперативно не отвечают когда надо помощь :)
Реклама
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Плывут показания АЦП Atmega8A - PU

Сообщение Jack_A »

Да, но тут водятся зануды, которые трындят, что нигде пишется слитно . :) :)

И можно делать не 40, а 32 выборки, и не надо никакого деленя, а только 5 сдвигов.
Реклама
Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Re: Плывут показания АЦП Atmega8A - PU

Сообщение Artos »

Jack_A писал(а): что нигде пишется слитно . :) :)


Точно :)

Но! Я ведь Украинец, и в школе не любил учить Русский язык. Вот отсюда и такая безграмотность..
Но я исправлюсь :)
Аватара пользователя
minakan
Поставщик валерьянки для Кота
Сообщения: 2209
Зарегистрирован: Вт июл 27, 2010 11:31:59
Откуда: Кххх

Re: Плывут показания АЦП Atmega8A - PU

Сообщение minakan »

У микрочипов есть симпатичные опоры (MCP1541), 12 разрядные ацп MCP3204.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Плывут показания АЦП Atmega8A - PU

Сообщение ploop »

orinoko писал(а):
ploop писал(а):Если нужен настоящий ФНЧ (а не усреднение) советую почитать: http://we.easyelectronics.ru/drvlas/pro ... yadka.html
Сорри, но вроде бы у меня так и реализовывается, только другими словами

Так я автору темы советовал почитать, а не вам :)
Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Re: Плывут показания АЦП Atmega8A - PU

Сообщение Artos »

minakan писал(а):У микрочипов есть симпатичные опоры (MCP1541), 12 разрядные ацп MCP3204.

А мне вот такой нравится ЧИПик: MCP3201
Спасибо за информацию! :)
eufs
Опытный кот
Сообщения: 772
Зарегистрирован: Вс апр 10, 2011 02:24:06
Откуда: г.Северодонецк

Re: Плывут показания АЦП Atmega8A - PU

Сообщение eufs »

Есть алгоритм оконного фильтра, который работает более эффективно, чем простое усреднение.
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    ;количество элементов в окне
      
      clr temp1
      clr temp2
summ:
      ld temp3,y+
      add temp1,temp3
      ld temp3,y+
      adc temp2,temp3
   
      dec zh
      brne summ

;теперь делим сдвигом вправо на количество элементов (усредняем значение)
      ldi zh,5
div:
      clc
      ror temp2
      ror temp1
      dec zh
      brne div
;все готово - назад в буфер

      mov buf_adc_h,temp2
      mov buf_adc_l,temp1
      ret

C0FFEE=‭12648430‬
Аватара пользователя
minakan
Поставщик валерьянки для Кота
Сообщения: 2209
Зарегистрирован: Вт июл 27, 2010 11:31:59
Откуда: Кххх

Re: Плывут показания АЦП Atmega8A - PU

Сообщение minakan »

Artos писал(а):А мне вот такой нравится ЧИПик: MCP3201

Кому сколько линий надо. Это один общий даташит. Только обращайте внимание на буквы после номера. Там суть точность и их стоимость чуть разная.
Мне 4 канала надо было. Вытащил модуль на С - пошло сразу.
phanis
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский
Контактная информация:

Re: Плывут показания АЦП Atmega8A - PU

Сообщение phanis »

eufs писал(а):Работает значительно лучше и красивее, чем простое усреднение, потому как не надо времени на накопление данных, в течении которого нет изменения результата на индикаторе.

Обычное среднеарифметическое усреднение с выводом результата при каждом снятии значений АЦП. Пример
Спойлер

Код: Выделить всё

#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);            // среднеарифметическое значение  сумма накопленных значений / количесво операций сложения
 
Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Re: Плывут показания АЦП Atmega8A - PU

Сообщение Artos »

Добрый день Всем!
А можно так сделать?
у меня сильно большие отклонения температуры, никак не удается откалибровать датчик... у него получается нелинейная зависимость .

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;
phanis
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский
Контактная информация:

Re: Плывут показания АЦП Atmega8A - PU

Сообщение phanis »

не проще тогда таблицу использовать.
Спойлер

Код: Выделить всё

flash unsigned int temper[]=
{
0,1,2,3,4,5,6,7,8,9,
11,13,16,19,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
350,354,358,360,400,450
};
//доступ так
 temp = temper[temp_buff];

Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Re: Плывут показания АЦП Atmega8A - PU

Сообщение Artos »

phanis писал(а):не проще тогда таблицу использовать.


Спасибище Вам огромное!!!! Это отличный вариант! Буду пробовать ;)
Аватара пользователя
menzoda
Вымогатель припоя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Re: Плывут показания АЦП Atmega8A - PU

Сообщение menzoda »

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

Эээ... Раз у него нелинейная зависимость, то не проще тогда и использовать "нелинейную" формулу для калибровки? Жизнь не ограничивается ax+c, еще есть ax^2+bx+c, a/(b+x)+c, продолжать можно бесконечно. Просто надо понять что за там нелинейность и выбрать нужное уравнение. Иногда проще использовать таблицу, это да.
Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Re: Плывут показания АЦП Atmega8A - PU

Сообщение Artos »

Пробовал я подставлять таблицу.... Гемор еще тот :( Я же точно не знаю какая температура в данный момент... Я знаю примерно температуру от 200 до 400град. а от 0 до 200 не знаю..
Пытался калибровать показаниям паяльной станции . Более менее настроил. Буду высылать заказчику. Пусть замеряет всю шкалу на разбег температуры. Тогда я сразу же и подставлю значения с таблицы :)

Зависимость термодатчика не понятная.... 3 дня пытался настроить с помощью программного кода и трех подстроечников :))
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Плывут показания АЦП Atmega8A - PU

Сообщение ploop »

Вообще в документации на датчик должен быть график зависимости. По нему и стройте таблицу.
Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Re: Плывут показания АЦП Atmega8A - PU

Сообщение Artos »

я не против по ней шкалу сделать. Вот только как посчитать коэфицыент усиления ОУ и где найти точный документ к датчику? PT1000 5x25 Просто PT1000 нахожу (но не сбегается таблицы). А вот 5х25 что это за маркировка - не понятно...

----------

вернее, как проводить правильно настройку/калибровку термометров? А то я не метролог :)
Я задолбался настраивать усиление... То настроил хорошо в диапазоне 200 - 300. А дальше - каша.
То нормально настроил 300 - 400 а все что ниже - бред...
При комнатной потом вообще показывает +5 , а в комнате реально +28 ....
Ответить

Вернуться в «AVR»