АЦП 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/B | STM32F405/407 | |
|---|---|---|
| Число АЦП | 2 (ADC1, ADC2) | 3 (ADC1–ADC3) |
| Разрядность | 12 бит | 12, 10, 8 или 6 бит (поле RES) |
| Частота f_ADC | 0,6–14 МГц | 0,6–36 МГц при VDDA 2,4–3,6 В, до 18 МГц ниже |
| Наименьшее время преобразования | 1 мкс (14 тактов при 14 МГц) | 0,5 мкс (15 тактов при 30 МГц) |
| Время выборки | 1,5–239,5 такта | 3–480 тактов |
| Питание VDDA | 2,4–3,6 В | 1,8–3,6 В |
| Внутренние каналы | 16 — датчик температуры, 17 — VREFINT | 16 (у 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, V25 | 1,34–1,43–1,52 В | 0,76 В |
| Наклон Avg_Slope | 4,0–4,3–4,6 мВ/°C, напряжение падает с ростом температуры | 2,5 мВ/°C, напряжение растёт |
| Нелинейность | ±1, не больше ±2 °C | ±1, не больше ±2 °C |
| Время выборки датчика | не меньше 17,1 мкс | не меньше 10 мкс |
| VREFINT | 1,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 учитывают знак наклона:
Смещение характеристики у разных кристаллов различается до 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). Температура получается линейной интерполяцией между двумя точками:
где DTS — код датчика, приведённый к VDDA = 3,3 В, при котором записаны калибровки. Само VDDA можно вычислить по 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.
Источники
- 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)
- 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
- 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 — датчик температуры
- STMicroelectronics. DS8626 Rev 12. STM32F405xx, STM32F407xx datasheet — таблица 67 — характеристики АЦП, частоты выборки в одиночном, двойном и тройном режимах; таблица 68 — точность, наведённый отрицательный ток; таблицы 69 и 70 — датчик температуры и TS_CAL1, TS_CAL2; таблицы 72 и 73 — VREFINT и VREFINT_CAL
- STMicroelectronics. STM32_open_pin_data — наличие выводов VREF+ и VREF− в корпусах STM32F103 и STM32F405/407
Нашли ошибку?
Смотрите также
- АЦП STM32: время и выборкаВремя преобразования, частота выборок, RAIN и самая короткая выборка
- АЦПКвантование, формула кода, SAR, время выборки, погрешности, передискретизация
- DMA STM32Каналы и потоки, запросы периферии, кольцо, двойной буфер, FIFO, флаги, примеры
- Таймеры STM32Тактирование, PSC/ARR, ШИМ, мёртвое время, захват, энкодер, OPM, синхронизация
- GPIO STM32Режимы выводов, регистры F1 и F4, BSRR, AF, скорость, токи, 5 В, код
- STM32F1Cortex-M3: F100, F101, F102, F103, F105/107 — линейки и распиновки
- STM32F4Cortex-M4 с FPU: от F401 и F411 до F429 и F469 — линейки и распиновки