STM32 та введення аналогових сигналів АЦП
У мікроконтролерах STM32 є потужний модуль АЦП, який має дійсно гарні характеристики та цікаві особливості:
- 18 каналів введення (16 зовнішніх та 2 внутрішніх)
- роздільна здатність 12 біт
- всілякі режими перетворення:
- одноразове
- безперервне
- по тригеру
- за таймером
- зручне вирівнювання бітів результату
- звичайно ж, генерування всіляких переривань та сигналів для DMA
- швидкість оцифрування - до 0.9 MSPS з програмованим часом захоплення та перетворення
- автокалібрування
- режим сканування входів за списком
- аналоговий вотчдог
Необхідність у цьому модулі виникає часто: просто тому, що природа довкола нас не дискретна, а безперервна, і всілякі датчики зазвичай видають саме аналоговий сигнал. Особливо це стосується звуку, але так само можна зробити і, наприклад, осцилограф: популярний китайський USB-осцилограф DSO Nano зроблений саме на STM32F103.
Внутрішня будова

Вимірювання та опорні напруження
Принцип оцифрування дуже простий: вхідна напруга порівнюється з опорною напругою V_REF- і V_REF+:
- V_REF - потрібно підключити до землі
- V_REF+ за бажанням: або до живлення процесора (воно плаваюче і галасливе, тому цей варіант годиться тільки для неточних вимірювань), або до зовнішнього джерела опорної напруги (ІОН)
Втім, є можливість програмно налаштувати ці ноги на пряме з'єднання із землею та живленням.
Вхідна напруга V_In буде виміряна щодо V_REF- і V_REF+, і результат перетворення складний у вихідний регістр у такій пропорції:
| Напруга | Результат |
| V_Ref- | |
| V_In | V_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)
Практика: включаємо АЛП
Найпростіший випадок використання АЦП: без переривань, без усіляких складних режимів – просто беремо та вимірюваємо у циклі.
Ініціалізація
- Включаємо тактування модуля АЦП
- Налаштовуємо параметри модуля
- Включаємо модуль АЦП
- Налаштовуємо вхід (номер каналу АЦП)
- Проводимо калібрування
Я виходжу з того, що ніжки кристала не налаштовані,тобто перебувають у дефолтному стані «аналоговий вхід». Саме цей режим нам і потрібний.
Тільки деякі ноги STM32 можуть працювати як вход АЦП, вони позначені символом ANx (x = 0..15, ця цифра - номер каналу). Це зручно прикидати у програмі STM32Cube.
Після виконання цієї функції АЦП1 налаштований, калібрований і готовий до вимірювань на восьмому каналі.
Вимірювання проводиться просто:
- Запускаємо перетворення
- Очікуємо закінчення оцифрування (перевіряємо прапор EOC = End Of Conversion)
- Читаємо результат з регістру DR
Найпростіше використання цих функцій:
Можна просто запустити програму, зупинити її брейкпойнтом та прочитати у відладчику виміряне значення.