Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: mega168 - скачет напряжение с АЦП
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Страницы: 1, 2
oran-be
Почему бы вам не сделать цикличский буффер?

WORD awAdcBuff[16];
WORD wAdcResult;

WORD* pAdcBuff = awAdcBuff;

И в прерывании:

*pAdcBuff = ADC;
pAdcBuff++;
if(pAdcBuff == (awAdcBuff+16)) pAdcBuff = awAdcBuff;

wAdcResult = 0;
for(BYTE i=0; i<16; i++){
wAdcResult += awAdcBuff[i];
}
wAdcResult = wAdcResult/16; //

Как то поприятнее выглядит.
kd_Rash
Цитата(oran-be @ Nov 27 2007, 16:01) *
Почему бы вам не сделать цикличский буффер?


smile.gif
потому что знал, что так можно,
но как - не знал ... до этого момента
Сергей Борщ
Цитата(kd_Rash @ Nov 27 2007, 14:16) *
потому что знал, что так можно,
но как - не знал ... до этого момента
Тогда вот вам еще в копилку - чтобы не высчитывать каждый раз сумму по всему буферу, ее можно считать при занесении значения в буфер:
Код
WORD wAdcSum;
    wAdcSum -= *pAdcBuff
    wAdcSum += (*pAdcBuff = ADC);
    pAdcBuff++;
    if(pAdcBuff == (awAdcBuff + 16))
        pAdcBuff = awAdcBuff;

// там, где нужен результат:
wAdcResult = wAdcSum / 16;
А еще можно заменить константу 16 на (sizeof(awAdcBuff) / sizeof(awAdcBuff[0])) - это позволит задавать размер буфера только в одном месте - при объявлении. А еще - можно этот sizeof() обернуть в удобный макрос:
Код
#define  ELEMENTS(Array)   (sizeof(Array) / sizeof(Array[0]))
WORD awAdcBuff[16];
WORD wAdcResult;
WORD wAdcSum;
WORD* pAdcBuff = awAdcBuff;

    wAdcSum -= *pAdcBuff
    wAdcSum += (*pAdcBuff = ADC);
    pAdcBuff++;
    if(pAdcBuff == (awAdcBuff + ELEMENTS(awAdcBuff) ))
        pAdcBuff = awAdcBuff;

// там, где нужен результат:
wAdcResult = wAdcSum / ELEMENTS(awAdcBuff);
так будет совсем красиво.
alexander55
А еще можно не заносить значение в буфер, а только считать сумму.
А на 16 раз среднее,
обнулять сумму.
А еще можно не проверять счетчик, а делать так
Счетчик &=0xf;
PS. Всегда найдется дело для умелых рук. smile.gif
kd_Rash
ну, спасибо, всем!
Gogan
Цитата(kd_Rash @ Nov 28 2007, 10:07) *
ну, спасибо, всем!

Интересная тема. Расскажу про свой опыт измерений. Я работал только с мега8 и мега16. При измерении сигнала от тензодатчика (0-18мВ) стоял инструментальный усилитель AD620 (дорогой собака - 10$) с коеф.ус.275 и с него на АЦП. В итоге на выходе (рисовал график на компе) получил все наводки - и помехи от силовой аппаратуры (модуляция 8кгц) и синфазные (50гц) на уровне до 10% от максимума (может, конечно, можно было увеличить RC фильтр, но я не стал). Частота контроллера 8мгц, предделитель ацп 128 (максимальный), ацп считает за 13 тактов (по даташиту), в итоге получается около 4800 результатов в секунду (мне необходимо было не меньше 2). В итоге я усреднял каждые 2500 результатов и получил почти идеально гладкий график.

С наводками мне очень сложно бороться, какой бы фильтр не ставил, как бы подальше от силовых проводов не отводил, всеравно прыгает результат довольно значительно.
alexander55
Цитата(Gogan @ Nov 28 2007, 12:20) *
В итоге я усреднял каждые 2500 результатов и получил почти идеально гладкий график.

sqrt(2500)=50
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.