Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

АЦП-ЦАП, где то ошибка

Отправлено nusmarsalex 08 марта 2007 г. 18:24


Всем привет!
Помогите разобраться, пытаюсь научиться использовать МК (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)
}

Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 12:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru