Перейти к содержанию

АЦП STM32F1 и STM32F4: режимы, запуск, калибровка, точность

Как устроен и как запускается 12-битный АЦП STM32: группы каналов, режимы одиночного, непрерывного и прерывистого преобразования, запуск от таймеров, скан с DMA, калибровка у STM32F1, внутренние датчик температуры и опорное напряжение с заводскими калибровками STM32F4, аналоговый сторож и реальная точность по даташитам.

Обновлено Редакция GAW

АЦП STM32 — 12-битный преобразователь последовательного приближения с мультиплексором на 16 внешних и несколько внутренних каналов. Он умеет преобразовывать по команде программы или по сигналу таймера, обходить последовательность каналов и складывать результаты в память через DMA, следить за выходом сигнала из окна и работать в паре с другими АЦП для удвоения или утроения скорости.

Ниже — АЦП STM32F103 и STM32F407 по справочным руководствам RM0008 и RM0090 и даташитам. Время преобразования и наибольшее сопротивление источника для заданного времени выборки считает калькулятор АЦП STM32, принцип последовательного приближения и параметры точности объяснены в статье об АЦП, а все биты регистров — на страницах ADC STM32F1 и STM32F4.

Коротко

  • STM32F103: два АЦП, 12 бит, f_ADC до 14 МГц, 1 мкс на преобразование, питание VDDA 2,4–3,6 В, самокалибровка.
  • STM32F407: три АЦП, 12, 10, 8 или 6 бит, f_ADC до 36 МГц, 2 Msps на один АЦП, до 6 Msps втроём, питание от 1,8 В, без самокалибровки.
  • Группы: регулярная — до 16 преобразований, результат в DR; инжектированная — до 4, у каждой свой регистр JDR.
  • Скан нескольких каналов требует DMA: регистр данных регулярной группы один.
  • Внутренние каналы: датчик температуры и VREFINT; у STM32F4 есть ещё VBAT и заводские калибровки.
  • Точность: ±2 младших разряда у STM32F103 и ±5 у STM32F407 — наибольшая полная ошибка по даташитам.

АЦП STM32F103 и STM32F407

STM32F103x8/BSTM32F405/407
Число АЦП2 (ADC1, ADC2)3 (ADC1–ADC3)
Разрядность12 бит12, 10, 8 или 6 бит (поле RES)
Частота f_ADC0,6–14 МГц0,6–36 МГц при VDDA 2,4–3,6 В, до 18 МГц ниже
Наименьшее время преобразования1 мкс (14 тактов при 14 МГц)0,5 мкс (15 тактов при 30 МГц)
Время выборки1,5–239,5 такта3–480 тактов
Питание VDDA2,4–3,6 В1,8–3,6 В
Внутренние каналы16 — датчик температуры, 17 — VREFINT16 (у F42x/43x — 18) — датчик температуры, 17 — VREFINT, 18 — VBAT/2
Калибровкасамокалибровка битом CALнет; заводские TS_CAL и VREFINT_CAL
Совместная работадвойной режим ADC1 + ADC2двойной и тройной режимы

Данные — из RM0008 (раздел 11.2), RM0090 (раздел 13.2) и таблиц 47 DS5319 и 67 DS8626. Частота АЦП получается из PCLK2 делителем ADCPRE на 2, 4, 6 или 8: у STM32F1 он в регистре RCC_CFGR, у STM32F4 — в общем регистре ADC_CCR. При частоте шины 72 МГц делитель 6 даёт 12 МГц, а 14 МГц получаются только от 56 МГц — поэтому RM0008 указывает время преобразования 1 мкс при 56 МГц и 1,17 мкс при 72 МГц.

Входы и опорное напряжение

Диапазон входа — от VREF− до VREF+ (RM0008, раздел 11.2). В небольших корпусах отдельных выводов опорного напряжения нет: у STM32F103 в корпусах на 48 и 64 вывода и у STM32F405 в LQFP64 VREF+ соединён с VDDA внутри, а в LQFP100 и больших корпусах выведен отдельно (данные ST о выводах корпусов, STM32_open_pin_data). Сам код АЦП пропорционален отношению входного напряжения к VREF+, поэтому шум и отклонение питания VDDA прямо переходят в результат.

Вывод АЦП переводят в аналоговый режим (у STM32F1 — CNF = 00 и MODE = 00, у STM32F4 — MODER = 11). В этом режиме вывод не выдерживает 5 В: напряжение не должно выходить за VDDA больше чем на 0,3 В — подробнее в статье о GPIO STM32. DS8626 (примечание к таблице 68) предупреждает о наведённом токе: отрицательный ток в любой аналоговый вход заметно портит преобразование на других входах. Если на входе возможно напряжение ниже нуля, ставят диод Шоттки от вывода к земле.

Внутреннее сопротивление источника вместе с ёмкостью выборки ограничивает минимальное время выборки: при 14 МГц у STM32F103 источник 10 кОм требует не меньше 13,5 такта, а 50 кОм — 55,5 такта (DS5319, таблица 48). Расчёт для любого источника — в калькуляторе АЦП.

Группы каналов и режимы

АЦП хранит две очереди преобразований (RM0008, раздел 11.3.3):

  • регулярная группа — до 16 преобразований в любом порядке, каналы могут повторяться; порядок задают регистры SQR1–SQR3, длину — поле L. Результат каждого преобразования попадает в один регистр DR и ставит флаг EOC;
  • инжектированная группа — до 4 преобразований из регистра JSQR. Она прерывает регулярную, у каждого результата свой регистр JDR1–JDR4, а из результата можно сразу вычесть смещение JOFRx — тогда он становится знаковым.

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

РежимБитыЧто делает
ОдиночныйCONT = 0одно преобразование по запуску
НепрерывныйCONT = 1следующее преобразование сразу после предыдущего
СканSCAN = 1обход всех каналов группы по порядку; с CONT = 1 — по кругу
ПрерывистыйDISCEN = 1по каждому запуску — следующие n каналов группы (n до 8)

В режиме скана регулярной группы нужен DMA: регистр данных один, и каждый новый результат затирает предыдущий (RM0008, раздел 11.3.8). Таблица каналов DMA для АЦП: у STM32F1 ADC1 обслуживает канал 1 DMA1, у STM32F4 — поток 0 или 4 DMA2, канал 0 — подробнее в статье о DMA STM32.

Запуск — программный или от внешнего события. У STM32F1 для ADC1 и ADC2 регулярную группу запускают TIM1_CC1, CC2, CC3, TIM2_CC2, TIM3_TRGO, TIM4_CC4, EXTI11 или программа (код EXTSEL = 111, бит SWSTART) при EXTTRIG = 1 (RM0008, 11.12.3). У STM32F4 выбор шире, и у внешнего запуска можно выбрать фронт — передний, задний или оба (поле EXTEN). Запуск по таймеру даёт выборки строго через равные промежутки времени, что нужно для цифровой фильтрации и спектрального анализа — как настроить таймер, описано в статье о таймерах STM32.

Включение и калибровка

У STM32F1 АЦП включается битом ADON регистра CR2, и первая запись единицы только выводит его из режима пониженного потребления. Через время стабилизации t_STAB — до 1 мкс (DS5319, таблица 47) — преобразование запускает повторная запись единицы в ADON (RM0008, раздел 11.3.1). Если в той же записи меняется любой другой бит CR2, преобразование не запускается: это защита от случайного старта при настройке регистра.

Калибровка снижает ошибки, вызванные разбросом ёмкостей внутреннего ЦАП: АЦП вычисляет поправку для каждого конденсатора и потом применяет её к каждому преобразованию (RM0008, раздел 11.4). Запускается она битом CAL, бит сбрасывается по окончании; длится 83 такта АЦП — 5,9 мкс при 14 МГц (DS5319, таблица 47). RM0008 рекомендует калибровать АЦП после каждого включения питания, причём перед калибровкой АЦП должен проработать с ADON = 1 хотя бы два такта. Бит RSTCAL предварительно сбрасывает старые калибровочные коды.

У STM32F4 самокалибровки нет (RM0090, раздел 13.2), а преобразование регулярной группы запускает бит SWSTART. Время включения t_STAB — до 3 мкс (DS8626, таблица 67).

Датчик температуры и VREFINT

Внутренний датчик температуры и источник опорного напряжения VREFINT подключены к каналам 16 и 17 АЦП1 и включаются битом TSVREFE (у STM32F1 — в ADC_CR2, у STM32F4 — в ADC_CCR). У STM32F42x/43x датчик температуры перенесён на канал 18 и делит его с измерением VBAT: одновременно включать их нельзя (RM0090, раздел 13.10).

ПараметрSTM32F103 (DS5319)STM32F407 (DS8626)
Напряжение датчика при 25 °C, V251,34–1,43–1,52 В0,76 В
Наклон Avg_Slope4,0–4,3–4,6 мВ/°C, напряжение падает с ростом температуры2,5 мВ/°C, напряжение растёт
Нелинейность±1, не больше ±2 °C±1, не больше ±2 °C
Время выборки датчикане меньше 17,1 мксне меньше 10 мкс
VREFINT1,16–1,20–1,24 В (−40…+85 °C)1,18–1,21–1,24 В
Заводская калибровканетTS_CAL1 (30 °C), TS_CAL2 (110 °C), VREFINT_CAL (30 °C), все при VDDA = 3,3 В

Значения — из таблиц 12 и 51 DS5319 и 69, 70, 72 и 73 DS8626. Формулы RM0008 и RM0090 учитывают знак наклона:

TF1=V25−VSENSEAvg_Slope+25,TF4=VSENSE−V25Avg_Slope+25.T_{F1} = \frac{V_{25} - V_{SENSE}}{Avg\_Slope} + 25, \qquad T_{F4} = \frac{V_{SENSE} - V_{25}}{Avg\_Slope} + 25.

Смещение характеристики у разных кристаллов различается до 45 °C (RM0008, раздел 11.10; RM0090, раздел 13.10), поэтому с типовыми V25 и наклоном датчик годится для отслеживания изменений температуры, а не для её абсолютного значения. У STM32F4 абсолютную точность повышают заводские калибровки: коды датчика при 30 и 110 °C записаны по адресам 0x1FFF 7A2C и 0x1FFF 7A2E, а код VREFINT при 30 °C — по адресу 0x1FFF 7A2A (DS8626, таблицы 70 и 73). Температура получается линейной интерполяцией между двумя точками:

T=30+(110−30)⋅DTS−TS_CAL1TS_CAL2−TS_CAL1,T = 30 + (110 - 30) \cdot \frac{D_{TS} - TS\_CAL1}{TS\_CAL2 - TS\_CAL1},

где DTS — код датчика, приведённый к VDDA = 3,3 В, при котором записаны калибровки. Само VDDA можно вычислить по VREFINT: VDDA=3,3 В⋅VREFINT_CAL/DVREFINTV_{DDA} = 3{,}3\ \text{В} \cdot VREFINT\_CAL / D_{VREFINT}.

Аналоговый сторож

Сторож сравнивает каждый результат с порогами HTR и LTR и ставит флаг AWD, если значение вышло за окно, — без участия программы (RM0008, раздел 11.3.7). Он может следить за одним каналом или за всеми каналами регулярной, инжектированной или обеих групп. Пороги сравниваются с 12-битным результатом до выравнивания. Так удобно ловить перегрузку по току или выход питания за пределы: прерывание приходит только тогда, когда значение действительно ушло из окна.

Двойной и тройной режимы

АЦП могут работать вместе: одновременно преобразовывать разные каналы — например, ток и напряжение одной фазы в один момент — или по очереди один канал, повышая частоту выборки. У STM32F1 это двойной режим ADC1 и ADC2 (поле DUALMOD), у STM32F4 — двойной и тройной (поле MULTI регистра ADC_CCR). При чередовании трёх АЦП STM32F407 на 30 МГц выдаёт до 6 миллионов выборок в секунду, двух — до 3,75, одного — 2 (DS8626, таблица 67). Результаты двух или трёх АЦП тогда забирают через общий регистр ADC_CDR и DMA.

Точность

Ошибка, младших разрядовSTM32F103: тип. / макс.STM32F407: тип. / макс.
Полная нескорректированная ET±1,3 / ±2±2 / ±5
Смещения EO±1,0 / ±1,5±1,5 / ±2,5
Усиления EG±0,5 / ±1,5±1,5 / ±3
Дифференциальная нелинейность ED±0,7 / ±1,0±1 / ±2
Интегральная нелинейность EL±0,8 / ±1,5±1,5 / ±3

Условия: у STM32F103 — f_ADC 14 МГц, сопротивление источника меньше 10 кОм, VDDA 3–3,6 В, 25 °C, после калибровки (DS5319, таблица 49); у STM32F407 — f_ADC 30 МГц, источник меньше 10 кОм, VDDA 1,8–3,6 В (DS8626, таблица 68). Ошибка ±5 младших разрядов — это около 4 мВ при опорном напряжении 3,3 В. Ошибки смещения и усиления постоянны для конкретного экземпляра и убираются калибровкой по двум известным напряжениям, а случайный шум уменьшают усреднением нескольких выборок.

Примеры на CMSIS

Непрерывный скан двух внешних каналов (PA0, PA1) и датчика температуры с DMA у STM32F103 при PCLK2 = 72 МГц:

#include "stm32f1xx.h"

static volatile uint16_t adc_buf[3];   /* IN0, IN1, IN16 (temperature) */

void adc1_scan_init(void)
{
    RCC->CFGR = (RCC->CFGR & ~RCC_CFGR_ADCPRE) | RCC_CFGR_ADCPRE_DIV6;   /* 72 / 6 = 12 MHz */
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_ADC1EN;
    RCC->AHBENR |= RCC_AHBENR_DMA1EN;

    /* PA0, PA1: analog mode (MODE = 00, CNF = 00) */
    GPIOA->CRL &= ~(GPIO_CRL_MODE0 | GPIO_CRL_CNF0 | GPIO_CRL_MODE1 | GPIO_CRL_CNF1);

    DMA1_Channel1->CPAR = (uint32_t)&ADC1->DR;
    DMA1_Channel1->CMAR = (uint32_t)adc_buf;
    DMA1_Channel1->CNDTR = 3;
    DMA1_Channel1->CCR = DMA_CCR_PL_1 | DMA_CCR_MSIZE_0 | DMA_CCR_PSIZE_0   /* 16-bit */
                       | DMA_CCR_MINC | DMA_CCR_CIRC | DMA_CCR_EN;

    ADC1->SMPR2 = (7U << ADC_SMPR2_SMP0_Pos) | (7U << ADC_SMPR2_SMP1_Pos);   /* 239.5 cycles */
    ADC1->SMPR1 = 7U << ADC_SMPR1_SMP16_Pos;      /* 239.5 cycles = 20 us >= 17.1 us */
    ADC1->SQR1 = 2U << ADC_SQR1_L_Pos;            /* 3 conversions */
    ADC1->SQR3 = (0U << ADC_SQR3_SQ1_Pos) | (1U << ADC_SQR3_SQ2_Pos) | (16U << ADC_SQR3_SQ3_Pos);
    ADC1->CR1 = ADC_CR1_SCAN;

    ADC1->CR2 = ADC_CR2_ADON | ADC_CR2_TSVREFE;   /* power up, wake the sensor */
    for (volatile int i = 0; i < 100; i++) {}     /* t_STAB: at least 1 us */
    ADC1->CR2 |= ADC_CR2_RSTCAL;
    while (ADC1->CR2 & ADC_CR2_RSTCAL) {}
    ADC1->CR2 |= ADC_CR2_CAL;
    while (ADC1->CR2 & ADC_CR2_CAL) {}

    /* continuous scan to DMA, software trigger (EXTSEL = 111) */
    ADC1->CR2 |= ADC_CR2_CONT | ADC_CR2_DMA | ADC_CR2_EXTTRIG | ADC_CR2_EXTSEL;
    ADC1->CR2 |= ADC_CR2_SWSTART;
}

Температура и напряжение питания по заводским калибровкам у STM32F407:

#include "stm32f4xx.h"

#define TS_CAL1     (*(const uint16_t *)0x1FFF7A2CU)   /* 30 C, VDDA = 3.3 V */
#define TS_CAL2     (*(const uint16_t *)0x1FFF7A2EU)   /* 110 C, VDDA = 3.3 V */
#define VREFINT_CAL (*(const uint16_t *)0x1FFF7A2AU)   /* 30 C, VDDA = 3.3 V */

static uint16_t adc1_read(uint32_t channel)
{
    ADC1->SQR3 = channel;                    /* one conversion: SQ1 */
    ADC1->CR2 |= ADC_CR2_SWSTART;
    while (!(ADC1->SR & ADC_SR_EOC)) {}
    return (uint16_t)ADC1->DR;               /* reading DR clears EOC */
}

void adc1_init(void)
{
    RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;
    ADC123_COMMON->CCR = ADC_CCR_ADCPRE_0 | ADC_CCR_TSVREFE;   /* PCLK2 / 4: 21 MHz at 84 MHz */
    ADC1->SMPR1 = (7U << ADC_SMPR1_SMP16_Pos) | (7U << ADC_SMPR1_SMP17_Pos);   /* 480 cycles */
    ADC1->CR2 = ADC_CR2_ADON;
    for (volatile int i = 0; i < 2000; i++) {}  /* t_STAB and the sensor start-up, up to 10 us */
}

float chip_temperature(float *vdda)
{
    float v = 3.3f * VREFINT_CAL / adc1_read(17);
    float ts = adc1_read(16) * v / 3.3f;      /* scale to the calibration VDDA */
    *vdda = v;
    return 30.0f + 80.0f * (ts - TS_CAL1) / (float)(TS_CAL2 - TS_CAL1);
}

Задержки в примерах — грубые циклы для наглядности; в рабочем коде их отмеряют таймером или счётчиком тактов DWT.

Частые ошибки

  • Вывод не в аналоговом режиме — цифровой входной каскад нагружает сигнал, у STM32F1 RM0008 прямо требует аналоговый режим для входов АЦП.
  • Скан без DMA — в DR остаётся только последний результат.
  • Слишком короткая выборка для высокоомного источника — код занижен; удлините SMPx или поставьте буфер.
  • Частота АЦП выше предела — у STM32F103 при PCLK2 = 72 МГц делитель 4 даёт 18 МГц, больше допустимых 14 МГц.
  • Нет калибровки у STM32F1 после включения.
  • Датчик температуры без задержки — после TSVREFE датчику нужно до 10 мкс на запуск, а выборка короче 17,1 мкс (у STM32F407 — 10 мкс) даёт неверный код.
  • Отрицательное напряжение на одном входе — искажает результаты остальных каналов.

Частые вопросы

Как измерить температуру встроенным датчиком STM32?

Подключите канал 16 (у STM32F42x/43x — 18), включите датчик битом TSVREFE и задайте долгую выборку: у STM32F103 не меньше 17,1 мкс, у STM32F407 — 10 мкс. У STM32F103 температура = (V25 − Vsense) / Avg_Slope + 25 с V25 = 1,43 В и Avg_Slope = 4,3 мВ/°C (типовые значения DS5319). У STM32F407 точнее пересчитать код по двум заводским калибровкам TS_CAL1 (30 °C) и TS_CAL2 (110 °C), записанным по адресам 0x1FFF 7A2C и 0x1FFF 7A2E.

Нужна ли калибровка АЦП STM32?

У STM32F1 — да: RM0008 рекомендует запускать самокалибровку битом CAL после каждого включения питания, она занимает 83 такта АЦП (5,9 мкс при 14 МГц) и заметно снижает ошибку. Перед калибровкой АЦП должен быть включён (ADON = 1) хотя бы два такта. У АЦП STM32F4 самокалибровки нет.

Почему АЦП STM32F103 не начинает преобразование?

Первая запись ADON = 1 только включает АЦП, преобразование запускает вторая запись единицы в ADON — или бит SWSTART, если в EXTSEL выбран код 111 и установлен EXTTRIG. Если в той же записи меняются другие биты CR2, преобразование не запускается: так RM0008 защищает от случайного старта.

Какая реальная точность АЦП STM32?

Полная нескорректированная ошибка у STM32F103 — типично ±1,3, не больше ±2 младших разрядов при 14 МГц, питании 3–3,6 В и сопротивлении источника до 10 кОм (DS5319, таблица 49). У STM32F407 — типично ±2, не больше ±5 младших разрядов при 30 МГц (DS8626, таблица 68). Из 12 бит гарантированно надёжны примерно 10.

Источники

  1. STMicroelectronics. RM0008 Rev 21. Reference manual: STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx — 11.2 — возможности АЦП; 11.3 — включение ADON, каналы, группы, режимы, сторож (таблица 66), скан и DMA, прерывистый режим; 11.4 — калибровка; 11.5 — выравнивание; 11.10 — датчик температуры и VREFINT; 11.12 — регистры: ADON, EXTSEL (111 — SWSTART)
  2. STMicroelectronics. RM0090 Rev 22. Reference manual: STM32F405/415, STM32F407/417, STM32F427/437 and STM32F429/439 — 13.2 — возможности АЦП; 13.5 и 13.7 — время преобразования и разрядность; 13.9 — двойной и тройной режимы; 13.10 — датчик температуры (IN16 у F40x/41x, IN18 у F42x/43x); 13.11 — VBAT
  3. STMicroelectronics. DS5319 Rev 20. STM32F103x8, STM32F103xB datasheet — таблица 12 — VREFINT; таблица 47 — характеристики АЦП (питание, f_ADC до 14 МГц, t_STAB, t_CAL, R_AIN, C_ADC); таблица 48 — R_AIN max; таблица 49 — точность; таблица 51 — датчик температуры
  4. STMicroelectronics. DS8626 Rev 12. STM32F405xx, STM32F407xx datasheet — таблица 67 — характеристики АЦП, частоты выборки в одиночном, двойном и тройном режимах; таблица 68 — точность, наведённый отрицательный ток; таблицы 69 и 70 — датчик температуры и TS_CAL1, TS_CAL2; таблицы 72 и 73 — VREFINT и VREFINT_CAL
  5. STMicroelectronics. STM32_open_pin_data — наличие выводов VREF+ и VREF− в корпусах STM32F103 и STM32F405/407

Нашли ошибку?