ADC (Analog-to-digital converter)- аналого-цифровой преобразователь микроконтроллеров STM32F10x


Введение


12-разрядный ADC представляет собой аналого-цифровой преобразователь последовательного приближения. Он имеет до 18 мультиплексированных каналов, что позволяет измерять сигналы от шестнадцати внешних и двух внутренних источников. Аналого-цифровое преобразование различных каналов может выполняться в одиночном (single), непрерывном (continuous), сканирующем (scan) или прерывистом (discontinuous) режиме. Результат работы АЦП сохраняется в 16-разрядном регистре данных, выровненном по левому или по правому краю.

Функция аналогового сторожевого таймера (analog watchdog) позволяет приложению определять, выходит ли входное напряжение за пределы заданных пользователем пороговых значений (минимальное и максимальное входное напряжение).

Тактовая частота на входе АЦП генерируется из тактовой частоты PCLK2 (шина APB2 с максимальной частотой 72 МГц), делённой на значение предделителя, и не должна превышать 14 МГц.


Основные характеристики

 -  Разрядность преобразования (дискретизация) 12 бит.

 -  Генерация прерываний по событиям: окончания преобразования (End of Conversion), окончания преобразования в инжектированном канале(End of Injected conversion), по срабатыванию аналогового сторожевого таймера (Analog watchdog).

 -  Режимы однократного (single) и циклического (continuous conversion) преобразования.

 -  Режим автоматического последовательного сканирования (scan mode) нескольких каналов.

 -  Самокалибровка.

 -  Полученный 12-битный результат может быть выровнен по правому или левому краю 16-битного регистра.

 -  Программируемое время выборки для разных каналов.

 -  Внешнее триггерное управление для регулярного (regular) и инжектированного (injected) преобразования.

 -  Прерывистый режим работы (discontinuous mode).

 -  Режим сдвоенного (dual mode) преобразования (для устройств с 2-мя АЦП).

 -  Минимальное время преобразования в районе 1 мкс.

 -  Генерация запроса DMA при регулярном (regular) преобразовании.


Краткое описание работы АЦП


Включение-выключение АЦП

Для включения АЦП необходимо разрешить его тактирование установкой соответствующего бита в регистре RCC_APB2ENR, и подать питание, установив бит ADON в регистре ADC_CR2.

Когда бит ADON устанавливается в первый раз, АЦП выводится из режима отключения питания. Преобразование начинается, когда бит ADON устанавливается программным обеспечением во второй раз через время tSTAB после включения АЦП.

Cбросив бит ADON преобразование останавливается и АЦП переводится в режим отключения питания с очень низким энергопотреблением (единицы мкА).


Тактирование АЦП

Тактовая частота АЦП (ADCCLK) синхронизирована с частотой шины APB2 (PCLK2, 72 MHz max) и формируется с помощью предварительного делителя


RCC->CFGR &= ~RCC_CFGR_ADCPRE;          //- сброс коэф деления предделителя АЦП
RCC->CFGR |= RCC_CFGR_ADCPRE_DIV6;      //- установить коэф деления предделителя АЦП = 6 (0b10): 72МГц / 6 = 12МГц
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;     //- вкл ADC1

RCC->APB2RSTR |= RCC_APB2RSTR_ADC1RST;  //- сброс ADC1
RCC->APB2RSTR &= ~RCC_APB2RSTR_ADC1RST;





Выбор каналов АЦП

16 мультиплексированных каналов АЦП можно разделить на две группы преобразования: регулярную и инжектированную. Группа состоит из последовательности преобразований, которые могут выполняться на любом канале и в любом порядке.

Регулярная группа может содержать до 16 каналов. Каналы и последовательность преобразования для регулярной группы должны быть установлены в регистрах ADC_SQRx. Общее количество преобразований в регулярной группе должно быть записано в L битах[3:0] в регистре ADC_SQR1.

Инжектированная группа может содержать до 4 каналов. Каналы и последовательность преобразования для инжектированной группы должны быть установлены в регистрах ADC_JSQR. Общее количество преобразований в инжектированной группе должно быть записано в L битах[3:0] в регистре ADC_SQR1.

Если регистры ADC_SQRx или ADC_JSQR изменяются во время работы АЦП, текущее преобразование сбрасывается и АЦП начинает новое преобразование для новой выбранной группы.


Встроенный датчик температуры АЦП

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

Датчик температуры подключен к каналу ADCx_IN16, а внутреннее опорное напряжение VREFINT подключено к каналу ADCx_IN17. Эти два внутренних канала могут быть выбраны и преобразованы как обычные внешние регулярные или инжектированные каналы. Датчик температуры и функция внутреннего опорного напряжения VREFINT доступны только на главном АЦП - ADC1.


Режим одиночного преобразования (single conversion)

Режим одиночного преобразования выбирается битом CONT=0 в регистре ADC_CR2. Режим запускается установкой бита ADON (только для регулярного канала) в регистре ADC_CR2 или внешним триггером (для регулярного или инжектированного канала). АЦП выполняет одно преобразование и останавливается.

После завершения преобразования для регулярного канала: преобразованные данные сохраняются в регистре ADC_DR с заранее настроенным выравниванием; устанавливается флаг EOC (End Of Conversion) в регистре статуса ADC_SR; генерируется прерывание, если установлен бит EOCIE в регистре ADC_CR1.

После завершения преобразования для инжектированного канала: преобразованные данные сохраняются в регистре ADC_DRJ1 с заранее настроенным выравниванием; устанавливается флаг JEOC (End Of Conversion Injected) в регистре статуса ADC_SR; генерируется прерывание, если установлен бит JEOCIE в регистре ADC_CR1.

Работа АЦП прекращается.


Режим циклического (непрерывного) преобразования (continuous conversion)

Режим циклического преобразования выбирается битом CONT=1 в регистре ADC_CR2. Режим запускается установкой бита ADON в регистре ADC_CR2. АЦП запускает новое преобразование как только завершает предыдущее.

После каждого завершённого преобразования для регулярного канала:

 -  преобразованные данные сохраняются в регистре ADC_DR с заранее настроенным выравниванием;

 -  устанавливается флаг EOC (End Of Conversion) в регистре статуса ADC_SR;

 -  генерируется прерывание, если установлен бит EOCIE в регистре ADC_CR1.

После каждого завершённого преобразования для инжектированного канала:

 -  преобразованные данные сохраняются в регистре ADC_DRJ1 с заранее настроенным выравниванием;

 -  устанавливается флаг JEOC (End Of Conversion Injected) в регистре статуса ADC_SR;

 -  генерируется прерывание, если установлен бит JEOCIE в регистре ADC_CR1.


Аналоговый сторожевой таймер (AWD, Analog watchdog)

Аналоговый сторожевой таймер срабатывает, если преобразованное аналоговое напряжение ниже низкого или выше высокого установленного порогового значения. При этом устанавливается бит AWD в регистре статуса ADC_SR. При установленном бите AWDIE=1 в регистре ADC_CR1 генерируется прерывание.

Пороговые значения аналогового сторожевого таймера запрограммированы в 12-ти младших разрядах 16-разрядных регистров ADC_HTR и ADC_LTR. Пороговое значение не зависит от выравнивания, выбранного битом выравнивания ALIGN в регистре ADC_CR2. Сравнение выполняется перед выравниванием.

Аналоговый сторожевой таймер можно включить на одном или нескольких каналах, настроив регистр ADC_CR1, как показано в таблице:


Режим сканирования (Scan mode)

Этот режим используется для сканирования всей назначенной группы каналов.

Режим сканирования можно выбрать, установив бит SCAN в регистре ADC_CR1. Как только этот бит установлен, АЦП сканирует все каналы, выбранные в регистрах ADC_SQRx (для регулярных каналов) или в регистре ADC_JSQR (для инжектированных каналов).

Для каждого канала группы выполняется однократное преобразование. После каждого завершения преобразования автоматически преобразуется следующий канал группы. Если установлен бит CONT, преобразование не останавливается на последнем выбранном групповом канале, а продолжается снова с первого выбранного группового канала.

При использовании режима сканирования необходимо установить бит DMA в регистре ADC_CR2 и использовать контроллер прямого доступа к памяти для передачи преобразованных данных регулярных групповых каналов в SRAM после каждого обновления регистра ADC_DR. Преобразованные данные инжектированного канала всегда сохраняются в регистрах ADC_JDRx.


Управление инжектированными каналами

Запуск преобразования группы инжектированных каналов внешним событием (триггером).

Чтобы использовать триггерный запуск преобразования группы инжектированных каналов необходимо сбросить бит JAUTO и установить бит SCAN в первом регистре управления ADC_CR1.

Запустить преобразование группы регулярных каналов либо с помощью внешнего триггера, либо установив бит ADON в регистре ADC_CR2.

Если во время преобразования группы регулярных каналов возникает внешний инициирующий сигнал, текущее преобразование сбрасывается, и запускается преобразование группы инжектированных каналов в режиме однократного сканирования (Scan once mode).

Затем преобразование группы регулярных каналов возобновляется с момента последнего преобразования.

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


Калибровка

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

Калибровка запускается установкой бита CAL в регистре ADC_CR2. После завершения калибровки бит CAL сбрасывается аппаратно, и можно выполнять обычное преобразование. Рекомендуется выполнить калибровку АЦП один раз при включении питания. Калибровочные коды сохраняются в ADC_DR сразу после завершения фазы калибровки.

Перед началом калибровки АЦП должен находиться в выключенном состоянии (бит ADON = "0") не менее двух тактов АЦП.


Запрос DMA

Преобразованные значения регулярных каналов хранятся в одном регистре данных ADC_DR. Если преобразовывается группа регулярных каналов, то результат каждого следующего преобразования будет затирать предыдущий. Прерывание EOC генерируется только после окончания преобразования всей группы. Для избежания потери данных при преобразовании более чем одного канала в регулярной группе необходимо использовать DMA.

Запрос DMA генерируется в конце преобразования каждого регулярного канала, который позволяет передавать преобразованные данные из регистра ADC_DR в место назначения, выбранное пользователем.


Прерывания АЦП

Прерывание генерируется по окончании преобразования группы каналов (регулярной или инжектированной), а также при срабатывании аналогового сторожевого таймера. Для обеспечения гибкости доступны отдельные биты разрешения прерываний.

Прерывания от ADC1 и ADC2 отображаются на один и тот же вектор прерываний (ADC1_2_IRQn = 18). Прерывания от ADC3 отображаются на отдельный вектор прерываний (ADC3_IRQn = 47).

В регистре статуса ADC_SR присутствуют ещё два других флага, но с ними не связано прерывание:

 -  JSTRT (Запущено преобразование для группы инжектированных каналов);

 -  STRT (Запущено преобразование для группы регулярных каналов).