STM Урок 171. CMSIS. STM32F1. PWM (ШИМ). Мигаем светодиодами плавно



Продолжаем работать с CMSIS.

Также продолжаем работу с таймерами и в данном занятии мы изучим возможность аппаратной реализации широтно-импульсной модуляции (ШИМ или PWM).

Правда, скорее всего мы данную возможность не изучим, так как мы её уже изучили в уроке 149, в котором мы применяли аппаратную реализацию PWM, используя библиотеку LL. Мы изучили все регистры таймеров, участвующие в реализации PWM и их биты. Поэтому, кто не видел данный урок, обязательно посмотрите. Тем более схема для практического тестирования у нас будет та же, что и в уроке 149, а также почти во всех предыдущих уроках по CMSIS кроме предыдущего

 

 

Мы также настроим два таймера — TIM2 с его каналами CH3 и CH4, и TIM3 со всеми его каналами. Тем самым в работе у нас будут ножки портов PA2, PA3, PA6, PA7, PB0 и PB1. Данные ножки будут настроены в альтернативный режим.

Проект для данного занятия был сделан из проекта прошлого урока с именем CMSIS_LED_DYN и назван CMSIS_PWM.

Откроем наш проект в Keil, удалим файл led.c из дерева проекта, так как мы сегодня с индикатором не работаем, а также удалим данный файл и файл led.h из папок src и inc.

Также в файле main.c удалим подключение библиотеки

 

#include «led.h»

 

Вот это тоже удалим

 

extern uint8_t R1,R2,R3,R4;

extern uint16_t num_gl;

 

В функции main() удалим весь код из тела бесконечного цикла.

Прерываниями от таймеров мы в данном уроке пользоваться не будем, поэтому удалим вызов данного макроса

 

TIM_EnableIT_UPDATE(TIM2);

 

Функцию обработки прерываний от таймера TIM2_IRQHandler удалим вместе с телом.

Также отдельно мы не будем настраивать GPIO, поэтому удалим вызов функции настройки из функции main()

 

GPIO_Init();

 

Также можно удалить и данную функцию вместе с телом.

Из тела функции инициализации таймера TIM2_Init удалим пока весь код и начнём писать новый.

Добавим несколько локальных переменных, которые нам пригодятся в дальнейшем

 

 

Включим тактирование таймера

 

 

Считаем регистр CR1 в переменную, очистим там ненужные биты (почему именно эти, а потому что именно такие настройки, которые мы с вами подробно исследовали в уроке с LL) и запишем значение переменной обратно в регистр

 

 

Настроим период авто перезагрузки таймера и делитель. Делитель устанавливаем в 0

 

 

Включим автогенерацию событий для немедленной перезагрузки делителя и значения счётчика повторений

 

 

Отключим автоперезагрузку

 

 

Включим тактирование таймера от внутреннего источника

 

 

Начнём теперь настройку каналов 3 и 4, по возможности применяя их одновременную инициализацию.

 

 

Включим предделитель на каналы 3 и 4

 

 

Отключим пока эти каналы для дальнейшей безболезненной настройки

 

 

Считаем в переменные значения регистров

 

 

Очистим в каналах биты, отвечающие за захват/сравнение

 

 

Включим выходы каналов

 

 

Выберем полярность

 

 

Активируем наши ножки каналов

 

 

Запишем значения переменных обратно в регистры

 

 

Обнулим регистры сравнения, установив тем самым начальный коэффициент заполнения 0

 

 

Сохраним значение ещё одной переменной обратно в регистр

 

 

 

Отключим режим Fast сравнения

 

 

Отключим мастер-режим таймера

 

 

Также отключим режим Master/Slave

 

 

Настроим также ножки порта на соответствующий альтернативный режим

 

 

Вот и вся инициализация таймера, хоть и не маленькая, но, благодаря нашим знаниям, полученным ранее, она нам не показалась сильно тяжёлой.

Добавим подобную функцию для таймера 3. Там будет чуть посложнее, так как мы включаем все 4 канала, но не намного

 

 

Вызовем также и эту функцию в main()

 

 

Добавим макрос включения каналов

 

 

В функции main() перед запуском таймера 2 включим его каналы

 

 

Также включим каналы таймера 3 и запустим его

 

 

Изменим тип локальной переменной в целях расширения диапазона значений

 

uint32_t i;

 

В бесконечном цикле плавно порегулируем значения регистров также как и в уроке с библиотекой LL

 

 

Соберём код, прошьём контроллер и увидим, как наши 6 светодиодов в планке будут плавно зажигаться и тухнуть по очереди

 

 

 

Итак, на данном занятии мы настроили таймеры на работу в режиме PWM (ШИМ), используя возможности библиотеки CMSIS.

Всем спасибо за внимание!

 

 

Предыдущий урок Программирование МК STM32 Следующий урок

 

Исходный код

 

 

Отладочную плату STM32F103C8T6 можно приобрести здесь STM32F103C8T6

Программатор недорогой можно купить здесь ST-Link V2

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

STM CMSIS. STM32F1. PWM (ШИМ). Мигаем светодиодами плавно

Один комментарий на “STM Урок 171. CMSIS. STM32F1. PWM (ШИМ). Мигаем светодиодами плавно
  1. Artem:

    Здравствуйте , я Вам уже писал.Но увы остался без ответа. У меня к Вам огромная просьба. Не могли бы Вы выпустить урок по управлению с помощью МК AVR или STM симистором или тиристором. Управление мощной нагрузкой (лампа накаливания). Например спецэффекты для елочных гирлянд на 220v. Плавное включение ламп, плавное затухание, моргание не затушенных полностью ламп итд. Очень интересная тема. Для нас новичков в этом деле.

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

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

*