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

Таймеры

336

Рисунок 22: Канал 2 сконфигурирован на вдвое большее переключение, чем канал 1

Тот же результат может быть получен с использованием режима DMA и предварительно инициализированного вектора, в конечном итоге сохраненного во Flash-память при использовании модификатора const:

const uint16_t ch1IV[] = {320, 640, 960, ...};

...

HAL_TIM_OC_Start_DMA(&htim3, TIM_CHANNEL_1, (uint32_t)ch1IV, sizeof(ch1IV));

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

Процесс конфигурации режима сравнения выходного сигнала в CubeMX идентичен процессу конфигурации режима захвата входного сигнала. Первым шагом является выбор режима Output compare CHx для желаемого канала, как показано на рисунке 19. Далее, из представления конфигурации TIMx (здесь не показано), можно сконфигурировать другие параметры сравнения выходного сигнала (режим выхода, полярность канала и т. д.).

11.3.7. Генерация широтно-импульсного сигнала

Все прямоугольные сигналы, генерируемые до сих пор, обладают одной общей характеристикой: они имеют период TВКЛ , равный периоду TВЫКЛ . Это также говорит о том, что

они имеют коэффициент заполнения 50%. Коэффициент заполнения (или рабочий цикл, англ. duty cycle) 31 – это процент от одного периода времени (например, 1 с), в течение которого сигнал активен. В качестве формулы коэффициент заполнения выражается как:

D =

TВКЛ

100% [8]

Период

 

 

где D – коэффициент заполнения, TВКЛ – время, в течение которого сигнал активен. Та-

ким образом, коэффициент заполнения 50% означает, что сигнал включен 50% времени и выключен 50% времени. Коэффициент заполнения ничего не говорит о том, как долго сигнал длится. «Временем включенного состояния» для коэффициента заполнения 50% может быть доля секунды, дня или даже недели, в зависимости от продолжительности периода. Длительность импульса (Pulse width) – это продолжительность TВКЛ ,

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

Таймеры

337

задающаяся фактическим периодом. Например, предполагая период равным 1 с, коэффициент заполнения 20% генерирует длительность импульса 200 мс.

На рисунке 23 показаны три различных коэффициента заполнения: 50%, 20% и 80%.

Рисунок 23: Три различных коэффициента заполнения – 50%, 20% и 80%

Широтно-импульсная модуляция (ШИМ, англ. Pulse-width modulation, PWM) – метод, ис-

пользуемый для генерации нескольких импульсов с различными коэффициентами заполнения в заданный период времени или, если вы предпочитаете, на заданной частоте. ШИМ имеет множество применений в цифровой электронике, но все они могут быть сгруппированы в две основные категории:

управление выходным напряжением (и, следовательно, током);

кодирование (то есть модулирование) сообщения (то есть последовательности байтов в цифровой электронике32) на несущем сигнале (который работает на заданной частоте).

Эти две категории могут быть расширены в нескольких практических использованиях метода ШИМ. Обращая наше внимание на управление выходным напряжением, мы можем найти несколько применений:

генерирование выходного напряжения в диапазоне от 0 В до VDD (то есть максимально допустимое напряжение для I/O, которое в STM32 составляет 3,3 В);

управление яркостью светодиодов;

управление двигателем;

преобразование энергии;

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

вывод звука;

32 Однако имейте в виду, что ШИМ как метод модуляции не ограничивается цифровой электроникой, а берет свое начало в «аналоговой эре», когда она использовалась для модуляции звуковой волны на несу-

щей частоте (carrier frequency).

Таймеры

338

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

Канал таймера конфигурируется в режиме ШИМ с помощью функции HAL_TIM_PWM_ConfigChannel() и экземпляра структуры Си TIM_OC_InitTypeDef, рассмотренной в предыдущем параграфе. Поле TIM_OC_InitTypeDef.Pulse определяет коэффициент заполнения и находится в диапазоне от 0 до поля Period таймера. Чем больше Period, тем шире диапазон подстройки. Это означает, что мы можем точно настроить выходное напряжение.

Выбор периода, который определяет частоту выходного сигнала, вместе с тактовым сигналом таймера (внутренний, внешний и т. д.), не являются деталями, которые следует оставлять на волю случая. Они зависят от конкретной области применения и могут оказать серьезное влияние на общие выбросы EMI (излучения). Кроме того, некоторые устройства, управляемые методом ШИМ, могут излучать слышимый шум на заданных частотах. Это касается электродвигателей, которые могут издавать нежелательный жужжащий шум при управлении на частотах в диапазоне слышимости. Другим примером, не слишком уместным здесь, но с аналогичным происхождением, является шум, излучаемый силовыми дросселями при переключениях в источниках питания, которые используют лежащую в основе ШИМ концепцию регулирования их выходного напряжения, а, следовательно, и тока. Иногда выходной шум неизбежен, и для решения проблемы требуется использование гасящих шум изделий (varnishing products). В других случаях подходящая частота исходит из «естественных ограничений»: уменьшение яркости светодиода на частоте, близкой к 100 Гц, обычно является достаточным для избегания видимого мерцания света.

Доступны два режима ШИМ: режим ШИМ 1 и 2. Оба из них конфигурируются полем

TIM_OC_InitTypeDef.OCMode, используя значения TIM_OCMODE_PWM1 и TIM_OCMODE_PWM2.

Давайте рассмотрим их различия.

Режим ШИМ 1 (PWM mode 1): при отсчете вверх канал активен, пока Period < Pulse, иначе неактивен. При обратном отсчете канал неактивен, пока Period > Pulse, иначе активен.

Режим ШИМ 2 (PWM mode 2): при отсчете вверх канал 1 неактивен, пока Period < Pulse иначе активен. При обратном отсчете канал 1 активен, пока Period > Pulse, иначе неактивен.

Вследующем примере показано типовое применение метода ШИМ: управление яркостью светодиодов. Пример предназначен для работы на Nucleo-F401RE, и он плавно включает/выключает светодиод LD233.

33 К сожалению, не все платы Nucleo имеют светодиод LD2, подключенный к каналу таймера (это зависит от того, насколько схема выводов корпуса LQFP-64 микроконтроллеров STM32 хорошо совместима). Только семь из них имеют данную функцию. Владельцы других плат Nucleo должны перестроить пример, используя внешний светодиод.

Таймеры

339

Имя файла: src/main-ex8.c

11int main(void) {

12HAL_Init();

14Nucleo_BSP_Init();

15MX_TIM2_Init();

17HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);

19uint16_t dutyCycle = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_1);

21while(1) {

22while(dutyCycle < __HAL_TIM_GET_AUTORELOAD(&htim2)) {

23__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, ++dutyCycle);

24HAL_Delay(1);

25}

26

27while(dutyCycle > 0) {

28__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, --dutyCycle);

29HAL_Delay(1);

30}

31}

32}

33

34/* Функция инициализации TIM3 */

35void MX_TIM2_Init(void) {

36TIM_OC_InitTypeDef sConfigOC;

38htim2.Instance = TIM2;

39htim2.Init.Prescaler = 499;

40htim2.Init.CounterMode = TIM_COUNTERMODE_UP;

41htim2.Init.Period = 999;

42htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

43

HAL_TIM_PWM_Init(&htim2);

44

 

45sConfigOC.OCMode = TIM_OCMODE_PWM1;

46sConfigOC.Pulse = 0;

47sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;

48sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;

49HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);

50}

Строки [45:49] конфигурируют канал 1 таймера TIM2 для работы в Режиме ШИМ 1. Коэффициент заполнения будет находиться в диапазоне от 0 до 999, что соответствует значению Period. Это означает, что мы можем регулировать выходное напряжение с шагом ~0,0033 В, если выход хорошо фильтруется (и печатная плата имеет хорошую компоновку). Это близко к характеристикам 10-разрядного ЦАП.

В строках [21:32] происходит эффект плавного мерцания. Первый цикл увеличивает значение Pulse (которое соответствует регистру захвата/сравнения 1 (CCR1)) до значения