# Управление DC-мотором

{% hint style="info" %}
Предполагается, что вы изучили предыдущие уроки.
{% endhint %}

### Настройка выводов микроконтроллера

Ниже приведена конфигурация для нашего случая, в соответствии с описанием драйвера коллекторного двигателя *VBCore DC motor Driver 15A*.

<figure><img src="https://3551773033-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBjLyfPc4FcQUfXFi5fQr%2Fuploads%2FI2GolFxdOsIgFkUuqDX8%2F%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png?alt=media&#x26;token=7a69574f-27ae-4234-bf9b-a206e7cd9530" alt=""><figcaption><p>Конфигурация ножек в Cube IDE</p></figcaption></figure>

Выводы `SLEEP`, `Vref`, `TIM1_CH1`, `TIM1_CH2`, используются для управления силовой частью. Первые два -активизация и уровень блокировки по току – настроены как логические выходы (GPIO), их названия могут быть введены в настройках периферии GPIO. Другие два – выходы двух каналов таймера `TIM1` поступают в качестве ШИМ сигналов управления. Для движения двигателя один из этих сигналов, в зависимости от направления движения, устанавливается в высокий уровень (заданием длины импульса, равного периоду), а на втором генерируется ШИМ, чем короче длина импульса, тем больше среднее значение напряжения, подаваемого на двигатель.

Два канала таймера `TIM8 CH1` и `CH2` используются для считывания импульсов с квадратурного энкодера.

Выводы `I2C4_SCL` и `I2C4_SDA` – линии синхронизации (clock) и данных для связи с абсолютным магнитным энкодером *AS5600* по протоколу `I2C`.

`ADC1_IN7` – это вход аналого-цифрового преобразователя, который может быть использован для контроля тока, идущего через обмотки двигателя.

`LED1`, `LED2` – логические выходы (GPIO), позволяют мигать двумя светодиодами для визуального контроля работы.

`USART2_RX`, `USART2_TX` – выходы для организации обмена данными с внешним компьютером по стандартному порту COM, реализуемом как виртуальный на физическом разъеме USB.

### Настройка временных интервалов

Для управления двигателем постоянного тока существенными являются два интервала времени, а именно период ШИМ и период управления. Оба формируются таймерами, использующими системные часы. Поэтому существенны настройки системных часов. Можно не менять настройки по умолчанию, но учитывать конкретные значения, в частности, на рисунке ниже тактовая частота таймеров (`ARB1, ARB2 timer clocks`) равна 16 МГц.

<figure><img src="https://3551773033-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBjLyfPc4FcQUfXFi5fQr%2Fuploads%2FbzwoHUFQ9d3CT3LP79mG%2F%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%20%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%202023-09-15%20%D0%B2%2019.12.21.png?alt=media&#x26;token=1fe3d097-b465-4fd1-8e9f-921f65087d03" alt=""><figcaption></figcaption></figure>

### Настройка таймеров, формирующих ШИМ

Используются каналы 1 и 2 таймера `TIM1`, для которых выбирается режим `PWM Generation` (генерация ШИМ). Во вкладке **Parameter settings-> Counter settings** задаем `Prescaler=0, Counter period = 1000`. Первый задает предварительное деление частоты: 0 – без деления, 1 – деление в два раза и т.д . Второй задает период в системных тиках. При таких настройках получаем частоту ШИМ 16МГц/1/1000=16кГц. На этой частоте, возможно, двигатель будет создавать «свист». Если слышно, то частоту можно поднять уменьшением периода и выйти за порог восприятия человека (порядка 20 кГц). Остальные настройки можно оставить по умолчанию.

<figure><img src="https://3551773033-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBjLyfPc4FcQUfXFi5fQr%2Fuploads%2FUcGbiK5Znk1EHdt7qR7Y%2F%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png?alt=media&#x26;token=be2e63d1-fc3f-491d-a895-626a9af8f92c" alt=""><figcaption></figcaption></figure>

### Настройка такта управления

Используется первый канал `TIM2`. Настройки `Prescaler=49, Counter period = 320`. Длительность импульса можно взять произвольно, например, 50. Получаем частоту 16МГц/50/320=1кГц. Это будет частота управления, что означает, что каждую миллисекунду будут опрашиваться датчики и формироваться управляющий сигнал на двигатель. Таймер далее используется для генерирования прерываний, поэтому режим выбираем `PWM Generation No Output` и активируем прерывания **NVIC Interrupt Table -> TIM2 global interrupt -> Enabled**.

***

### Код управления

TODO
