Изучаем работу АЦП в микроконтроллере STM32F103.

Страница на этапе разработки

В данном уроке мы с Вами изучим работу АЦП (ADC) микроконтроллера STM32F103, но сначала рассмотрим возможности нашего АЦП:

  1. В нашем микроконтроллере есть два 12-битных ADC. Каждый из которых обслуживать несколько каналов — 10 внешних и 2 внутренних.
  2. Имеет несколько режимов преобразования:
    • однократное
    • непрерывное
    • по триггеру
    • по таймеру
  3.  Есть выравнивание битов результата (вправо / влево).
  4. Может генерировать прерывание для DMA.
  5. Скорость оцифровки — до 0.9 MSPS
  6.  Есть автокалибровка
  7. Режим сканирования входов по списку
  8. Аналоговый сторож (watchdog)

Сами каналы АЦП микроконтроллеров STM32 делятся на две группы:

  1. регулярные каналы (regular).
  2. инжектированные (injected).

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

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

Режимы работы АЦП:

1. Single-channel (Одноканальный) АЦП выполняет одно преобразование одного канала, сохраняет полученное значение в выходном регистре и останавливается.

2. Single continuous (Одноканальный длительный) Этот режим аналогичен первому, но АЦП не останавливается, а продолжает работу с выбранным каналом. При этом результат постоянно перезаписывается в выходном регистре.

3. Scan (Многоканальный) В этом режиме возможно сконфигурировать АЦП для выполнения последовательных преобразований нескольких каналов в заданной последовательности. Преобразовании также настраивается отдельно для каждого канала. После обработки указанного числа каналов АЦП останавливается.

4. Scan continuous (Многоканальный длительный) То же самое что и Scan, только АЦП не останавливается после опроса всех каналов, а снова начинает обработку каналов. При этом все результаты сохраняются в один регистр и надо вовремя забирать данные, пока они не будут затертые данным преобразования следующего канала.

5. Discontinuous (Прерывистый) Сканируются не все каналы за раз, а только те, которые заранее установленные, при следующем сканировании, сканируется следующая группа каналов и так далее.

Входы питания:
Vref+  — вход опорного напряжения
Vdda — вход аналогового питания
Vssa — вход общего потенциала аналогового питания

Для начала изучим работу 4 инжекторных каналов (в микроконтроллере STM32F103 их 4 штуки). В данном случаи результат каждого измерения будет помещен в свой регистр и нам не нужно «переживать», что результаты измерений будут затертые чужим каналом.
Но вначале нам необходимо рассмотреть некоторые особенности работы АЦП:
1. Калибровка АЦП — так как внутренние конденсаторы МК имеют не однородность,  для уменьшения погрешности преобразования проводят калибровку. Во время калибровки вычисляется цифровое значение АЦП для каждого конденсатора в виде корректирующего кода.
Перед началом калибровки АЦП должно находиться в отключенном состоянии, то есть бит ADON должен быть равен нулю. Запуск калибровки производиться установкой бита CAL в регистре ADC_CR2. Как только калибровка закончится, бит CAL сбросится аппаратно, после чего можно выполнять преобразования. Рекомендуется калибровать АЦП при подачи питания.
2. Время преобразования — для каждого канала можно выставить свое время преобразования, которое возможно выбрать из диапазона 1,5-239,5 дискретно (8 значений). Выставляется время в регистрах ADC_SMPR1  и ADC_SMPR2.
Полное время преобразования Т=программное время выборки + 12,5 циклов.
Например частота ADCCLK задана равной 14МГц, а время выборки 1,5 цикла, тогда Т=1,2+12,5=14 циклов, то есть 1мкс.

Напишем программный код:

Программный код