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

 
 
> Усреднение вычислений АЦП
Wantcan
сообщение Jan 10 2009, 05:35
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 11-12-08
Из: Earth
Пользователь №: 42 366



Подскажите хороший алгоритм для усреднения вычислений АЦП,я сделал так-
Код
// Read the 8 most significant bits
// of the AD conversion result
unsigned char read_adc(unsigned char adc_input){
ADMUX=adc_input|ADC_VREF_TYPE;
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCH;}

while (1){....

   ta++;if(ta==21)ta=0;
   tempADC=(read_adc(0)/5);
   tempADC1=tempADC+(read_adc(0)/5);                  
   if(ta==20)temp=tempADC1/2;tempADC=0;tempADC1=0;
т.е. показывать на индикаторе среднее число из 20 вычислений,но все равно не так сглаженно получается.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Папа Карло
сообщение Jan 21 2009, 15:16
Сообщение #2


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

Группа: Новичок
Сообщений: 176
Регистрация: 15-02-08
Из: Москва
Пользователь №: 35 074



Возник вопрос по формуле T_average = T_average + (T_current - T_average) / 20.0.

Если я правильно понял, то первое значение лучше сразу занести в переменную T_average.
А если не записать, то показания будут нарастать в зависимости от кол-ва отсчётов ?
Go to the top of the page
 
+Quote Post
777777
сообщение Jan 21 2009, 16:05
Сообщение #3


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

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(Папа Карло @ Jan 21 2009, 18:16) *
Возник вопрос по формуле T_average = T_average + (T_current - T_average) / 20.0.

Если я правильно понял, то первое значение лучше сразу занести в переменную T_average.
А если не записать, то показания будут нарастать в зависимости от кол-ва отсчётов ?

Да, лучше инициализировать не нулем, а первым считанным значением, тогда фильтру не придется долго выходить на установившееся значение. А формулу лучше представить в сишном виде, даже если будешь реализовывать ее на ассемблере, легче для понимания:

T_average += (T_current - T_average) / 20.0.

То есть из считанного значения вычитаем текущее, делим на коэффициент и прибавляем к текущему. Плавающая точка здесь ни к чему, в целых числах тоже можно считать, правда там есть свои тонкости.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Feb 13 2009, 07:09
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(777777 @ Jan 21 2009, 19:05) *
T_average += (T_current - T_average) / 20.0.

То есть из считанного значения вычитаем текущее, делим на коэффициент и прибавляем к текущему. Плавающая точка здесь ни к чему, в целых числах тоже можно считать, правда там есть свои тонкости.
Вот, именно - тонкости! Представьте, что разность между считанным и текущим значениями - меньше двадцати. Что получим? По этой же причине у автора вопроса и прыгают значения: в первом топике он привёл код, якобы усредняющий из двадцати значений... Имхо, сумма подсчитывается из значений измерений делённых на 5 - так усреднять, мягко говоря, не корректно.
Go to the top of the page
 
+Quote Post
777777
сообщение Feb 13 2009, 11:55
Сообщение #5


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

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(Палыч @ Feb 13 2009, 10:09) *
Вот, именно - тонкости! Представьте, что разность между считанным и текущим значениями - меньше двадцати. Что получим?

Получим, что результат никогда не достигнет входного значения. Но ведь и реальная, математическая экспонента никогда его не достигает! Вопрос лишь в необходимой точности. Если нужна большая - результат храним в long, а используем в качестве результата старшую половину - то есть как бы число с фиксированной точкой, в котором младшие 16 разрядов дробные.
Цитата(Палыч @ Feb 13 2009, 10:09) *
По этой же причине у автора вопроса и прыгают значения: в первом топике он привёл код, якобы усредняющий из двадцати значений... Имхо, сумма подсчитывается из значений измерений делённых на 5 - так усреднять, мягко говоря, не корректно.

Почему? Просто результат будет в 4 раза больше.

Цитата(Палыч @ Feb 13 2009, 10:09) *
По этой же причине у автора вопроса и прыгают значения: в первом топике он привёл код, якобы усредняющий из двадцати значений... Имхо, сумма подсчитывается из значений измерений делённых на 5 - так усреднять, мягко говоря, не корректно.

Пардон, не доглядел - конечно же надо сначала суммировать 20 значений, а результат делить на 5. А еще лучше - использовать степень двойки.

Сообщение отредактировал 777777 - Feb 13 2009, 12:00
Go to the top of the page
 
+Quote Post
Палыч
сообщение Feb 13 2009, 12:59
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(777777 @ Feb 13 2009, 14:55) *
Получим, что результат никогда не достигнет входного значения. Но ведь и реальная, математическая экспонента никогда его не достигает! Вопрос лишь в необходимой точности.
Математическая экспанента хотя бы стремиться к нему. В Вашем же случае мы будем иметь постоянную ошибку. Результат этого - всё тот же - отбрасывание остатка при делении, который тем больше, чем больше делитель (это - ведь, наверное, и есть те тонкости, о которых Вы говорили выше). Тогда, уж лучше что-нибудь такое:

Инициализация переменной
T_average_tmp = T_current * N
...................
T_average_tmp += (T_current - T_average)
T_average= T_average_tmp / N

Последнюю строчку, может быть, записать даже так:
T_average= (T_average_tmp + N/2) / N
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Wantcan   Усреднение вычислений АЦП   Jan 10 2009, 05:35
- - rvk   Конечно не сглаженно, потому что Вы сняв двадцать ...   Jan 10 2009, 05:57
|- - Demeny   Цитата(rvk @ Jan 10 2009, 08:57) Продвину...   Jan 10 2009, 18:33
|- - rezident   Цитата(Demeny @ Jan 10 2009, 23:33) Этот ...   Jan 10 2009, 18:55
||- - Demeny   Цитата(rezident @ Jan 10 2009, 21:55) Воо...   Jan 10 2009, 19:42
|||- - rezident   Цитата(Demeny @ Jan 11 2009, 00:42) Конеч...   Jan 10 2009, 20:26
|||- - Demeny   Цитата(rezident @ Jan 10 2009, 23:26) Да ...   Jan 11 2009, 07:46
|||- - rezident   Цитата(Demeny @ Jan 11 2009, 12:46) Кстат...   Jan 11 2009, 17:04
|||- - Tanya   Цитата(rezident @ Jan 11 2009, 20:04) Для...   Jan 12 2009, 08:02
|||- - 777777   Цитата(rezident @ Jan 11 2009, 20:04) Дей...   Jan 12 2009, 12:44
|||- - demiurg_spb   Цитата(rezident @ Jan 11 2009, 20:04) Для...   Jan 16 2009, 16:04
||- - 777777   Цитата(rezident @ Jan 10 2009, 21:55) Воо...   Jan 11 2009, 07:53
||- - Microwatt   Цитата(777777 @ Jan 11 2009, 11:53) Смысл...   Jan 11 2009, 09:03
||- - 777777   Цитата(Microwatt @ Jan 11 2009, 12:03) Ин...   Jan 11 2009, 11:28
|- - rvk   Цитата(Demeny @ Jan 10 2009, 21:33) Вот п...   Jan 10 2009, 19:02
- - Wantcan   ЦитатаИ кстати складываете Вы двадцать значений, а...   Jan 10 2009, 06:12
- - rvk   Ну используйте вместо for вложенный цикл while: t...   Jan 10 2009, 06:19
- - Alex11   Есть еще один способ получить скользящее среднее. ...   Jan 10 2009, 09:27
|- - Herz   Цитата(Alex11 @ Jan 10 2009, 11:27) Есть ...   Jan 10 2009, 11:20
- - Wantcan   С последним способом у меня не получилось-цифры ск...   Jan 10 2009, 10:52
- - rvk   Не забывайте только про переполнение temp. Если зн...   Jan 10 2009, 11:23
|- - rezident   Цитата(rvk @ Jan 10 2009, 16:23) Чтобы с ...   Jan 10 2009, 11:34
- - 777777   Цитата(Wantcan @ Jan 10 2009, 08:35) Подс...   Jan 11 2009, 07:46
- - Wantcan   Спасибо за все ответы,на этой неделе не будет врем...   Jan 11 2009, 16:59
|- - 777777   Цитата(Палыч @ Feb 13 2009, 15:59) Матема...   Feb 14 2009, 11:18
|- - ReAl   Цитата(777777 @ Feb 14 2009, 13:18) Тогда...   Feb 14 2009, 15:07
- - haker_fox   Хочу сказать, что для фильтрации данных с АЦП прим...   Jan 23 2009, 15:38
- - Wantcan   haker_fox, прошу тнуть пальцем в то место форума,о...   Feb 12 2009, 17:53
|- - 777777   Цитата(Wantcan @ Feb 12 2009, 20:53) hake...   Feb 13 2009, 06:15
|- - blackfin   Цитата(777777 @ Feb 13 2009, 09:15) То ес...   Feb 13 2009, 06:26
|- - Tanya   Цитата(blackfin @ Feb 13 2009, 09:26) Так...   Feb 13 2009, 07:05
|- - 777777   Цитата(blackfin @ Feb 13 2009, 09:26) Так...   Feb 13 2009, 11:40
|- - blackfin   Цитата(777777 @ Feb 13 2009, 14:40) Да, н...   Feb 13 2009, 11:46
- - xemul   Цитата(Палыч @ Feb 13 2009, 15:59) ... По...   Feb 13 2009, 14:08
- - Wantcan   Пожалуйста,помогите переделать найденный на этом ф...   Mar 2 2009, 16:57
- - Wantcan   Остановился на таком варианте Код ta++; if(ta=...   Mar 16 2009, 11:10
- - Флюктуация ваккума   Нужно создать в оперативной памяти закольцованный ...   Aug 15 2015, 12:22
- - Bronislav   Такой вариант не подойдет? for(i=0;i<20;i++) ...   Sep 4 2015, 06:15


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

 


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


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