Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кармин Новиелло - Освоение STM32.pdf
Скачиваний:
2743
Добавлен:
23.09.2021
Размер:
47.68 Mб
Скачать

Таймеры

353

Функция MX_TIM1_Init() конфигурирует таймер TIM1 таким образом, чтобы его каналы OC1 и OC2 работали в режиме сравнения выходного сигнала, переключая их выход каждые 20 мкс. Два выхода сдвинуты по фазе установкой двух разных значений Pulse (строки 98 и 106). Функция MX_TIM3_Init() конфигурирует значение TIM3 в режиме эн-

кодера X4 (TIM_ENCODERMODE_TI12).

Функция main() разработана таким образом, чтобы каждые 1000 тиков таймера SysTick (который сконфигурирован на генерацию тика каждую 1 мс) текущее содержимое регистра счетчика (cnt2) сравнивалось с сохраненным значением (cnt1): в соответствии с направлением вращения энкодера (вверх или вниз), вычисляется разница и вычисляется скорость. Код должен также обнаруживать возможное переполнение/опустошение счетчика и соответственно вычислять разницу. Также обратите внимание, что, поскольку мы выполняем сравнение каждую секунду, TIM1 должен быть сконфигурирован так, чтобы сумма импульсов, генерируемых каналами A и B, была меньше 65535 в секунду. По этой причине мы замедляем TIM1, устанавливая Prescaler равным 9. Наконец, строки [76:83] инвертируют фазовый сдвиг между A и B (то есть каналы OC1 и OC2 таймера TIM1), когда нажимается пользовательская кнопка USER платы Nucleo.

11.3.9.1. Использование CubeMX для конфигурации режима энкодера

Чтобы включить режим энкодера при помощи CubeMX, первым шагом является включение данного режима из выпадающего списка Combined Channels, как показано на рисунке 34. Затем, из представления конфигурации TIMx (здесь не показано), можно сконфигурировать параметры других каналов.

Рисунок 34: Как включить Режим энкодера в таймере

11.3.10.Другие функции, доступные в таймерах общего назначения и расширенного управления

Рассматриваемые до сих пор функции представляют собой наиболее распространенное использование таймера. Тем не менее, таймеры общего назначения и расширенного управления STM32 предоставляют другие важные функции, довольно полезные в некоторых специфических прикладных областях. Сейчас мы дадим краткий обзор этих дополнительных функций. Поскольку данные функциональные возможности имеют общие понятия, встречающиеся в других приложениях, показанных в предыдущих параграфах, мы не будем вдаваться в подробности этих тем (особенно из-за того, что не так легко организовать примеры без соответствующего оборудования).

Таймеры

354

11.3.10.1. Режим датчика Холла

В коллекторном двигателе постоянного тока щетки управляют коммутацией, физически соединяя катушки в нужный момент. В бесколлекторных (бесщеточных) двигателях по-

стоянного тока (Brush-Less DC, BLDC) коммутация управляется электроникой при помощи ШИМ. Электроника может иметь либо входы датчиков положения, которые предоставляют информацию о том, когда коммутировать, либо использовать обратную электродвижущую силу (BEF), генерируемую в катушках. Датчики положения чаще всего используются в тех случаях, когда пусковой крутящий момент сильно варьируется или когда требуется высокий начальный крутящий момент. Датчики положения также часто используются в приложениях, где двигатель используется для позиционирования.

Датчики с эффектом Холла, или просто датчики Холла, используются в основном для вычисления положения трехфазных BLDC двигателей (по одному датчику на каждой фазе). Таймеры общего назначения STM32 могут быть запрограммированы для работы в режиме датчика Холла. Установив первые три входа в режиме XOR, можно автоматически определять положение ротора.

Это делается с использованием таймеров расширенного управления (TIM1) для генерации ШИМ-сигналов управления двигателем и другого таймера (например, TIM3), называемого «таймером сопряжения». Этот «таймер сопряжения» захватывает три входных вывода таймера (CC1, CC2, CC3), подключенных через XOR к входному каналу TI1 (см. рисунок 16). TIM3 находится в режиме ведомого, сконфигурированном в режиме сброса; ведомым входом является TI1F_ED38. Таким образом, каждый раз, когда один из 3 входов переключается, счетчик перезапускает отсчет с 0. Это создает временной отсчет, запущенный любым изменением входов режима датчика Холла.

В «таймере сопряжения» (TIM3) канал 1 захвата/сравнения сконфигурирован в режиме захвата, сигнал захвата – TRC (см. рисунок 16 – TRC выделен красным). Полученное значение, которое соответствует времени, прошедшему между 2 изменениями на входах, дает информацию о скорости двигателя. «Таймер сопряжения» может использоваться в режиме выхода для генерации импульса, который изменяет конфигурацию каналов таймера расширенного управления (TIM1) (запуском события подключения COM). Таймер TIM1 используется для генерации ШИМ-сигналов управления двигателем. Для этого канал «таймера сопряжения» должен быть запрограммирован так, чтобы после запрограммированной задержки генерировался положительный импульс (в режиме сравнения выходного сигнала или в режиме ШИМ). Этот импульс отправляется на таймер расширенного управления (TIM1) через выход TRGO.

11.3.10.2.Комбинированный режим трехфазной ШИМ и другие функции управления двигателем

Семейство STM32F3 предназначено для продвинутых преобразования мощности и управления двигателем. Некоторые микроконтроллеры STM32F3, в частности STM32F30x и STM32F3x8, предоставляют возможность генерировать от одного до трех центрированных ШИМ-сигналов с помощью одного программируемого сигнала AND, включенного в середине импульсов. Кроме того, они могут генерировать до трех комплементарных выходов с введением мертвого времени. Эти функции, в дополнение к режиму датчика Холла, описанному ранее, позволяют создавать электронные

38 ED – это аббревиатура Edge Detector – детектор фронта, и это вход таймера с внутренней фильтрацией, включаемый, когда только один из трех входов в XOR имеет ВЫСОКИЙ уровень.

Таймеры

355

устройства, подходящие для управления двигателем. Для получения дополнительной информации об этом, обратитесь к AN401339 от ST.

11.3.10.3. Вход сброса таймера и блокировка регистров таймера

Вход сброса таймера (Break input) является аварийным входом в приложении управления двигателем. Функция сброса таймера (break function) защищает силовые ключи, управляемые ШИМ-сигналами, генерируемыми таймерами расширенного управления. Вход сброса таймера обычно подключается к выходам отказа (fault outputs) силовых каскадов и 3-фазных инверторов. При активации цепь сброса таймера (break circuitry) отключает выходы TIM и устанавливает их в предопределенное безопасное состояние.

Более того, таймеры расширенного управления обеспечивают постепенную защиту (gradual protection) своих регистров, программируя биты LOCK в регистре BDTR. Доступны три уровня блокировки, которые выборочно запирают регистры таймера. Для получения дополнительной информации обратитесь к справочному руководству по вашему микроконтроллеру.

11.3.10.4. Предварительная загрузка регистра автоперезагрузки

Мы оставили непрокомментированным один момент из рисунка 16. Регистр автоперезагрузки (Auto-Reload Register, ARR) графически представлен с тенью. Это происходит потому, что он предварительно загружен, то есть при записи или чтении регистра ARR происходит доступ к регистру предварительной загрузки (preload register). Содержимое регистра предварительной загрузки передается в теневой регистр (англ. shadow register, то есть в регистр, внутренний для таймера, который фактически содержит значение сопоставления для счетчика) непрерывно или при каждом событии UEV, если и только если установлен бит предварительной загрузки автоперезагрузки (auto-reload preload bit, APRE)

в регистре TIMx->CR1. Если это так, событие UEV может быть сгенерировано с установкой соответствующего бита в регистре TIMx->EGR: это приведет к тому, что содержимое регистра предварительной загрузки будет передано в теневой, и новое значение будет учтено таймером. Очевидно, что если вы остановите таймер, вы можете свободно изменять содержимое регистра ARR.

Это важный для уточнения аспект. Когда таймер остановлен, мы можем сконфигурировать регистр ARR с помощью структуры TIM_Base_InitTypeDef.Period: содержимое поля Period передается в регистр TIMx->ARR с помощью функции HAL_TIM_Base_Init(). Это приведет к тому, что будет сгенерировано событие UEV, и, если разрешен, сработает соответствующий IRQ. Важно отметить, что это происходит, даже когда таймер сконфигурирован впервые с момента сброса периферийного устройства. Давайте рассмотрим этот код:

htim6.Instance = TIM6;

htim6.Init.Prescaler = 47999; // 48 МГц / 48000 = 1 кГц htim6.Init.Period = 4999; // 1 кГц / 5000 = 5 с htim6.Init.CounterMode = TIM_COUNTERMODE_UP;

__TIM6_CLK_ENABLE();

HAL_NVIC_SetPriority(TIM6_IRQn, 0, 0);

39 http://www.st.com/web/en/resource/technical/document/application_note/DM00042534.pdf