Настройка ШИМ и энкодера

Таймер в режиме опроса энкодера

Это самое вкусное в stm32. На моторе у нас есть квадратурный магнитный энкодер — два датчика Холла, сдвинутых относительно друг друга так, что фронт одного попадает на середину импульса другого. Картинка покажет суть:

По сути, это обычные прямоугольные импульсы, которые могут быть отлично считаны GPIO микроконтроллера. Мы можем подключить оба канала энкодера к stm32, привязать соответствующие контакты контроллера к прерываниям и следить за фронтами этого сигнала.

Либо, мы можем настроить один из таймеров в режиме энкодера и ничего больше не городить. Так и сделаем.

Не выходя из Timers, переключаемся на TIM1. В поле Combined Channels выбираем Encoder Mode.

На вкладке параметров ничего менять не будем. Отметим лишь пару важных параметров.

Counter Period — это максимальное значение счетчика. То есть контроллер сможет отсчитать 65536 фронтов с обоих датчиков Холла, после чего произойдет переполнение и значение сбросится в 0.

Polarity — фронт, который будет отслеживать таймер. Выбран восходящий — Rising Edge.

Нас эти настройки устраивают, оставляем всё как есть.

Теперь вопрос. На сколько изменится значение счетчика энкодера при полном обороте вала? Чтобы на него ответить, обратимся к спецификации на мотор.

С одной стороны, магнитный диск энкодера имеет 7 полюсов. Когда этот полюс проносится мимо датчика, последний выдаёт импульс. Датчика два, так что будет два импульса на оборот. Таймер контроллера фиксирует передние фронты обоих импульсов и увеличиват счетчик на 2.

С другой стороны, у мотора есть редуктор. В нашем эксперименте участвует мотор с редуктором 1:100. Следовательно, каждый оборот внешнего вала, соответствует 100 оборотам магнитного колеса.

Таким образом, один оборот внешнего вала мотора вокруг своей оси даст прирост счетчика на:

7*2*100 = 1400

Запомним это число.

Настройка ШИМ для управления мотором

Вообще, о настройке ШИМ мы говорили в уроке про светодиод. Поэтому кратко.

Настраиваем ШИМ с максимальной частотой, поэтому в Prescaler указываем 0. Пусть, разрешение ШИМ будет 1000 отсчетов (для сравнения, у Ардуино 256). Если не хватит, всегда можем добавить.

Итоговая частот ШИМ будет:

72 000 000 / 1000 = 72 кГц

Опять сравним с Ардуино, там будет всего 980 Гц.

Больше ничего не трогаем, переходим к заключительной настройке.

GPIO для работы с логикой драйвера.

Для управления направлением вращения мотора мы подключили два контакта A1 и A2 от драйвера к микроконтроллеру на ножки PA4, PA5. Будем работать с ними как с обычными GPIO, о чём мы узнали из первого урока про управление светодиодом на stm32.

В левом меню переходим в пункт System Core и далее в раздел GPIO. Единственно, что мы можем тут сделать — это добавить псевдонимы для контактов. Можем назвать их, например, MDIR1 и MDIR2.

С настройкой закончили. Сохраняем конфигурацию, и IDE генерирует код-шаблон для нашей программы.


Изменено:

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

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

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