Пытаюсь понять АЦП STM32L4

Мне сложно понять, как работает АЦП STM32. Я хочу сделать что-нибудь простое, т.е. регулярно выполнять выборку и преобразование (@ 250 Гц) на 2 GPIO. На данный момент я сделал это "пустышкой": установил АЦП в базовый одиночный режим, затем запустил таймер @ 250 Гц и при каждом прерывании таймера запускал АЦП для преобразования только одной выборки на каждом канале. Но я не думаю, что это правильный способ, и меня беспокоит отсутствие точности с точки зрения времени между сэмплами. Не могли бы вы объяснить, как мне настроить АЦП для непрерывной выборки / преобразования с заданной частотой в течение заданного количества выборок? Я не нашел много полезных ресурсов в сети, а справочное руководство довольно сложное. Спасибо


person Guillaume Petitjean    schedule 24.04.2018    source источник


Ответы (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.

person followed Monica to Codidact    schedule 24.04.2018
comment
Я реализовал то, что вы предложили (кстати, большое спасибо за ваше время), и все работает нормально, за исключением одного. Я установил TIM15 в качестве триггера для АЦП. Я уже протестировал настройку этого таймера, и он ведет отсчет с правильной частотой: когда я запускаю только таймер, я получаю прерывание UIF таймера с правильной частотой, как и ожидалось. Я могу запустить последовательность выборки АЦП, но частота выборки (т. Е. Скорость, с которой я получаю IRQ АЦП) в два раза ниже, чем частота обновления таймера (у меня только один канал). - person Guillaume Petitjean; 26.04.2018
comment
Другими словами, я получаю прерывание ADC EOS только одно из двух обновлений таймера. Обновление таймера происходит каждые 5 секунд, поэтому выборка АЦП не является проблемой дольше, чем обновление таймера. - person Guillaume Petitjean; 26.04.2018
comment
Задам отдельный вопрос по этому поводу. - person Guillaume Petitjean; 26.04.2018
comment
@GuillaumePetitjean Сделай это. Разместите код, иначе было бы сложно догадаться, что пошло не так. - person followed Monica to Codidact; 27.04.2018