Средства аналогового ввода/вывода микроконтроллеров: назначение, принцип построения аналого-цифрового преобразователя (АЦП). Модуль АЦП в PIC-микроконтроллерах

Необходимость приема и формирования аналоговых сигналов требует наличия в МК модулей аналогового ввода/вывода. Отличительная особенность многих современных 8-разрядных МК - интегрированный на кристалл МК модуль многоканального АЦП. Он предназначен для ввода в МК аналоговых сигналов с датчиков физических величин и преобразования этих сигналов в двоичный код с целью последующей программной обработки. Структурная схема типового модуля АЦП представлена на рис. 1.

Средства аналогового ввода/вывода микроконтроллеров: назначение, принцип построения аналого-цифрового преобразователя (АЦП). Модуль АЦП в PIC-микроконтроллерах - student2.ru

Рис. 1. Типовая структура модуля АЦП

Многоканальный аналоговый коммутатор К служит для подключения одного из источников аналоговых сигналов (выводы порта Рx.0 ... Рx.7) ко входу АЦП. Выбор источника сигнала для преобразования осуществляется посредством записи номера канала коммутатора в соответствующие разряды регистра управления АЦП.

Диапазон измеряемых значений напряжения аналоговых входов определяется напряжением опоры Uоп. Разрешающая способность АЦП составляет Uоп/2n, где n – число двоичных разрядов в слове результата. Максимальное значение опорного напряжения, как правило, равно напряжению питания МК. Два вывода модуля АЦП используются для задания опорного напряжения: UREFH – верхний предел Uоп, UREFL – нижний предел. Разность потенциалов на входах UREFH и UREFL и составляет Uоп. Если измеряемое напряжение Uизм ³ UREFH, то результат преобразования будет равен FFh. Код 00h соответствует напряжениям Uизм £ UREFL. Для достижения максимальной точности измерения следует выбрать максимально допустимое значение Uоп. В этом случае напряжение смещение нуля входного каскада и нелинейность передаточной характеристики АЦП будут вносить относительно малые погрешности.

Собственно аналого-цифровой преобразователь выполнен по способу последовательного приближения. Разрядность такого АЦП обычно составляет 8, реже 10 разрядов.

Длительность такта преобразования задает генератор синхронизации: один цикл получения очередного разряда выходного кода равен двум периодом частоты генератора TАЦП. Время преобразования АЦП можно рассчитать по формуле:

tпр= (2n + 1)ТАЦП.

Последний цикл необходим для переноса результата в регистр данных АЦП. Время преобразования для типовых модулей АЦП микроконтроллеров составляет от единиц до десятков микросекунд.

Источником синхронизации модуля АЦП может служить встроенный RC-генератор (Г) или импульсная последовательность тактирования внутренних шин МК. В первом случае частота синхронизации АЦП обязательно окажется оптимальной, то есть той, которая рекомендуется в техническом описании. Во втором случае выбранная по другим соображениям ¦BUS может оказаться неподходящей для модуля АЦП. На этот случай в составе некоторых модулей предусмотрен программируемый делитель частоты ¦BUS.

Большинство модулей АЦП имеет только режим программного запуска: установка одного из битов регистра режима запускает очередное измерение. Момент завершения цикла преобразования АЦП отмечается установкой триггера готовности данных. Если прерывания от модуля АЦП разрешены, то генерируется запрос на прерывание. Как правило, чтение регистра результата сбрасывает триггер готовности.

Цифро-аналоговые преобразователи в составе МК являются большой редкостью. Обычно функция цифро-аналогового преобразователя реализуется средствами модуля программируемого таймера в режиме ШИМ. На одном из выводов МК формируется высокочастотная импульсная последовательность. Полученный сигнал сглаживается фильтром нижних частот с целью получения непрерывной осредненной величины.

Многие микроконтроллеры семейства PIC16 имеют встроенные многоканальные аналого-цифровые преобразователи (АЦП), используемые для преобразования аналогового входного напряжения в диапазоне от 0 до UDD (напряжение питания МК) в цифровой код. АЦП выдают 10-разрядный код, а число аналоговых каналов зависит от конкретного типа МК. Так, например, PIC16F877 имеет 8 аналоговых каналов. Для ввода аналоговых сигналов обычно используются линии порта А, которые требуется настроить на ввод. Реальная величина погрешности преобразования, характер использования выводов портов и скорость выполнения операций зависит от конкретного типа МК, а также тактовой частоты его работы.

Модуль АЦП имеет внутренний делитель частоты, обеспечивающий деление тактовой частоты МК в 2, 8 и 32 раза. Встроенный RC-генератор с частотой 250 кГц обычно используется для АЦ-преобразования в тех случаях, когда сам МК переводится в энергосберегающий режим SLEEP.

Для облегчения разработки программ управления встроенным аналогово-цифровым преобразователем PIC-микроконтроллеров в библиотеке IDE mikroC PRO for PIC имеются две функции.

ADC_Init- эта функция производит инициализацию внутреннего модуля АЦП микроконтроллера. При этом предполагается, что АЦП будет тактироваться от внутреннего RC-генератора модуля, а выводы портов МК, используемые как аналоговые входы, сконфигурированы на ввод.

Прототип:

void ADC_Init( );

Пример:

// Инициализировать модуль АЦП с использованием в качестве

// аналоговых входов линии порта А – RA0, RA2, RA3 (аналоговые

// каналы AN0, AN1, AN2)

TRISA = 0b00000111; // Настроить линии порта А - RA0, RA1, RA2

// на ввод, остальные на вывод

………………………………..

ADC_Init( );

ADC_Read –эта функция вводит аналоговое напряжение из заданного канала и запускает АЦП. Функция возвращает 10-разрядное двоичное число без знака (выходной код АЦП). Перед использованием этой функции модуль АЦП должен быть инициализирован.

Прототип:

unsigned int ADC_Read(unsigned char channel);

Здесь параметр channel (канал) представляет собой номер аналогового канала, из которого извлекается напряжение.

Для микроконтроллера PIC16F877 номера аналоговых каналов соответствуют следующим выводам портов А и Е:

Номер канала Вывод порта

0 RA0 (AN0)

1 RA1 (AN1)

2 RA2 (AN2)

3 RA3 (AN3)

4 RA5 (AN4)

5 RE0 (AN5)

6 RE1 (AN6)

7 RE2 (AN7)

Пример:

// Прочитать код из канала 2 модуля АЦП

unsigned int adc_result; // Объявление двухбайтной целой переменной

………………………………………

adc_result = ADC_Read(2);

Наши рекомендации