Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УП МПУ-13.doc
Скачиваний:
3
Добавлен:
01.04.2025
Размер:
5.78 Mб
Скачать

6.4. Встроенный цап

Цифро-аналоговое преобразование - вывод непрерывного во времени сигнала с уровнем, пропорциональным численному значению выходного сигнала u(t) = n* Uref / 2**N, где Uref задает диапазон пропорциональности, N - разрядность.

Для преобразования числа в уровень используются резиствная матрици и набор аналоговых ключей. Непрерывность обеспечивается регистром данных, выходы которого управляют ключами (и небольшим RC-фильтром на выходе). Время преобразования определяется быстродействием цифровой части и временем установления в аналоговой цепи, на практике оно составляет единицы - доли микросекунд.

ЦАП до недавнего времени не были распространены в МК, что связано с повышенными требованями к питанию качественных аналоговых узлов при повышенной разрядности (более 12). Современным лидером в области встроенных в МК ЦАП (да и АЦП) является фирма Analog Devices с семейством MicroConverter с ядрами 8-разрядных (С51/52) и 32-разрядных (ARM7) микроконтроллеров.

В усовершенствованном подсемействе ATxmega (семейства AVR-8) появились встроенные модули ЦАП 12 бит и АЦП со значительно меньшим временем преобразования (0.5 мкс) и повышенной разрядностью 12 бит.

Для преобразований с невысокой разрядностью удобно использовать ШИМ-выход таймера/счетчика, к которому подключают интегрирующую RC-цепь с постоянной времени, много больше периода ШИМ. Напряжение на выходе RC-цепи имеет постоянную составляющую и пульсацию. Во время импульса оно линейно растет, в паузе спадает. Среднее значение напряжения определяется напряжением питания VCC и коэффициентом заполнения ШИМ: Um = VCC * kз = VCC * OCRx / OCRx_max, здесь OCRx - значение в регистре ширины импульса, OCRx_max = 256/512/1024 - число дискрет в периоде ШИМ. Частоту тактирования таймера/счетчика ftc следует брать максимальной равной fclk, это позволяет минимизировать значения постоянной времени RC-цепи.

При необходимости можно использовать богатый выбор внешних ИМС ЦАП. В последнее десятилетие кроме ЦАП с параллельным интерфейсом появилось большое количество ЦАП с разновидностями последовательного синхронного интерфейса (I2C, SPI, SPORT...).

Рис. 6.4.

На рис. 6.4 представлена схема и результаты моделирования ШИМ-ЦАП (папка test_ADC_DAC). На вход АЦП ADC1 подано синусоидальное напряжение Sin частотой 100 Гц (период 10 мс), амплитудой 2 В и смещением 2.5 В. Программа (см. ниже) получает данные с АЦП, сдвигом влево делит на 4 и заносит их в регистр сравнения OCR1B. Импульсы симметричной 8-битной ШИМ на выходе OC1B имеют период 510 / 8 МГц = 63.75 мкс, сглаживаются фильтром с постоянной времени = 10 кОм * 100 нФ = 1 мс (сигнал DAC2). Период основного цикла 88 мкс. Сравнивая графики Sin и DAC2 видим, что последний имеет форму и амплитуду близкую к первому, но задержан на 1 мс. Можно сделать вывод, что основной вклад в искажение формы вносит фильтр на, влияние задержек измерения и преобразования не значительно. Увеличение постоянной времени даст более гладкую форму, но еще больше увеличит сдвиг фазы.

/*****************************************************

Chip type : AT90LS8535

AVR Core Clock frequency: 8.000000 MHz

*****************************************************/

#include <90s8535.h>

#include <delay.h>

unsigned int read_adc(unsigned char adc_input) {

ADMUX=adc_input;

// Delay needed for the stabilization of the ADC input voltage

delay_us(10);

// Start the AD conversion

ADCSR|=(1<<ADSC);//0x40;

// Wait for the AD conversion to complete

while ((ADCSR & (1<<ADIF))==0);

ADCSR|= (1<<ADIF);//0x10;

return ADCW;

} // ******************************************

void main(void) {

PORTB=0x00; DDRB=0xFF;

PORTD=0x00; DDRD=0x31;

TCCR1A=(1<<COM1A1)|(1<<COM1B1)|(1<<PWM10);// 8-bit PWM noninvert A, B

TCCR1B=(1<<CS10);// ftc1=fclk

TCNT1H=0x00; TCNT1L=0x00;

OCR1AH=0x00; OCR1AL=0x00;

ADCSR=(1<<ADEN)|(1<<ADPS2);// Включить АЦП, fadc=fclk/16

while (1) {

static unsigned char val=0;

val = read_adc(0)>>2;

PORTB = val;

OCR1A = val;

PORTD ^= (1<<0);

val = read_adc(1)>>2;

OCR1B = val;

}

} // *******************************************

Постоянная времени фильтра НЧ 10 кОм * 100 нФ = 1 мс, это больше периода пульсации (пример с UART) в 1000 мкс / 32 мкс = 31 раз, пульсация же снизилась до 38 мВ, то есть в 5000 / 38 = 131 раз. Получаем несоответствие 131 / 31 = 4.2, надо подумать.