EdigE
← ЛЕНТА

STM32F207 запускает 12-битный ADC 2 млн раз в секунду — вне паспорта

Осциллографу нужно успеть увидеть короткий фронт, оставить несколько отсчётов до события и не утонуть в потоке данных, пока пользователь ищет причину сбоя. Проект BTTLab собирает эту механику из периферии STM32F207: ADC1 слушает PA6, TIM2 отбивает ритм преобразований, DMA пишет кольцевой буфер, а код ищет rising edge с гистерезисом и формирует окно с pre-trigger-участком.

Частота 2 MHz здесь получается без магии. Контроллер тактируется от HSI 16 MHz через PLL до 120 MHz. Шина APB1 делится на четыре, однако таймеры на этой шине при таком делителе получают удвоенную частоту: TIM2 работает от 60 MHz. При ARR=29 его update-событие приходит через 30 тактов, ровно 2 млн раз в секунду, и это событие TRGO стартует ADC.

Сам АЦП получает 30 MHz от PCLK2/2. В коде выбраны 12 бит и минимальное время выборки в три цикла. Вместе с преобразованием это 15 тактов ADC, или 0.5 мкс на отсчёт. Расчёт сходится с пределом 2 MSPS для одиночного 12-битного ADC, который ST приводит для STM32F205/207 при частоте ADC 30 MHz. Такой режим особенно уместен для просмотра цифровых шин, PWM, медленных интерфейсов и поиска редких выбросов; автор ориентируется примерно на 200 kHz, чтобы на период приходилось около десяти точек.

Однако в этой красивой арифметике скрыт важный разрыв. Тот же даташит ST задаёт максимальную частоту внешнего запуска 1764 kHz для 12-битного ADC при 30 MHz. Прошивка действительно формирует 2-MHz TRGO, но этот режим уже нельзя называть гарантированным паспортным захватом. Нужны измерения реального темпа, пропусков, джиттера апертуры, ENOB, линейности и спектральных искажений. Двенадцать бит в регистре ADC ещё ничего не говорят о двенадцати полезных битах на разъёме прибора.

BTTLab / YouTube; опубликовано Hackaday

Вторая граница проходит по интерфейсу с компьютером. При 2 MSPS поток 16-битных слов потребовал бы около 4 MB/s без служебных байтов. USART3 работает на 921600 бод и может отдать примерно 92 kB/s полезных данных при 8N1. Поэтому это capture scope: DMA непрерывно заполняет память, код находит событие, а UART передаёт уже выбранный фрагмент. Для отладки именно такая архитектура часто оказывается достаточной: важен снимок вокруг фронта, а не бесконечная лента отсчётов.

Самое опасное место пока лежит перед PA6. В актуальном репозитории нет готового входного front-end: отсутствуют реализованные аттенюатор, AC-связь, смещение в середину диапазона, ограничение тока и защита от энергии входного сигнала. ADC STM32 принимает только диапазон от 0 до VREF+. Отрицательное напряжение, 5-V логика или щуп у силовой части без внешней защиты способны закончить эксперимент повреждённым выводом микроконтроллера. Поэтому проект ценен как прозрачный каркас захвата: он честно показывает, где заканчиваются таймер, DMA и прошивка, а где начинается приборостроение.

Источники и проверка: первичный репозиторий BTTLab «stm32osc1ch», исходник firmware/Core/Src/main.c и конфигурация OSCILLOSCOPE_V1.ioc подтверждают параметры таймера, ADC и DMA. Пределы ADC и внешнего триггера сверены с даташитом STMicroelectronics DS6329 для STM32F205/207; правило удвоения частоты таймеров на APB — с reference manual RM0033. Демонстрация проекта опубликована BTTLab, редакционный обзор вышел на Hackaday 19 августа 2026 года.