2015-05-15 3 views
1

Я работаю над проектом Recorder and Player. Я хочу реализовать как преобразователи ADC (Analog to Digital), так и DAC (Digital to Analog). Код должен быть реализован в Arduino - Atmega 2560 (Atmel Microcontroller). Я пытался реализовать АЦП и я нашел следующий код:Как реализовать 8-разрядный ЦАП (цифро-аналоговое преобразование) с микроконтроллером Arduino-atmega 2560?

void setup() 
{ 
    Serial.begin (9600); 
    ADCSRA |= ((1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)); 
    ADMUX |=(1<<REFS0); 
    ADCSRA |= (1<<ADEN); 
    ADCSRA |= (1<<ADSC); 
} 

int read_adc(int channel) 
{ 
    ADMUX &=0xE0; 
    ADMUX |= channel & 0x07l; 
    ADCSRB = channel & (1<<ADSC); 
    ADCSRA |= (1<<ADSC); 
    while (ADCSRA & (1<<ADSC)) 
    { 
     return ADCW; 
    } 
} 

void loop() 
{ 
    int w = read_adc(0); 
    Serial.write(w); 
} 

Вот я посылаю оцифрованный сигнал к последовательному порту. У меня есть два вопроса: 1- Как я могу изменить этот код для работы в качестве 8-битного АЦП? 2- Как реализовать ЦАП так же, как раньше? Я имею в виду, как читать цифровой сигнал из последовательного канала, а затем преобразовывать его в аналоговый сигнал, например, алорифм?

Благодарим за помощь.

+1

Arduino Mega 2560 не имеет периферийных устройств ЦАП. Для его реализации потребуется некоторое дополнительное оборудование. И это абсолютно не связано с АЦП. –

+0

Можете ли вы указать, какая версия Arduino имеет периферийное устройство ЦАП? –

+0

Я не уверен, что есть. Но вы можете легко найти Arduino-совместимые прорывные платы с некоторыми типами ЦАП I2C. –

ответ

0

Если ваша плата не имеет ЦАП, вы можете использовать дополнительную ЦАП и просто подключить ее к порту GPIO. Я сделал это в проекте, где я использовал GPIO микроконтроллера CortexM0 и ЦАП для генерации аналогового выхода для двигателя постоянного тока. Вам также может понадобиться opAmp для усиления вывода ЦАП в зависимости от вашего типа приложения.

3

ATMMA2560 не имеет периферийных устройств ЦАП, однако, если требования к пропускной способности относительно низкие, вы можете использовать выход PWM с соответствующей внешней аналоговой фильтрацией для создания переменного выходного напряжения (пропорционального ширине импульса).

Чем выше частота ШИМ, тем выше пропускная способность, тем ниже разрешение, поэтому существует компромисс. Простой низкочастотный RC-фильтр может быть достаточным. В некоторых случаях, например, например, при управлении двигателем с LED или постоянным током, вам вообще не нужна фильтрация, и PWM является более эффективным способом вождения таких нагрузок в любом случае. Тем не менее, для аудиоприложений вам, как правило, требуется фильтрация, за исключением случаев прямого вождения Class D ampifier.

Для реализации 8-разрядного ЦАП вам необходимо настроить PWM на 256 отсчетов за цикл, а затем просто установить ширину импульса от нуля до 255 отсчетов. При адекватном фильтре это приведет к аналоговому напряжению. Чтобы сделать фильтрацию максимально простой, частота PWM должна быть как можно выше, а частота отсечки фильтра установлена ​​как минимум на половину этой частоты, а лучше меньше f/5 или более. Это определит вашу полосу пропускания аудио. Для речи 3Khz соответствует адекватному (качество телефона); 4,5 кГц - это качество радио AM, а 15 кГц - радио FM/HiFi.

Существует ряд оперативных ресурсов, посвященных использованию PWM в качестве ЦАП и необходимой фильтрации; например http://ltwiki.org/images/8/82/PWM_Filters.pdf

+1

Причина, по которой очень мало MCU с DAC на борту, объясняется тем, что способ PWM, как описано в этом ответе, обычно является достаточным и всегда более экономичным. Если вам нужен фактический чип ЦАП, вы, вероятно, выполняете некоторую довольно продвинутую обработку сигналов, для чего в любом случае вы не будете использовать 8-битный MCU/Arduino. – Lundin

0

Существует несколько устройств ЦАП, которые работают с входами шины SPI на рынке, от 8 до 16 бит (и более). Я рассмотрел все альтернативы, и IMHO лучшим компромиссом между ценой и разрешением является серия MCP4xxx.

В Adafruit имеется плата MCP4921, которая легко доступна для обеспечения 12-битного одиночного канала. I've chosen to use the MCP4822 для обеспечения 12-битного разрешения с двумя каналами. Серии MCP48xx также имеет внутренний источник опорного напряжения, который обеспечивает стабильное выходное напряжение в условиях переменного напряжения питания. Это менее гибко, чем серия MCP49xx, где используется внешний Vref.

Из-за цифрового шума на источниках питания AVR (Arduino), которые обычно превышают 20 мВ, использование более 12 бит разрешения (1 мВ LSB), похоже, не дает большей точности. Также 16-разрядные ЦАП стоят значительно больше, чем диапазон MCP4xxx.

Если вам нужен выходной сигнал с поддержкой DC, имеет смысл использовать OpAmp для буферизации ЦАП.Альтернативно, если AC - это все, что вам нужно (аудио), тогда есть cheap headphone amplifiers, которые отлично справляются с работой в качестве буфера.

Если вам нужна шина AVR SPI в качестве источника данных (например, карта uSD), а источник работает медленно, вы можете use a USART port on the ATmega2560 in MSPI Mode управлять ЦАП с использованием прерывания без нарушения основного интерфейса SPI.

Вот моментальный снимок аналогового интерфейса, реализованного на платформе ATmega1284p, с которой мне удобно.

Goldilocks Analogue Schematic

The DAC.h code можно найти на SourceForge в AVRfreeRTOS.