Столкнулся с интересной особенностью работы АЦП в микроконтроллерах STM32F40x.
Данные микроконтроллеры имеют три АЦП и для повышения частоты преобразований (дискретизации) можно организовать их совместную работу. Это позволит увеличить частоту в три раза соответственно.
В этом режиме работы АЦП целесообразно использовать контроллер прямого доступа к памяти (ПДП, DMA).
Для снижения количества транзакций ПДП за один запрос забирает сразу два преобразования АЦП, т.е. одна транзакция имеет размер четыре байта (слово), соответственно и запросы формируются через два преобразования.
Для лучшего понимания скриншот из документации:
Производитель предоставляет пример для данного режима на основе своих же библиотек. Ни чего особенного в них нет, последовательно настраиваются ПДП, АЦП и дается старт на начало преобразований:
Основной цикл:
При детальном анализе получаемых данных выявилась интересная особенность.
Если использовать для начала транзакций ПДП события от первого АЦП, то получаю “тройной” запрос на передачу данных для второго и третьего канала.
Как проверял.
Изменил режим работы ПДП с цикличного на нормальный, для оцифровки буфера один раз.
Разрешил прерывания по заполнению половины и полного буфера. Увеличил размер буфера.
В обработчике прерываний сразу после входа устанавливаю высокий уровень на тестовой линии, а при выходе низкий.
Сигнал с тестовой линии подал на вход АЦП и вход осциллографа.
Используя осциллограф определил длительность тестового импульса ~1,5 мкс.
Тактовая частота микроконтроллера 144 МГц, частота шины АЦП 72 МГц, делитель АЦП двойка – эти настройки позволяют получить максимальную частоту дискретизации 7,2 МГц при использовании трех АЦП.
Таким образом после оцифровки тестового сигнала должно получиться ~11 выборок АЦП.
Однако реально получил 23 выборки (скриншот STM Studio):
Для определения принадлежности данных к каналу АЦП решил изменить разрядность данных для каждого канала: АЦП1 – 12 бит, АЦП2 – 10 бит, АЦП3 – 8 бит.
Получилась вот такая странная картина (смещение влево и уменьшение отсчетов это результат изменения разрядности преобразований).
Ещё более интересный результат получается при использовании цикличного режима работы АЦП, там такую картину можно наблюдать только при размере буфера кратном трем, все остальные значения создают видимость нормальной работы.
В общем долго думая, смотря примеры и читая доку ни чего найти не смог, чтобы объяснило данное поведение АЦП.
В конечном итоге пришел к тому, что если привязывать транзакции ПДП к событиям второго АЦП, то во при любом делителе АЦП и размере буфера ПДП всегда получаю стабильные результаты.
Вот “правильное” преобразования при различной разрядности:
И для одинаковой разрядности 12 бит:
Имеем как и положено 11 выборок на тестовый импульс.