Всем привет! Помогите разобраться, пытаюсь научиться использовать МК (ATmega16) в качестве АЦП/ЦАП. Собрал схемку по "Цифровое устройство записи речи, использующее технологию AVR и последовательную память DataFlash", на входе подключил стандартный микрофон для ПК, выход - к колонкам ПК. Микрофон питаю от +9V (DC). Один LM324 используется как для Микрофона, так и для динамика. Частота МК от кварца 16МГц, 10-ти разрядный АЦП, Vref=3.5V, Timer0 - в режиме быстрой ШИМ, частота выборок АЦП = 9615 Гц (пробовал и другие частоты), частота ШИМ =31250 Гц (другие тоже пробовал). Напряжение смещения на LM324 = 2,5V, коэфициент усиления =100. В работе: при отсутствии входного сигнала (тишина) значения напряжение АС: на вх. 2 LM324 = 65mV, на вых.1 = 1,804...1,836 V, на вых.14 = 1,643 ...1,688V, на вых.ШИМ (PB3) = 2,293...2,330V. при наличии входного сигнала напряжение АС : вх.2 = более 100 mV, вых.1 = падает до уровня 1,690V. вых.14 = на уровне 1,400V, вых.ШИМ = на уровне 2,150V. Макет вроде работает: в калонках слышу то что сказал в микрофон, правда, не совсем разборчиво и слишком много шума. Шум какой-то многочастотный (и низкие слышны и высокие "пищат"). Смена частоты выборок и ШИМ почти не влияет на ситуацию (какие-то частоты не шумят конечно, но в целом шумно). В орегигенале (у автора) выходной фильтр настроен под 15686 Гц (как выборки, так и ШИМ), может причина в этом. Но я частоты менял, неужели настройка такая тонкая должна быть.
Очень буду признателен, если поможете справиться с этим, подскажете где ошибка кроется (может в настройке фильтров или же в прошивке что-то попутал). Заранее спасибо.
Прошивка в МК следующая: #include #include #define ADC_VREF_TYPE 0x00
// Declare your global variables here unsigned int adc_data;
// Timer 0 overflow interrupt service routine interrupt [TIM0_OVF] void timer0_ovf_isr(void) { OCR0=adc_data; }
// ADC interrupt service routine interrupt [ADC_INT] void adc_isr(void) { adc_data=ADCW; TCCR0=0x78;// Stop counter OCR0=adc_data; TCCR0=0x79;//Start counter }
void main(void) { // Input/Output Ports initialization // Port A initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTA=0x00; DDRA=0x00;
// Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=0 State2=T State1=T State0=T PORTB=0x00; DDRB=0x08;
// Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Fast PWM top=FFh // OC0 output: Inverted PWM TCCR0=0x78; // bx01101001 TCNT0=0x00; OCR0=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x01;
// ADC initialization // ADC Clock frequency: 250,000 kHz // ADC Voltage Reference: AREF pin // ADC Auto Trigger Source: Free Running ADMUX=ADC_VREF_TYPE; ADCSRA=0xAE; //bx10101110 SFIOR&=0x1F;
#asm("sei")// Global enable interrupts ADCSRA|=0x40; //Start first conversion (bx01000000)
while (1) }
|