Написал код для фильтра простого скользящего среднего. Покритикуйте, пожалуйста, мож что не правильно. Перед прошивкой хорошоб от ошибок избавиться (кол-во сэмплов avgLenght) буду подбирать на месте, практически. На этой неделе цель оцифровать сигнал без фильтра, с аналоговым rc. и передать по uart на комп (записать в файл, например эксель, если получится, пока не знаю как

) Хорошо б и цифровой опробовать.
ЗЫ: Обрабатываю пока первую картинку.
CODE
#include <mega16.h>
#include <delay.h>
#include <stdio.h>
unsigned char i = 0;
float adc_data_volt;
const float k = 0.0025;
int avgLenght = 30;
float mass[avgLenght];
//Ring initialisation service routing
void initRing ()
{
unsigned int i;
for (i = 0; i < avgLenght; i++);
{
mass[i] = 0;
}
}
//Filter service routing
float movingAverage (float data_in)
{
static int i = 0;
int j,k;
float avg = 0.0;
int indexBegin = (i - avgLenght) < 0 ? 0 : (i - avgLenght);
for (k = indexBegin; k < (avgLenght - 1); k++)
{
mass[k] = mass[k+1];
}
mass[avgLenght-1] = data_in;
for (j = 0; j < avgLenght; j++)
{
avg += mass[j];
}
i++;
return avg = avg/avgLenght;
}
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
i++;
if (i == 3) {
i = 0;
ADCSRA = 0xCE;
};
}
#define ADC_VREF_TYPE 0xC0
//#define NON_FILTER
#define D_FILTER
#ifdef NON_FILTER
// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
unsigned int adc_data;
// Read the AD conversion result
adc_data = ADCW;
adc_data_volt = adc_data*k;
printf ("%f; ", adc_data_volt);
}
#endif
#ifdef D_FILTER
interrupt [ADC_INT] void adc_isr(void)
{
unsigned int adc_data;
float data_out;
// Read the AD conversion result
adc_data = ADCW;
adc_data_volt = adc_data*k;
data_out = movingAverage(adc_data_volt);
printf ("%f; ", data_out);
}
#endif
Сообщение отредактировал roman_golovenkov - May 14 2011, 22:16