STM32 та введення аналогових сигналів АЦП

У мікроконтролерах STM32 є потужний модуль АЦП, який має дійсно гарні характеристики та цікаві особливості:

  • 18 каналів введення (16 зовнішніх та 2 внутрішніх)
  • роздільна здатність 12 біт
  • всілякі режими перетворення:
  • одноразове
  • безперервне
  • по тригеру
  • за таймером
  • зручне вирівнювання бітів результату
  • звичайно ж, генерування всіляких переривань та сигналів для DMA
  • швидкість оцифрування - до 0.9 MSPS з програмованим часом захоплення та перетворення
  • автокалібрування
  • режим сканування входів за списком
  • аналоговий вотчдог

Необхідність у цьому модулі виникає часто: просто тому, що природа довкола нас не дискретна, а безперервна, і всілякі датчики зазвичай видають саме аналоговий сигнал. Особливо це стосується звуку, але так само можна зробити і, наприклад, осцилограф: популярний китайський USB-осцилограф DSO Nano зроблений саме на STM32F103.

Внутрішня будова

stm32

Вимірювання та опорні напруження

Принцип оцифрування дуже простий: вхідна напруга порівнюється з опорною напругою V_REF- і V_REF+:

  • V_REF - потрібно підключити до землі
  • V_REF+ за бажанням: або до живлення процесора (воно плаваюче і галасливе, тому цей варіант годиться тільки для неточних вимірювань), або до зовнішнього джерела опорної напруги (ІОН)

Втім, є можливість програмно налаштувати ці ноги на пряме з'єднання із землею та живленням.

Вхідна напруга V_In буде виміряна щодо V_REF- і V_REF+, і результат перетворення складний у вихідний регістр у такій пропорції:

НапругаРезультат
V_Ref-
V_InV_In / (V_Ref+ - V_Ref-) * 4096
V_Ref+4096

Наприклад, 1.2 при живленні АЦП від 3.3 перетворюються на 1490.

Реєстри АЦП у STM32

SR - регістр статусу

0 біт: прапор AWD (Analog Watchdog). Вхідний сигнал перетнув значення регістрів LTR або HTR.

1 біт: прапор EOC (End Of Conversion). Після закінчення перетворення перемикається на 1. Скидається вручну або під час читання регістра DR.

4 біти: прапор STRT (Start). Сигналізує початок перетворення.

CR1 - перший регістр налаштувань

0..4 біти: значення AWDCH (Analog WatchDog Channel). Задає номер каналу для стеження з дочкою.

5 біт: EOCIE (End Of Conversion Interrupt Enable). Включає переривання після закінчення перетворення.

6 біт: AWDIE (Analog WatchDog Interrupt Enable). Включає переривання зі спрацювання аналогового вотчдогу.

8 біт: SCAN. Включає режим сканування каналів за списком у регістрах SQR1, SQR2, SQR3.

9 біт: AWDSGL (Analog WatchDog Single). Задає тип спрацьовування вотчдога в режимі SCAN: на один канал (1) або всі (0).

11 біт: DISCEN (Discontinious mode Enabled). Включає «рваний» режим роботи — АЦП включається за зовнішнім тригером.

13..15 біти: DISCNUM (Discontinious mode Number of channels). Кількість каналів для перетворення в рваному режимі.

16..19 біти: DUALMOD (Dual Mode selection). Задає режим співпраці двох АЦП.

23 біт: AWDEN (Analog WatchDog Enabled). Включає аналоговий вотчдог.

CR2 - другий регістр налаштувань

0 біт: ADON (Analog/Digital converter On/off). Включає АЦП.

1 біт: CONT (Continious coversion). Вмикає режимодноразового (0) або зациклених вимірів (1).

2 біти: CAL (Calibration). Установка 1 включає калібрування; після калібрування скидається в 0. Спочатку потрібно скинути регістри.

3 біт: RSTCAL (Reset Calibration). Скидання регістрів калібрування, так само встановлюємо в 1 і чекаємо скидання.

8 біт: DMA. Вмикає DMA.

11 біт: ALIGN. Вирівнює дані з правого (0) або лівого (1) краю регістру.

12..14 біт: JEXTSEL.

15 біт: JEXTTRIG.

17..19 біт: EXTSEL (External event Select). Призначає номер запуску (TIM1 CC1, TIM1 CC2, TIM1 CC3, TIM1 CC4, TIM3 TRGO, TIM4 CC4, EXTI_11, SWSTART).

20 біт: EXTTRIG (External Trigger). Включає запуск перетворення зовнішнього тригера.

21 біт: JSWSTART.

22 біт: SWSTART (Start conversion). Запускає перетворення. Після закінчення скидається.

23 біт: TSVREFE (Temp sensor and V_REF Enabled). Включає температурний сенсор та внутрішній ІОН.

DR - регістр результату вимірювання

SMPR1, SMPR2 - час перетворення

Регістр налаштування часу перетворення для кожного каналу.

HTR і LTR - межі вотчдога

Верхня і нижня межі для аналогового вотчдога, аналогічні регістру DR.

SQR1, SQR2, SQR3 – список каналів для сканування

Режим SCAN (біт SCAN у регістрі CR1)

Практика: включаємо АЛП

Найпростіший випадок використання АЦП: без переривань, без усіляких складних режимів – просто беремо та вимірюваємо у циклі.

Ініціалізація

  1. Включаємо тактування модуля АЦП
  2. Налаштовуємо параметри модуля
  3. Включаємо модуль АЦП
  4. Налаштовуємо вхід (номер каналу АЦП)
  5. Проводимо калібрування

Я виходжу з того, що ніжки кристала не налаштовані,тобто перебувають у дефолтному стані «аналоговий вхід». Саме цей режим нам і потрібний.

Тільки деякі ноги STM32 можуть працювати як вход АЦП, вони позначені символом ANx (x = 0..15, ця цифра - номер каналу). Це зручно прикидати у програмі STM32Cube.

Після виконання цієї функції АЦП1 налаштований, калібрований і готовий до вимірювань на восьмому каналі.

Вимірювання проводиться просто:

  1. Запускаємо перетворення
  2. Очікуємо закінчення оцифрування (перевіряємо прапор EOC = End Of Conversion)
  3. Читаємо результат з регістру DR

Найпростіше використання цих функцій:

Можна просто запустити програму, зупинити її брейкпойнтом та прочитати у відладчику виміряне значення.