PIC Урок 25. Модуль ADC (АЦП). Измеряем напряжение. Часть 1



Переходим к изучению следующего модуля контроллера PIC — ADC, я считаю, одного из самых важных модулей.

ADC (Analog-to-Digital Converter, в переводе на русский АЦП или аналого-цифровой преобразователь) — это периферия, которая преобразует электрический сигнал на её входе в цифровой код. Затем данный код мы уже используем для обработки или для отображения тем или иным образом данной электрической величины. Это очень распространённая периферия или технология. АЦП активно используется в звукозаписи, измерительной технике, видеозаписи и во многих других случаях. Поэтому нам обойти данную вещь стороной никак не получится, тем более АЦП поддерживается аппаратно в контроллерах PIC16.

Как вообще работает цифровое преобразование?

Берётся опорное напряжение и сравнивается с измеряемым. Соответственно, опорное напряжение всегда должно быть больше измеряемого. Если это не так, то нужно будет применять делители напряжения.

Изобразим схематично процесс измерения

Отрезок — это диапазон измерений. Он находится между нулём и опорным напряжением. А стрелка — это измеряемое напряжение.

Данный отрезок делится пополам, и АЦП оценивает, в какой половине находится приложенное напряжение

Если оно находится в стороне нуля, то в самый старший бит результата записывается 0, а если в стороне максимального напряжения, то единица. У нас будет единица. Затем та половина отрезка, на которой находится измеряемое напряжение делится ещё пополам, и АЦП опять измеряет, в какой половинке уже данного отрезка у нас находится измеряемое напряжение

Оценка идёт по тому же принципу — в какой стороне отрезок. В нашем случае будет 0. И этот ноль записывается в следующий более младший бит.

Затем та четвертинка опять делится пополам и АЦП опять оценивает, где находится отрезок

И АЦП так и продолжает такой процесс до тех пор, пока не кончатся ячейки для битов. То есть если мы используем 10-битный режим, то. соответственно, и будет 10 подобных измерений и заполнятся 10 бит величины. Чем больше бит, тем точнее результат, но уже потребуется на это больше времени и более серьёзный и точный АЦП. Имея данный результат, нам несложно будет посчитать величину измеренного напряжения. Мы знаем. что если у нас АЦП 10-битный, то данный результат у нас лежит в промежутке от 0 до 1023 (0xFFFF), получается всего у нас 1023 отрезка. И мы затем наш результат делим на 1024 (количество отрезков плюс 1) и умножаем на величину опорного напряжения.

Теперь посмотрим, как устроен модуль ADC в контроллере PIC16 (нажмите на картинку для увеличения изображения)

Измеряемый сигнал поступает на коммутатор входов, управляемый с помощью битов CHS2:CHS0, в A/D конвертер, в котором преобразовывается в цифровой код. Также в конвертер подаётся опорное напряжение, которое также может поступать из различных источников, что управляется тоже определёнными битами регистров настроек, с которым и сравнивается поступивший сигнал.

A/D-конвертер работает следующим образом. Сигнал, который поступил в него через коммутатор, заряжает внутренний конденсатор CHOLD. Затем модуль преобразует напряжение, удерживаемое на конденсаторе в соответствующий 10-разрядный цифровой код методом, описанным выше (данный метод называется методом последовательного приближения).

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

 

 

Теперь давайте познакомимся с регистрами модуля ADC, которые, я надеюсь, внесут ещё большую ясность в понимание процесса работы АЦП.

Управляющий регистр ADCON0

Рассмотрим отдельные биты данного регистра:

ADCS1:ADCS0 (A/D Conversion Clock Select bits): Выбор источника тактового сигнала. Также есть третий бит выбора источника тактового сигнала ADCS2, который находится в регистре ADCON1. Вот как зависит выбор источника тактового сигнала, а также его частота от состояний этих трёх битов

ADCS2:ADCS0 Частота преобразователя
000 FOSC/2
001 FOSC/8
010 FOSC/32
011 FRC (Внутренний RC генератор модуля АЦП)
100 FOSC/4
101 FOSC/16
110 FOSC/64
111 FRC (Внутренний RC генератор модуля АЦП)

CHS2:CHS0 (Analog Channel Select bits): Выбор аналогового канала

000 = Канал 0 (AN0)

001 = Канал 1 (AN1)

010 = Канал 2 (AN2)

011 = Канал 3 (AN3)

100 = Канал 4 (AN4)

101 = Канал 5 (AN5)

110 = Канал 6 (AN6)

111 = Канал 7 (AN7)

GO/DONE (A/D Conversion Status bit): Статус модуля АЦП

1 — модуль АЦП выполняет преобразование (установка бита вызывает начало преобразования)

0 — состояние ожидания (сбрасывается аппаратно по окончанию преобразования).

ADON (A/D On bit): Бит включения модуля АЦП

1 — модуль АЦП включен

0 — модуль АЦП выключен. Ток модулем не потребляется.

Управляющий регистр — ADCON2

Рассмотрим биты данного регистра:

ADFM (A/D Result Format Select bit): Формат сохранения 10-битного результата

1 — правое выравнивание (два старших бита находятся в двух младших битах регистра ADRESH, остальные нули, а 8 младших битов — в регистре ADRESL)

0 — левое выравнивание (два младших бита находятся в двух старших битах регистра ADRESL, остальные нули, а 8 старших битов — в регистре ADRESH).

ADCS2 (A/D Conversion Clock Select bit): Старший бит выбора источника тактового сигнала

Был рассмотрен выше.

PCFG3:PCFG0 (A/D Port Configuration Control bits): Управляющие биты настройки каналов АЦП. Данные биты настраивают тип входов (цифровой или аналоговый), а также влияют на выбор источника опорного напряжения. Для этого в технической документации существует вот такая таблица

Из данной таблицы мы видим, что можно одновременно работать с несколькими каналами измеряемого сигнала. В этом случае преобразование сигнала каналов происходит не одновременно, а по очереди. Мы перед началом преобразования выбираем определённый канал, а перед началом следующего — другой канал.

 

 

Теперь поговорим о последовательности действий при работе с модулем ADC.

  1. Сначала мы настраиваем модуль, в том числе и биты PCFG3:PCFG0, выбираем направление ножек портов (ножки, участвующие в измерении сигналов, должны быть включены на вход). Затем выбираем канал, на котором будет производиться замер напряжения сигнала, выбираем источник тактирования АЦП и включаем модуль.
  2. Затем настраиваем прерывание от ADC, если необходимо. Прерывания настраиваются следующим образом: бит ADIF сбрасывается в 0, ADIE устанавливается в 1, также включаем глобальные прерывания с помощью битов PEIE и GIE.
  3. Выдерживаем паузу, необходимую для зарядки конденсатора.
  4. Начинаем аналого-цифровое преобразование с помощью установки бита GO/DONE.
  5. Ждём окончания преобразования путём отслеживания состояния бита GO/DONE или обрабатывая соответствующее прерывание.
  6. Считываем результат из регистров ADRESH:ADRESL, сбрасываем бит ADIF при необходимости.
  7. Чтобы начать следующее преобразование, процесс повторяется с шага 1 или 2. Минимальное время ожидания перед запуском следующего преобразования должно быть не менее двух периодов преобразования одного бита.

 

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

В данном занятии мы попытаемся отследить изменение напряжения на ножке AN0, а результат мы мониторить будем с помощью жидкокристаллического дисплея подключенного через переходник к шине I2C.

В качестве подопытного контроллера мы возьмём PIC16F877A, расположенный на плате от WaveShare, а в качестве источника испытуемого сигнала соберём примитивный делитель с помощью переменного резистора на 10 килоом, подключенного с одной стороны к плюсу питания контроллера, а с другой — к общему проводу. Центральный провод соединим с ножкой AN0.

Подключим резистор к плате

Подключим дисплей

Подключим программатор, подключив его затем и к ПК, а также подключим внешний блок питания к плате.

В следующей части занятия мы настроим проект, АЦП, напишем код для измерения напряжения и проверим код на практике.

 

 

Предыдущий урок Программирование МК PIC Следующая часть

 

 

Купить программатор (неоригинальный) можно здесь: PICKit3

Купить программатор (оригинальный) можно здесь: PICKit3 original

Отладочную плату PIC Open18F4520-16F877A можно приобрести здесь: PIC Open18F4520-16F877A

Дисплей LCD 20×4 можно приобрести тут: Дисплей LCD 20×4

Переходник I2C to LCD можно приобрести здесьI2C to LCD1602 2004

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

PIC Модуль ADC (АЦП). Измеряем напряжение

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

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

*