Настройка АЦП, DMA и таймера

Со сборкой макета закончили, приступаем к программированию. Начнём с настройки контактов контроллера в конфигураторе среды. Ниже приведен окончательный вид настроенной периферии.

В сумме, мы должны настроить:

  • вспомогательные вещи: контакты программатора и тактирование;
  • АЦП контроллера, чтобы считывать показания потенциометра;
  • связь АЦП с DMA контроллером, чтобы не тратить время на опрос АЦП;
  • запуск АЦП по таймеру;
  • таймер в режиме опроса энкодера;
  • ШИМ выход для управления скоростью мотора;
  • GPIO для работы с логикой драйвера.

А теперь пройдёмся по каждой настройке отдельно.

Настройка контактов программатора и отладчика

Начнём с настроек контактов программатора, как в самом первом уроке про STM32 и CubeIDE. Для этого, слева на вкладке Categories переходим в меню System Core, далее в раздел SYS. В поле Debug выбираем Serial Wire.

Теперь контакты PA13 и PA14 будут зарезервированы для программатора. Эта настройка позволит нам забыть про лишние манипуляции при загрузке программы на контроллер в будущем.

Внешнее тактирование

Второй шаг — настройка внешнего тактирования. В меню System Core выбираем RCC и выбираем в поле High Speed Clock (HSE) — кварцевый/керамический резонатор.

Теперь настроим схему тактирования. Разгоним микроконтроллер до 72 МГц.

Со служебными настройками разобрались, переходим к сути.

Настройка АЦП для потенциометра

Согласно нашей схеме, центральный контакт потенциометра мы подключили к ножке PA1. Кликаем по этой ножке в конфигураторе и выбираем режим ADC_IN1.

Заходим в навигаторе в меню Analog и далее в раздел ADC1. Наша задача, запускать АЦП по таймеру, с определённой частотой. Ищем в параметрах настройки АЦП пункт External Trigger Conversion Source. Указываем там Timer 2 Capture Compare 2 event.

Теперь АЦП преобразования будут запускаться каждый раз при наступлении события сравнения на втором канале таймера №2.

Настройка DMA

В действительности, при данных обстоятельствах в DMA нет необходимости. Получать данные из АЦП можно и через опрос (polling), с помощью функции HAL_ADC_PollForConversion. Но в образовательных целях, будем разбираться с DMA.

Итак. Не выходя из раздела ADC1, Заходим на вкладку DMA Settings и жмём кнопку ADD. Появится раздел с настройками DMA, в котором поменяем только режим на Circular.

Размер данных менять не нужно. АЦП у нас 12-разрядное, а значит Half Word (16-разрядов) нам вполне подходит.

Настройка таймера №2

Этот таймер будет не просто запускать преобразования АЦП, он будет задавать темп всей процедуре управления. Частоту его срабатывания можно увеличить или уменьшить, в зависимости от потребностей задачи.

Заходим в меню Timers и далее в раздел TIM2. В поле Clock Source выбираем источник опорной частоты: Internal Clock. Это будет означать, что таймер получит тактирование от шины APB1. Как видно на схеме тактирования, таймеры, привязанные к шине APB1 имеют частоту 72 МГц.

Мы указали в настройках АЦП второй канал данного таймера как источник импульса. Выбираем в поле Channel2 режим Output Compare No Output. Это означает, что на втором канале таймера будут генерироваться сигналы сравнения, но ни на какие контакты они передаваться не будут.

Пусть счётчик таймера осуществляет сравнение с частотой 50 Гц. То есть каждые 20 мс. Для этого в поле Prescaler (предделитель) укажем 7200-1, а в поле Counter Period200-1. Таким образом, итоговая частота сравнения будет:

72 000 000 / (7200*200) = 50

Нужные нам 50 Гц.

Фуф, с частотами разобрались. Идём дальше.


Изменено:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.