Плывут показания АЦП Atmega8A - PU
Re: Плывут показания АЦП Atmega8A - PU
Если нужен настоящий ФНЧ (а не усреднение) советую почитать: http://we.easyelectronics.ru/drvlas/pro ... yadka.html
- Реклама
- saschai
- Говорящий с текстолитом
- Сообщения: 1596
- Зарегистрирован: Вс дек 14, 2008 20:36:47
- Откуда: SPb
Re: Плывут показания АЦП Atmega8A - PU
Хочу 2секунды делать десяток замеров а потом вычислять результат
Не знаю, насколько критично по ТЗ, может не стоит городить лишнее, а делать один замер в 2-3 сек.
- Реклама
гостевая2
-
Artos
- Встал на лапы
- Сообщения: 108
- Зарегистрирован: Пт мар 04, 2011 13:06:42
- Откуда: Украина, Ахтырка
- Контактная информация:
Re: Плывут показания АЦП Atmega8A - PU
saschai писал(а):Не знаю, насколько критично по ТЗ, может не стоит городить лишнее, а делать один замер в 2-3 сек.
Пробовал, хрень самая настоящая
-
orinoko
Re: Плывут показания АЦП Atmega8A - PU
Сорри, но вроде бы у меня так и реализовывается, только другими словамиploop писал(а):Если нужен настоящий ФНЧ (а не усреднение) советую почитать: http://we.easyelectronics.ru/drvlas/pro ... yadka.html
-
Artos
- Встал на лапы
- Сообщения: 108
- Зарегистрирован: Пт мар 04, 2011 13:06:42
- Откуда: Украина, Ахтырка
- Контактная информация:
Re: Плывут показания АЦП Atmega8A - PU
Сделал так:
40 выборок в течении 2секунд
потом деление на 40.
Работает более чем классно!
Осталось только сделать табличную подстановку.
У кого есть пример кода на СИ?
PS: Молодцы ребята! Помогаете дружно! Так держать! Форум отличный!! Ни где так оперативно не отвечают когда надо помощь
40 выборок в течении 2секунд
потом деление на 40.
Работает более чем классно!
Осталось только сделать табличную подстановку.
У кого есть пример кода на СИ?
PS: Молодцы ребята! Помогаете дружно! Так держать! Форум отличный!! Ни где так оперативно не отвечают когда надо помощь
- Реклама
гостеваая 3
Re: Плывут показания АЦП Atmega8A - PU
Да, но тут водятся зануды, которые трындят, что нигде пишется слитно .

И можно делать не 40, а 32 выборки, и не надо никакого деленя, а только 5 сдвигов.
И можно делать не 40, а 32 выборки, и не надо никакого деленя, а только 5 сдвигов.
-
Artos
- Встал на лапы
- Сообщения: 108
- Зарегистрирован: Пт мар 04, 2011 13:06:42
- Откуда: Украина, Ахтырка
- Контактная информация:
Re: Плывут показания АЦП Atmega8A - PU
Jack_A писал(а): что нигде пишется слитно .![]()
Точно
Но! Я ведь Украинец, и в школе не любил учить Русский язык. Вот отсюда и такая безграмотность..
Но я исправлюсь
- minakan
- Поставщик валерьянки для Кота
- Сообщения: 2209
- Зарегистрирован: Вт июл 27, 2010 11:31:59
- Откуда: Кххх
Re: Плывут показания АЦП Atmega8A - PU
У микрочипов есть симпатичные опоры (MCP1541), 12 разрядные ацп MCP3204.
Re: Плывут показания АЦП Atmega8A - PU
orinoko писал(а):Сорри, но вроде бы у меня так и реализовывается, только другими словамиploop писал(а):Если нужен настоящий ФНЧ (а не усреднение) советую почитать: http://we.easyelectronics.ru/drvlas/pro ... yadka.html
Так я автору темы советовал почитать, а не вам
-
Artos
- Встал на лапы
- Сообщения: 108
- Зарегистрирован: Пт мар 04, 2011 13:06:42
- Откуда: Украина, Ахтырка
- Контактная информация:
Re: Плывут показания АЦП Atmega8A - PU
minakan писал(а):У микрочипов есть симпатичные опоры (MCP1541), 12 разрядные ацп MCP3204.
А мне вот такой нравится ЧИПик: MCP3201
Спасибо за информацию!
Re: Плывут показания АЦП Atmega8A - PU
Есть алгоритм оконного фильтра, который работает более эффективно, чем простое усреднение.
1. Определяем в оперативной памяти место под хранение данных от АЦП. Оптимально 16 или 32. При 10 битном АЦП понадобится соответственно 32 или 64 байта - это так называемое окно.
2. Каждое значение перед записью в оперативную память проверяем на максимальное отклонение (дельту) от уже подсчитанного отфильтрованного значения. Если оно сильно отличается - на стек не помещаем - то есть проводим отбраковку.
3. Сдвигаем информацию в окне - самое старое затираем следующим и так далее и помещаем в начало окна вновь поступившее значение.
4. Считаем среднее значение в окне
Достоинства - высокая помехозащищенность, высокое быстродействие при хорошей фильтрации. Недостаток - надо много места в ОЗУ для окна.
Например в обработке данных от тензодатчика в весах - вообще незаменимая вещь. Работает значительно лучше и красивее, чем простое усреднение, потому как не надо времени на накопление данных, в течении которого нет изменения результата на индикаторе.
Пункт 2 можно и не делать, как у меня:
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
Artos писал(а):А мне вот такой нравится ЧИПик: MCP3201
Кому сколько линий надо. Это один общий даташит. Только обращайте внимание на буквы после номера. Там суть точность и их стоимость чуть разная.
Мне 4 канала надо было. Вытащил модуль на С - пошло сразу.
-
phanis
- Вымогатель припоя
- Сообщения: 513
- Зарегистрирован: Сб фев 19, 2011 18:04:08
- Откуда: Татарстан, пос. Актюбинский
- Контактная информация:
Re: Плывут показания АЦП Atmega8A - PU
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
Добрый день Всем!
А можно так сделать?
у меня сильно большие отклонения температуры, никак не удается откалибровать датчик... у него получается нелинейная зависимость .
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;
А можно так сделать?
у меня сильно большие отклонения температуры, никак не удается откалибровать датчик... у него получается нелинейная зависимость .
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
не проще тогда таблицу использовать.
Спойлер
Код: Выделить всё
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
phanis писал(а):не проще тогда таблицу использовать.
Спасибище Вам огромное!!!! Это отличный вариант! Буду пробовать
Re: Плывут показания АЦП Atmega8A - PU
Artos писал(а):у меня сильно большие отклонения температуры, никак не удается откалибровать датчик... у него получается нелинейная зависимость
Эээ... Раз у него нелинейная зависимость, то не проще тогда и использовать "нелинейную" формулу для калибровки? Жизнь не ограничивается ax+c, еще есть ax^2+bx+c, a/(b+x)+c, продолжать можно бесконечно. Просто надо понять что за там нелинейность и выбрать нужное уравнение. Иногда проще использовать таблицу, это да.
-
Artos
- Встал на лапы
- Сообщения: 108
- Зарегистрирован: Пт мар 04, 2011 13:06:42
- Откуда: Украина, Ахтырка
- Контактная информация:
Re: Плывут показания АЦП Atmega8A - PU
Пробовал я подставлять таблицу.... Гемор еще тот
Я же точно не знаю какая температура в данный момент... Я знаю примерно температуру от 200 до 400град. а от 0 до 200 не знаю..
Пытался калибровать показаниям паяльной станции . Более менее настроил. Буду высылать заказчику. Пусть замеряет всю шкалу на разбег температуры. Тогда я сразу же и подставлю значения с таблицы
Зависимость термодатчика не понятная.... 3 дня пытался настроить с помощью программного кода и трех подстроечников
Пытался калибровать показаниям паяльной станции . Более менее настроил. Буду высылать заказчику. Пусть замеряет всю шкалу на разбег температуры. Тогда я сразу же и подставлю значения с таблицы
Зависимость термодатчика не понятная.... 3 дня пытался настроить с помощью программного кода и трех подстроечников
Re: Плывут показания АЦП Atmega8A - PU
Вообще в документации на датчик должен быть график зависимости. По нему и стройте таблицу.
-
Artos
- Встал на лапы
- Сообщения: 108
- Зарегистрирован: Пт мар 04, 2011 13:06:42
- Откуда: Украина, Ахтырка
- Контактная информация:
Re: Плывут показания АЦП Atmega8A - PU
я не против по ней шкалу сделать. Вот только как посчитать коэфицыент усиления ОУ и где найти точный документ к датчику? PT1000 5x25 Просто PT1000 нахожу (но не сбегается таблицы). А вот 5х25 что это за маркировка - не понятно...
----------
вернее, как проводить правильно настройку/калибровку термометров? А то я не метролог
Я задолбался настраивать усиление... То настроил хорошо в диапазоне 200 - 300. А дальше - каша.
То нормально настроил 300 - 400 а все что ниже - бред...
При комнатной потом вообще показывает +5 , а в комнате реально +28 ....
----------
вернее, как проводить правильно настройку/калибровку термометров? А то я не метролог
Я задолбался настраивать усиление... То настроил хорошо в диапазоне 200 - 300. А дальше - каша.
То нормально настроил 300 - 400 а все что ниже - бред...
При комнатной потом вообще показывает +5 , а в комнате реально +28 ....