Аналого-цифровой преобразователь STM8 способен перевести аналоговое значение в цифровое с точностью в 10 бит, или с погрешностью в 0,097%. При максимальном уровне сигнала 3.3V, шаг дискретизации будет 3,2 мВ (соответственно, напряжение на входе можно определить с точностью до 3,2 мВ).
Линия аналогового входа имеет довольно большой импеданс и будучи не нагруженной ничем, может собирать все низкочастотные помехи. Особенно хорошо это видно было в последней практической работе, все помехи, все наводки легко попадали на вход. Поэтому, при конструировании электронных изделий необходимо позаботиться о фильтрации сигнала и защите от помех.
Все основные настройки, а так же управление ADC выполняются с помощью 4 регистров:
Как видите, по-умолчанию значения всех битов равны 0. Эти значения так же будут сброшены в 0 после аппаратного RESET'а.
ADC включается битом ADON в регистре ADC_CR1. После первой установки бита ADON происходит подключение питания к модулю, но конвертирование запускается лишь при повторной установке бита ADON. То есть каждая установка бита это старт преобразователя.
Если ADC долго не используется, то его рекомендуется отключать сбросом бита ADON для экономии энергии.
Важно! Когда ADC включен битом ADON, то цифровой ввод/вывод не будет работать на выбранном канале (CH[3:0]), вне зависимости от конфигурации GPIO.
Важно! Рекомендуется выбирать аналоговый канал ПОСЛЕ установки бита ADON.
Важно! Все несуществующие (не выведенные из микросхемы) каналы подтянуты к Vdd и их значение будет читаться как 1023.
При проектировании электроники на микроконтроллерах STM8 следует учесть, что максимальная рекомендуемая частота работы АЦП составляет 4 МГц. То есть при частоте основного тактового генератора (FMASTER) в 16 МГц, делитель частоты ADC (FADC) должен быть как минимум /4. Максимально возможный коэффициент деления /18. Делитель настраивается битами SPSEL[2:0] в регистре ADC_CR1.
Существует пять режимов преобразования:
Одиночный режим
ADC делает одну выборку на выбранном канале и сохраняет результат в регистры ADC_DRH и ADC_DRL. По окончании выставится флаг EOC и возникнет прерывание (если EOCIE включена).
Непрерывный режим
ADC автоматически приступает к следующему преобразованию. Результат помещается в регистры ADC_DRx. Остановить серию преобразований можно сбросом бита CONT. После каждой конверсии выставится флаг EOC и возникнет прерывание (если EOCIE включена).
Непрерывный буферизированный режим
ADC выполняет серию преобразований как в непрерывном режиме, но результат помещается в буферные регистры ADC1_DB (их 10 штук). После того как все регистры будут заполнены, выставится флаг EOC и возникнет прерывание (если EOCIE включена). Новая конверсия запускается автоматически. Если какой-то регистр буфера перезапишется ДО того как будет считан, то выставится флаг OVR. Это не остановит серию, но даст понять, что данные потеряны.
Сканирующий режим
ADC читает значение нескольких каналов, начиная с AIN0, заканчивая AINn, где n - это последний канал в диапазоне сканирования. Это число записывается в CH[3:0] регистра ADC_CSR. Пока каналы сканируются, значение CH[3:0] будет расти автоматически на аппаратном уровне.
Важно! При использовании сканирующего режима невозможно использовать линии AIN0 - AINn как цифровые. Мультиплексор будет их постоянно отключать.
Данные по каждому из просканированных каналов сохранятся в буфере(-ах) ADC_DB. Когда просканируется последний канал, то выставится флаг EOC и возникнет прерывание (если EOCIE включена).
Важно! Не сбрасывайте SCAN бит пока идет преобразование. Остановка лучше через бит ADON.
Сканирующий непрерывный режим
Работает почти так же как и сканирующий одиночный, за исключением того, что конверсия не прекращается и возобновляется автоматически. При перезаписи непрочитанных регистров выставляется флаг OVR.
Важно! Не сбрасывайте флаг EOC операцией BRES (ассемблер) или ADCCSR &= ~(1<<7) (Си). А записывайте в регистр переменную из оперативной памяти.
Режим |
CONT бит |
DBUF бит |
SCAN бит |
Одиночный |
0 |
0 |
0 |
Непрерывный |
1 |
0 |
0 |
Непрерывный с буфером |
1 |
1 |
0 |
Сканирующий |
0 |
0 |
1 |
Сканирующий непрерывный |
1 |
0 |
1 |
Описание битов регистров конфигурации:
EOC - флаг окончания преобразования. Выставляется аппаратно.
AWD - флаг события Analog watchdog. Выставляется при возникновении события.
EOCIE - бит разрешения прерывания по возникновению флага EOC
AWDIE - бит разрешение прерывания по возникновению флага AWD
CH[3:0] - аналоговый канал, от 0 до 15.
SPSEL[2:0] коэффициент делителя частоты АЦП. 000:/2, 001:/3, 010:/4, 011:/6, 100:/8, 101:/10, 110:/12, 111:/18
CONT - бит активности непрерывной работы АЦП
ADON - включение АЦП, старт АЦП
EXTTRIG - запуск конверсии по событию активен
EXTSEL[1:0] - выбор внешнего события для запуска конверсии 00: TIM1 TRGO; 01 - внеш. прерывание на пине ADC_ETR.
ALIGN - 0 - left; 1 - right, выравнивание данных в регистрах результата преобразования (например ADC_DRx)
Этих сведений вполне достаточно чтобы начать работать с АЦП микроконтроллеров STM8.
Это может быть интересно:
В промышленной электронике принято использовать аналоговые входы для передачи сигнала по токовой петле. Это достаточно стабильный и помехоустойчивый способ измерения сигналов с датчиков. Он широко распространен. Обычно, диапазон токов для промышленной токовой петли (а так же HART сигнала) это 0 - 40 мА. На микроконтроллере STM8 такой токовый вход создается добавлением на вход резистора 82 Ома. Так же, опционально можно добавить защитный резистор предохранитель (R1). На рисунке приведена схема токового входа на микроконтроллере STM8 с напряжением питания 3,3V.