Использование аналого-цифрового преобразования (АЦП) в микроконтроллерах PIC


Мы продолжаем серию наших обучающих статье по микроконтроллерам PIC. Ранее мы уже рассмотрели использование в них таймеров, подключение к ним ЖК дисплея 16х2 и семисегментного индикатора. В этой же статье мы рассмотрим использование аналого-цифрового преобразования (АЦП, в англ. ADC) в микроконтроллере PICF877A.

Внешний вид проекта по использованию АЦП в микроконтроллерах PIC

Использование АЦП широко востребовано в современной микроконтроллерной технике, поскольку микроконтроллеры умеют работать только с цифровыми сигналами, а многие датчики имеют аналоговый выход: датчик изгиба, датчик давления, датчик тока, акселерометры и т.д. В связи с этим актуальна задача преобразования этих аналоговых сигналов в цифровые для их дальнейшей обработки в микроконтроллерах.

Ранее на нашем сайте мы рассматривали использование АЦП в следующих микроконтроллерах (платах):

АЦП в микроконтроллере PIC16F877A

В настоящее время существует много типов различных АЦП, и каждый из них имеет свою собственную скорость и разрешение. Наиболее распространенными типами АЦП являются АЦП с последовательным приближением и типа "сигма-дельта". АЦП, используемый в микроконтроллере PIC16F877A, называется АЦП последовательного приближения или сокращенно SAR (Successive approximation).

Последовательный аппроксимационный АЦП (SAR) работает с помощью компаратора и нескольких логических преобразований. Данный тип АЦП использует опорное напряжение (которое является переменным) и сравнивает входное напряжение с опорным напряжением с помощью компаратора, и разность этих напряжений, которая и будет цифровым выходом данного АЦП, сохраняется из самого значащего (старшего) бита (MSB). Скорость сравнения зависит от тактовой частоты (Fosc), на которой работает микроконтроллер PIC.

Теперь, когда мы знаем основы АЦП, давайте откроем даташит на микроконтроллер PIC16F877A и посмотрим какие возможности аналого-цифрового преобразования есть у него. Как мы можем увидеть из даташита, микроконтроллер PIC16F877A содержит 10-битный 8-канальный АЦП. Это значит, что у него есть 8 каналов АЦП, представленных на рисунке ниже. Разрешение каждого канала АЦП составляет 10 бит, что означает что диапазон его выходных значений составляет 0-1024 (2^10).

Каналы АЦП микроконтроллера PIC16F877A

На представленном рисунке подсвечены каналы АЦП микроконтроллера PIC16F877A – с AN0 до AN7. Только на этих контактах микроконтроллер может считывать аналоговые значения напряжений. В нашем проекте мы для демонстрации возможностей использования АЦП в микроконтроллере PIC16F877A будем использовать его канал АЦП под номером 4.

Настройка режима работы в микроконтроллере PIC производится с помощью следующих четырех регистров:

  • A/D Result High Register (ADRESH);
  • A/D Result Low Register (ADRESL);
  • A/D Control Register 0 (ADCON0);
  • A/D Control Register 1 (ADCON1).

Программирование работы АЦП в микроконтроллере PIC

Запрограммировать работу АЦП в микроконтроллере PIC достаточно просто – необходимо научиться правильно настраивать 4 ранее указанных регистра.

После настройки битов конфигурации далее, в функции void main() нам необходимо инициализировать наш АЦП с помощью регистров ADCON1 и ADCON0.

Структура регистра ADCON0 представлена на следующем рисунке.

Структура регистра ADCON0 микроконтроллера PIC

В этом регистре нам необходимо включить использование модуля АЦП при помощи установки ADON=1 и установить частоту преобразования (A/D Conversion Clock) с помощью битов ADCS1 и ADCS0. В нашем проекте мы будем использовать частоту преобразования равную Fosc/16. Вы можете попробовать использовать и другие частоты и посмотреть как при этом изменятся результаты работы АЦП. Более подробно про эти процессы вы можете прочитать на странице 127 даташита на микроконтроллер PIC16F877A. В результате в нашем проекте регистр ADCON0 будет инициализирован следующим образом:

Структура регистра ADCON1 представлена на следующем рисунке.

Структура регистра ADCON1 микроконтроллера PIC

В этом регистре нам необходимо установить ADFM=1 (A/D Result Format Select bit – бит установки формата преобразования) и ADCS2 =1 чтобы еще раз выбрать частоту Fosc/16. Остальные биты данного регистра необходимо установить в 0 поскольку мы будем использовать внутреннее опорное напряжение. Более подробно про конфигурацию регистра ADCON1 вы можете прочитать на странице 128 даташита на микроконтроллер PIC16F877A. В результате в нашем проекте регистр ADCON1 будет инициализирован следующим образом:

Теперь, после конфигурации настроек модуля АЦП внутри функции main, перейдем в цикл while и начнем в нем считывать значения с выхода АЦП. Для этого необходимо выполнить следующую последовательность шагов:

  1. Инициализировать модуль АЦП.
  2. Выбрать аналоговый канал.
  3. Начать аналого-цифровое преобразование установив бит Go/Done регистра ADCON0 в high.
  4. Подождать пока состояние бита Go/Done станет low.
  5. Считать результат АЦП из регистров ADRESH и ADRESL.

Рассмотрим эти шаги более подробно.

1. Инициализация модуля АЦП. Она осуществляется с помощью установки значений регистров ADCON0 и ADCON1. Этот вопрос мы уже рассмотрели, поэтому в нашем случае функция для инициализации модуля АЦП будет выглядеть следующим образом:

2. Выбор канала АЦП (аналогового канала). Запрограммируем для этого специальную функцию чтобы в дальнейшем нам было легко переключаться между каналами АЦП.

В этой функции номер канала АЦП будет задаваться переменной channel. При этом с помощью команды

мы очищаем предыдущий выбранный канал АЦП. Для этого мы используем команду поразрядного “&”. В результате ее выполнения биты 3, 4 и 5 будут установлены в 0, а остальные биты будут оставлены в своем исходном состоянии. После этого необходимый канал выбирается с помощью оператора циклического сдвига влево на 3 разряда и операции поразрядного “|” (“или”).

3. Начало аналого-цифрового преобразования с помощью установки бита Go/Done в high. Для этого используем следующую команду:

4. Ожидание пока значение бита Go/DONE не станет low. Бит GO/DONE будет оставаться в состоянии high до тех пор пока процесс аналого-цифрового преобразования не закончится. Поэтому нам нужно подождать пока значение этого бита станет low. Это можно сделать с помощью цикла:

5. Считывание результата АЦП из регистров ADRESH и ADRESL. Когда значение бита Go/DONE станет low это будет означать что процесс АЦП завершился. Результатом АЦП является 10-битное значение. Поскольку наш микроконтроллер является 8-битным, то данный результат АЦП разделяется на старшие 8 бит и младшие 2 бита. Старшие 8 бит записываются в регистр ADRESH, а младшие 2 бита – в регистр ADRESL. Поэтому нам необходимо считать результат АЦП из этих двух регистров. Это можно сделать с помощью функции:

Полностью код функции для выбора канала АЦП, запуска процесса АЦП и считывания результата АЦП будет выглядеть следующим образом:

Теперь у нас есть функция, на вход которой мы подаем номер канала АЦП, а на ее выходе мы получаем считанное значение АЦП. В нашем случае мы будем использовать канал АЦП под номером 4, поэтому вызов данной функции будет выглядеть следующим образом:

Полный код программы нашего проекта приведен в конце статьи.

Для визуализации результата АЦП мы будем использовать 4-х разрядный семисегментный дисплей, более подробно о его подключении к микроконтроллеру PIC можно прочитать в данной статье.

Схема проекта

Схема проекта для демонстрации возможностей АЦП в микроконтроллере PIC представлена на следующем рисунке.

Схема проекта для демонстрации возможностей АЦП в микроконтроллере PICПодключение 4-х разрядного семисегментного дисплея к микроконтроллеру PIC точно такое же как и в предыдущем проекте. По сравнению с ним мы добавили в схему проекта потенциометр, подключенный к аналоговому контакту 4 микроконтроллера PIC. Считываемое модулем АЦП с данного потенциометра аналоговое значение напряжения будет отображаться на семисегментном индикаторе.

После загрузки кода программы в микроконтроллер PIC вы можете подключить мультиметр к нашей схеме и протестировать работу проекта.

Тестирование работы проекта

Проверка точности работы АЦП микроконтроллера PIC с помощью мультиметра

В нашем проекте мы считываем значение с выхода АЦП в диапазоне 0-1024 и преобразуем его в диапазон 0-5 Вольт. Результат отображается на семисегментном индикаторе и проверяется с помощью мультиметра.

Исходный код программы

Видео, демонстрирующее работу проекта

(Проголосуй первым!)
Загрузка...
1 906 просмотров

Комментарии

Использование аналого-цифрового преобразования (АЦП) в микроконтроллерах PIC — 3 комментария

  1. Пытаюсь заставить работать АЦП на pic12f683, но в протеусе, не выходит почему-то.
    Есть вопрос, касательно, условия проверки сброса бита, while(GO_nDONE);
    Я так пишу,
    ADCON0|=(1<<0); // установка бита в 1
    while(ADCON0&(1<<0)); //ждём сброса бита.
    Правильно? Я для вашего контроллера написал, в моем примере просто бит будет не 0, 1.

      • Добрый вечер. А протеус не понимает если ему написать как в программе GO_nDONE = 1?
        ADCON0|=(1<<2); // установка бита в 1 - это правильно

        while(ADCON0&(1<<2)) - с этим у меня есть сомнения. Вам же нужно состояние отдельного бита проверить, а вы здесь всему регистру делаете операцию "И" и потом, получается проверяете состояние всего регистра, а не его отдельного бита

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *