Здравствуйте! Очень нужна помощь с созданием прошивки для ATmega16 (на C++).
Задача: реализовать цифровой режекторный фильтр (БИХ,Чебышева 2 рода) на мк AVR. Параметры фильтра: нижняя полоса пропускания 0-30 Гц, верхняя - 220 - 525 Гц, полоса подавления - от 50 до 200 Гц, уровень пульсаций в полосе пропускания - 3 дБ, в полосе подавления - 20 дБ. Фильтр 4 порядка, реализуется в параллельной структуре, билинейное звено - в прямой схеме.
Используются мк ATmega16 и ЦАП MAX504. Есть пример кода, только работать он не хочет, а в чем дело - разобраться не могу.
#include <mega16.h>
//запишем коэффициенты в энергонезависимую память EEPROM
eeprom float b01 = 0.859872,b11 = -1.541836,b21=0.859872,
a11 = -1.3647, a21 = 0.65341,
b02 = 0.859872,b12 = -1.635476,b22=0.85987,
a12 = -1.787, a22 = 0.8389;
double rn,rn1,rn2,y1n,y1n1,y1n2,y2n,y2n1,y2n2;
// Результат преобразования АЦП
unsigned int read_adc()
{
ADCSRA|=0x40; //Регистр управления состоянием АЦП, запуск АЦП
while ((ADCSRA & 0x10)==0); //Ждем завершения преобразования АЦП
ADCSRA|=0x10;
return ADCW;
}
out(double out_var)
{
int vix,i,a[10];
vix = (int)out_var;
for (i=0;i<10;i++) {a[10-i]= vix%10; vix = vix/10;};
PINB.2 = 1;
PIND.0 = a[10]; PIND.1 = a[9];
PIND.2 = a[8]; PIND.3 = a[7];
PIND.4 = a[6]; PIND.5 = a[5];
PIND.6 = a[4]; PIND.7 = a[3];
PINB.0 = a[2]; PINB.1 = a[1];
PINB.2 = 0;
}
void main(void)
{
PORTB=0x00; //Программируем порт В на вывод
DDRB=0xFF;
PORTC=0x00; //С на ввод
DDRC=0x00;
PORTD=0x00; //D на вывод
DDRD=0xFF;
MCUCR=0x00;// прерывания выключены
TIMSK=0x00;
ACSR=0x80; //компаратор выключен
SFIOR=0x00;
ADMUX=0x40; //вход АЦП - ADC0, опорное напряжение - AVcc
ADCSRA=0x85;// Разрешение работы АЦП, частота преобразования 375 кГц
rn = read_adc();
y1n = b01*rn;
y2n = b02*y1n;
out(y2n);
y1n1 = y1n; y2n1 = y2n;
rn1 = rn; rn = read_adc();
y1n = b01*rn+b11*rn1 - a11*y1n1;
y2n = b02*y1n + b12*y1n1 - a12*y2n1;
out(y2n);
while (1)
{
y1n2 = y1n1;
y1n1 = y1n;
rn2 = rn1;
rn1 = rn;
rn = read_adc();
y1n = b01*rn+b11*rn1+b21*rn2-a11*y1n1-a21*y1n2;
y2n2 = y2n1;
y2n1 = y2n;
y2n = b02*y1n+b12*y1n1+b22*y1n2-a12*y2n1-a22*y2n2;
out(y2n);
};
}