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

Калибровка АЦП STM32

Первое, что делает правильная программа после включения АЦП STM32F1, — калибровка. Она занимает меньше 6 мкс и убирает ошибку, которую дают неидеальные конденсаторы внутри АЦП. Пропустить её — значит получить смещённые результаты без видимой причины.

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

Калибровка АЦП у STM32F1 — встроенная процедура, которой АЦП измеряет погрешности собственных конденсаторов и потом сам вычитает их из каждого результата. АЦП последовательного приближения сравнивает вход с напряжениями, которые даёт набор конденсаторов; если их ёмкости отличаются от идеального двоичного ряда, появляются ошибки преобразования. При калибровке АЦП вычисляет для каждого конденсатора корректирующий код и при всех следующих преобразованиях убирает его вклад (RM0008, разд. 11.4).

Порядок

По RM0008 (разд. 11.4 и 11.12.3):

  1. Включить АЦП битом ADON в ADC_CR2 и выждать не меньше двух тактов АЦП.
  2. По желанию — сбросить прежние коды: поставить RSTCAL и дождаться, пока он сбросится аппаратно.
  3. Поставить бит CAL и ждать, пока он сбросится аппаратно — это конец калибровки.
  4. Отбросить содержимое ADC_DR: там лежит код калибровки, а не результат.

Время калибровки у STM32F103 — 83 такта АЦП, 5,9 мкс при 14 МГц (DS5319, табл. 47). ST рекомендует калибровать после каждого включения питания. В библиотеке HAL для STM32F1 это делает функция HAL_ADCEx_Calibration_Start(), её вызывают до первого запуска преобразований.

Что калибровка исправляет, а что нет

Калибровка убирает внутреннюю ошибку АЦП, связанную с разбросом конденсаторов, — это вклад в смещение и ошибку усиления и нелинейность (INL и DNL). Она не исправляет внешние источники: неточное опорное напряжение, шум питания, слишком короткое время выборки при высокоомном источнике сигнала. Разброс опорного напряжения учитывают отдельно, например через VREFINT.

Всё сказанное относится к АЦП STM32F1 по RM0008. У других серий STM32 блок АЦП другой, и порядок калибровки, если она есть, берут из руководства своей серии. Настройку АЦП STM32 по шагам и с расчётом частоты и времени выборки — в статье «АЦП STM32» и в калькуляторе АЦП STM32.

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

Сколько времени занимает калибровка?

У STM32F103 — 83 такта АЦП, то есть 5,9 мкс при максимальной частоте АЦП 14 МГц (DS5319, табл. 47). На медленной частоте АЦП пропорционально дольше. Конец калибровки программа узнаёт по сбросу бита CAL.

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

RM0008 рекомендует калибровку после каждого включения питания (разд. 11.4). Повторять её при работе не обязательно; наше мнение — имеет смысл перекалибровать после заметного изменения температуры или напряжения питания, если программа может позволить себе паузу в измерениях.

Почему после калибровки первый результат странный?

Потому что по окончании калибровки в регистр данных ADC_DR попадает код калибровки, а не результат преобразования (RM0008, разд. 11.4). Первое чтение после калибровки стоит выбросить или запустить новое преобразование и ждать его флага окончания.

Источники

  1. STMicroelectronics. RM0008 Reference manual STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx (Rev 21) — разд. 11.4: встроенная самокалибровка уменьшает ошибки от разброса конденсаторов; для каждого конденсатора вычисляется корректирующий код, и при всех последующих преобразованиях его вклад вычитается; запуск битом CAL в ADC_CR2, по окончании бит сбрасывается аппаратно; калибровку рекомендуется делать после каждого включения питания; коды калибровки появляются в ADC_DR; перед калибровкой АЦП должен быть включён (ADON = 1) не меньше двух тактов АЦП; рис. 26 — время tCAL; разд. 11.12.3: бит 3 RSTCAL инициализирует регистры калибровки и сбрасывается аппаратно, при установке во время преобразования нужны дополнительные такты; бит 2 CAL — запуск калибровки
  2. STMicroelectronics. DS5319 Datasheet STM32F103x8, STM32F103xB (Rev 20, July 2025) — табл. 47 ADC characteristics: время калибровки tCAL — 83 такта fADC, 5,9 мкс при fADC = 14 МГц

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