|
Усреднение вычислений АЦП |
|
|
|
Jan 10 2009, 05:35
|
Участник

Группа: Участник
Сообщений: 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 вычислений,но все равно не так сглаженно получается.
|
|
|
|
|
 |
Ответов
|
Jan 21 2009, 16:05
|

Профессионал
    
Группа: Участник
Сообщений: 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. То есть из считанного значения вычитаем текущее, делим на коэффициент и прибавляем к текущему. Плавающая точка здесь ни к чему, в целых числах тоже можно считать, правда там есть свои тонкости.
|
|
|
|
|
Feb 13 2009, 07:09
|

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

|
Цитата(777777 @ Jan 21 2009, 19:05)  T_average += (T_current - T_average) / 20.0.
То есть из считанного значения вычитаем текущее, делим на коэффициент и прибавляем к текущему. Плавающая точка здесь ни к чему, в целых числах тоже можно считать, правда там есть свои тонкости. Вот, именно - тонкости! Представьте, что разность между считанным и текущим значениями - меньше двадцати. Что получим? По этой же причине у автора вопроса и прыгают значения: в первом топике он привёл код, якобы усредняющий из двадцати значений... Имхо, сумма подсчитывается из значений измерений делённых на 5 - так усреднять, мягко говоря, не корректно.
|
|
|
|
|
Feb 13 2009, 11:55
|

Профессионал
    
Группа: Участник
Сообщений: 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
|
|
|
|
|
Feb 13 2009, 12:59
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|