Аналого-цифровой преобразователь

Для преобразования аналоговых сигналов в цифровые используется устройство, называемое аналого-цифровым преобазователем (АЦП).

В микроконтроллер ATmega8A встроен 6-канальный 10-разрядный АЦП. Рассмотрим его настройку.

Некоторые характеристики АЦП

  • 6-канальный АЦП
  • Разрешение -- 10 бит
    • Возможна установка левого выравнивания данных для упрощенного получения старших 8 бит
  • Оцифровка сигналов от 0 до 2.56В или до напряжения питания
  • Работа в непрерывном режиме или в режиме одной конверсии
  • Время одной конверсии -- от 13 до 260мкс
    • Частота тактового сигнала АЦП -- от 50 до 200кГц
    • Время первой (после включения) конверсии -- 25 тактовых интервалов
    • Время последующих конверсий -- 13 тактовых интервалов
  • Прерывание по завершении конверсии

АЦП в режиме одной конверсии

Для включения и установки частоты тактового сигнала АЦП можно использовать следующий код:

#define FOSC     1000000 /* Oscillator Frequency     (e.g. 1MHz)     */
#define PRESCALE 3       /* Clock Frequency Prescale (e.g. 1/8 FOSC) */

/* Enable ADC, setup prescaling */
ADCSR = (1<<ADEN)|(PRESCALE<<ADPS0);

Делитель частоты (prescale) выбирается из ряда допустимых значений (см. даташит) из необходимости обеспечить на АЦП частоту тактового сигнала 50..200кГц.

Рассмотрим работу в режиме ожидания результата.

Для произведения конверсии требуется выбрать необходимый канал, опорный уровень (2.56В, напряжение питания) и инициализировать конверсию. Для простоты будем рассматривать левое выравнивание данных.

/**
 * Select `c` channel,
 * setup internal reference level (2.56V) as reference level,
 * setup left data alignment.
 */
#define REMUX(c) ADMUX = (3<<REFS0)|(1<<ADLAR)|(c<<MUX0)

/* Instantiate a Single-Ended conversion at 2-nd ADC channel */

unsigned char adc2;

REMUX(1);                       /* 2nd ADC channel                    */
ADCSR |= (1 << ADSC);           /* Initialize single-ended conversion */
while(!(ADCSR & (1 << ADIF)))   /* Wait for the end of the conversion */
    ;
adc2 = ADCH;                    /* Read the 8-bit conversion result   */
ADCSR &= ~(1 << ADIF);          /* Clear Conversion Complete flag     */

results matching ""

    No results matching ""