Мне сложно понять, как работает АЦП STM32. Я хочу сделать что-нибудь простое, т.е. регулярно выполнять выборку и преобразование (@ 250 Гц) на 2 GPIO. На данный момент я сделал это "пустышкой": установил АЦП в базовый одиночный режим, затем запустил таймер @ 250 Гц и при каждом прерывании таймера запускал АЦП для преобразования только одной выборки на каждом канале. Но я не думаю, что это правильный способ, и меня беспокоит отсутствие точности с точки зрения времени между сэмплами. Не могли бы вы объяснить, как мне настроить АЦП для непрерывной выборки / преобразования с заданной частотой в течение заданного количества выборок? Я не нашел много полезных ресурсов в сети, а справочное руководство довольно сложное. Спасибо
Пытаюсь понять АЦП STM32L4
Ответы (1)
Последовательности регулярных или внедренных конверсий
Каждый АЦП может обрабатывать два списка каналов для преобразования: обычную последовательность с 16 каналами (_1 _-_ 2_) и введенную последовательность с 4 каналами (JSQR
).
Одно из основных отличий заключается в том, что при обычном преобразовании все результаты сохраняются в едином общем регистре данных (DR
), который должен быть считан и сохранен до завершения следующего шага преобразования. Когда есть более одного канала в регулярной последовательности, лучше всего использовать DMA для хранения результатов преобразования. Поскольку вы хотите чего-то простого, я не буду сейчас вдаваться в DMA.
Введенная последовательность преобразования сохраняет каждый результат в своем собственном регистре (_5 _-_ 6_ или JDR[4]
), затем программное обеспечение может считывать результаты после завершения последовательности, что можно обнаружить, опросив бит JEOS
в регистре ISR
или разрешив прерывание. с битом JEOSIE
в IER
.
Возможно запускать введенную последовательность автоматически, когда обычная последовательность завершена (JAUTO
бит в CFGR
), таким образом можно запустить 5 преобразований подряд на каждом блоке АЦП и получить результаты в разных регистрах в конце.
Регулярное начало конверсии
Вместо того, чтобы запускать преобразование каждый раз программно, вы можете установить таймер для непосредственного запуска последовательности преобразования АЦП.
Сначала см. Главу Преобразование внешнего триггера и полярности триггера (EXTSEL, EXTEN, JEXTSEL, JEXTEN) в справочном руководстве. Есть списки возможных триггерных событий для обычных и введенных последовательностей. Выберите событие TRGO из таблицы, установите EXTSEL
и EXTEN
или JEXTSEL
и JEXTEN
соответственно.
Возможно, вы захотите включить прерывание в конце последовательности (EOSIE
или JEOSIE
в IER
), чтобы уведомить программное обеспечение о завершении последовательности.
Включите АЦП, установив ADEN
и ADSTART
или JADSTART
в CR1
, преобразование начнется после поступления триггера от таймера.
Запрограммируйте таймер, который вы выбрали из приведенной выше таблицы, на желаемую частоту и установите биты MMS
в CR2
на 010
(Обновление). Каждое переполнение (обновление) таймера генерирует событие запуска, запускающее следующую последовательность преобразования АЦП. Разрешать прерывание по таймеру не обязательно.
Использование дополнительных блоков АЦП
Если в вашем контроллере несколько блоков АЦП, вы можете запускать их одновременно, используя один и тот же триггер на каждом из них. Таким образом, вы можете выполнять 2 или 3 преобразования одновременно или запускать до 15 преобразований и сразу получать результаты без использования DMA.