STM32 используем таймер для генерации ШИМ (PWM mode)



Далее пойдет речь о генерации PWM (ШИМ сигнала) с помощью таймеров микроконтроллеров STM32.

С помощью PWM можно управлять, например, скоростью вращения электродвигателей, яркостью дисплея/диодов и многим другим.

Для начала нужно понять, что такое сигнал и PWM. Аббревиатура PWM расшифровывается, как Pulse-width modulation. Или широтно-импульсная модуляция.

Под сигналом здесь понимается наличие напряжения на проводе. Например, на пальчиковой батарейке напряжение ~1.5 вольт. То есть, сигнал у нее постоянный и равен ~1.5 вольт.


PWM график


На графиках выше отображена зависимость напряжения от времени с разным заполнением ШИМ. То есть, если говорить об управлении подсветкой, когда напряжение есть, диод будет светиться, когда напряжения нет — он будет гаснуть.

Если быстро включать и выключать светодиод, то человеческим зрением мы мерцаний не увидим. А для глаза лишь будет снижаться или повышаться яркость подсветки в зависимости от коэффициента заполнения PWM.

У PWM есть три основных параметра:
1) Напряжение (высота пиков импульсов)
2) Частота (с какой частотой появляются пики, измеряется в Герцах. Например, 1000 Герц — 1000 импульсов в секунду)
3) Коэффициент заполнения PWM


Коэффициент заполнения ШИМ


Выше красным обозначены пики. Чем шире пики относительно «провалов», тем больше коэффициент заполнения.

При коэффициенте заполнения 100% мы получим ровную линию постоянного положительного напряжения. На микроконтроллерах STM32 — 3.3v

При коэффициенте заполнения 50% мы получим картину, как на графике выше (то есть, половину времени напряжение есть, а вторую половину — напряжения нет).

При коэффициенте заполнения 0% напряжения вообще не будет.

Соответственно, повышая процент заполнения, мы будем увеличивать яркость подсветки, а понижая — уменьшать.


Теперь приступим к реализации PWM на микроконтроллере STM31F103.

Для начала нужно знать, с какой частотой тактируются таймеры. Для этого откроем ioc файл проекта в среде STM32CubeIDE и перейдем во вкладку Clock Configuration.


STM32 Timers Clock configuration


Отсюда видно, что таймеры тактируются частотой 72 мегагерц (72 000 000 раз в секунду). Запомнили это значение.

Теперь переходим во вкладку Pinout & Configuration. На STM32F103 для этого я выбрал таймер 2 (TIM2). Включаем его.


STM32 PWM


Теперь настраиваем частоту PWM и коэффициент заполнения импульсов.

STM32 PWM

Теперь производим расчеты.

Допустим, нам нужно получить PWM с частотой 1000 Герц (1 килогерц). Для удобства снизим частоту работы таймера до 1 мегагерца (1 МГц) с помощью Prescaler (предделитель). Prescaler будет делить частоту тактирования таймера. Если установить Prescaler = 0, то частота работы таймера будет максимальной. Если = 1, то поделится на 2, если 999, то поделится на 1000. Так как нам нужен 1 килогерц, то поделим ее на 72. Чтобы поделить частоту на 72, нужно установить значение Prescaler 72-1=71 (так как отсчет прескейлера начинается с 0, а не с 1).

Теперь установим период срабатывания таймера (Counter period). Здесь также ставим значение x-1. То есть 1000-1=999.

При этом таймер будет тикать 1 миллион раз в секунду. При достижении Counter period = 999 он будет «срабатывать» каждые 1000 тиков.

Делим 1 000 000 Герц на 1000 и получаем желаемые 1000 Герц (1000 раз в секунду). Это и будет частотой мерцания подсветки.

Коэффициент заполнения импульсов здесь задается параметром Pulse. Но мы его здесь оставим равным 0 и будем менять его значение в коде для регулирования подсветки. Следует понимать, что при Counter period = 999 значения Pulse могут быть от 0 до 999. Если нужно сделать подсветку яркостью 50%, делим 999/2 и получаем примерно 500.

ВАЖНО: Подключать подсветку и другую «мощную» нагрузку напрямую к ножке микроконтроллера нельзя. Ток ножки микроконтроллера не должен превышать значения, объявленного в его Datasheet. Лично я не тяну с ножек более 1 mA.

Если нужно управлять «мощной» для микроконтроллера нагрузкой, обычно используются полевые транзисторы.

На моем дисплее ST7735 есть пин для подключения управления подсветкой и там уже стоит P-канальный полевой транзистор.


ST7735 BL Pin


На схеме пин управления подсветкой дисплея обозначен, как BL. Он подключен к затвору транзистора. Затвор подтянут к плюсу через резистор 10 000 ом (чтобы при отсутствии какого-либо сигнала на затворе был потенциал +3.3v и транзистор был закрыт (подсветка отключена)). N-канальные полевики работают «наоборот». Если на затворе есть определенное напряжение, то он включен, если нет — то выключен и не пропускает ток.

Подключаем пин дисплея BL к ножке микроконтроллера PA2 (которую задействовали для таймера генерации PWM сигнала).


ST7735 PWM BackLight


Теперь, чтобы подсветка правильно управлялась с помощью PWM сигнала от ножки PA2 в файле main.c пишем следующий код.

Перед бесконечным циклом (Infinite loop):

1
2
TIM2->CCR3 = 500;
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3);

Первая строка устанавливает значение коэффициента заполнения (Pulse).
Вторая — включает генерацию PWM.

TIM2 — таймер 2
CCR3 — регистр CCR канала 3 (ножка PA2).
&htim2 — таймер 2
TIM_CHANNEL_3 — канал 3

Учитывайте это, если используете другой таймер или его канал.

Меняя TIM2->CCR3 от 0 до 999 мы будем управлять яркостью подсветки. Так как для управления подсветкой используется P-канальный полевой транзистор, то подсветка будет работать, когда напряжение = 0, а включаться при напряжении 3.3v.

Соответственно, если поставить TIM2->CCR3 = 0, то подсветка будет работать на 100% яркости. Если TIM2->CCR3 = 500, наполовину. Если TIM2->CCR3 = 100, примерно на 10%. То есть «наоборот».


ST7735


Дополнение


STM32 Timer CH Polarity

Если при настройке таймера PWM установить параметр CH Polarity = Low, то его сигнал будет инвертирован. То есть, при инициализации таймера на ножке будет высокий уровень и подсветка на дисплее будет выключена. Управление яркостью при этом будет происходить также в инвертированном режиме. То есть, меняя значения TIM2->CCR3 (от 0 до 999) яркость подсветки будет возрастать с увеличением данного числа.


1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (3 оценок, среднее: 5,00 из 5)

Загрузка...

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

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

Optionally add an image (JPEG only)