Использование ШИМ (широтно-импульсной модуляции) в STM32 Blue Pill


В предыдущей статье на нашем сайте мы рассмотрели принципы работы АЦП в плате STM32. В этой же статье мы рассмотрим основы использования широтно-импульсной модуляции (ШИМ, в англ. PWM – Pulse Width Modulation) в плате STM32F103C8, которая также называется STM32 Blue Pill ("синяя таблетка"). С помощью изменения коэффициента заполнения ШИМ сигнала мы будем регулировать скорость вращения вентилятора постоянного тока (DC fan).

Внешний вид проекта использования ШИМ в STM32 Blue Pill

Ранее на нашем сайте мы рассматривали использование ШИМ в следующих микроконтроллерах (платах):

Основные принципы ШИМ

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

Внешний вид ШИМ сигнала при различных коэффициентах заполнения показан на следующих рисунке.

ШИМ с коэффициентом заполнения 50%

ШИМ с коэффициентом заполнения 10%

ШИМ с коэффициентом заполнения 90%

Важным параметром ШИМ сигнала является его коэффициент заполнения (скважность, в англ. - duty cycle). Коэффициент заполнения ШИМ сигнала представляет собой процент времени, в течение которого сигнал имеет высокий уровень (HIGH, ON). Если ШИМ сигнал всегда находится в состоянии HIGH, то его коэффициент заполнения равен 100%, а если ШИМ сигнал всегда находится в состоянии LOW, то его коэффициент заполнения равен 0%.

ШИМ в STM32

Плата STM32F103C8 содержит 15 ШИМ контактов и 10 контактов АЦП. Также в ней есть 7 таймеров и каждый выход ШИМ в ней обеспечен каналом, соединенным с 4 таймерами. Разрешение ШИМ сигнала в плате составляет 16 бит, что позволяет оперировать значениями вплоть до 65535. Учитывая частоту процессора равную 72 МГц получаем, что максимальный период ШИМ сигнала составляет примерно 1 миллисекунду.

Таким образом:

  • значение 65535 обеспечивает полную яркость светодиода/полную скорость вращения вентилятора (коэффициент заполнения 100%);
  • значение 32767 обеспечивает половинную яркость светодиода/половинную скорость вращения вентилятора (коэффициент заполнения 50%);
  • значение 13107 обеспечивает 20% яркости светодиода/20% скорости вращения вентилятора (коэффициент заполнения 20%).

Внешний вид ШИМ сигнала в плате STM32F103C8 при различных коэффициентах заполнения показан на следующем рисунке.

Внешний вид ШИМ сигнала в плате STM32F103C8 при различных коэффициентах заполнения

В данном проекте мы будем использовать потенциометр, подключенный к плате STM32, для изменения яркости свечения светодиода и скорости вращения вентилятора с помощью изменения коэффициента заполнения ШИМ сигнала. ЖК дисплей 16x2 будет использоваться для отображения значения АЦП (0-4095) и значения ШИМ (0-65535).

Необходимые компоненты

  1. Плата разработки STM32F103C8 (STM32 Blue Pill) (купить на AliExpress).
  2. Вентилятор постоянного тока (DC fan).
  3. Микросхема драйвера двигателей ULN2003 (купить на AliExpress - в виде модуля, но можно найти и в виде отдельной микросхемы).
  4. Светодиод красного цвета (купить на AliExpress).
  5. ЖК дисплей 16x2 (купить на AliExpress).
  6. Потенциометр – 2 шт. (купить на AliExpress).
  7. Батарейка 9V.
  8. Макетная плата.
  9. Соединительные провода.

В качестве вентилятора постоянного тока мы использовали вентилятор BLDC типа от старого компьютера, которому требуется внешнее напряжение питания 9V.

Микросхема драйвера двигателей ULN2003: используется для управления вращения двигателем в одном направлении поскольку у нас двигатель вентилятора однополярный и для него требуется внешнее питание. Внутренняя схема соединений микросхемы ULN2003 представлена на следующем рисунке.

Внутренняя схема соединений и распиновка микросхемы ULN2003

Контакты с IN1 до IN7 микросхемы ULN2003 являются ее входами, а контакты с OUT 1 по OUT 7 являются ее выходами. На контакт COM подается положительное напряжение источника питания, необходимое для устройств, подключаемых к выходам микросхемы.

В нашем проекте используется два потенциометра: один – для подачи аналогового напряжения на АЦП платы STM32, а второй – для управления контрастностью ЖК дисплея.

ШИМ контакты платы STM32

Распиновка платы STM32 Blue Pill показана на следующем рисунке.

Назначение контактов (распиновка) платы STM32F103C8 (Blue Pill)ШИМ контакты на этом рисунке обозначены знаком волны (~). Всего таких контактов – 15. Контакты АЦП платы на представленной схеме обозначены зеленым цветом.

Схема проекта

Схема для демонстрации возможностей ШИМ в плате STM32 Blue Pill представлена на следующем рисунке.

Схема для демонстрации возможностей ШИМ в плате STM32 Blue PillПотенциометр в левой части схемы используется как регулятор напряжения, поступающего с контакта 3.3V платы. Центральный контакт потенциометра подключен к контакту АЦП PA4 платы STM32.

Светодиод подключен к ШИМ контакту PA9 платы STM32 через токоограничивающий резистор. Данный резистор и конденсатор, подключенный параллельно светодиоду, используются для формирования правильной аналоговой волны от ШИМ контакта – поскольку в чистом виде с данного контакта волна нам не очень подходит.

ШИМ контакт PA8 платы STM32 подключен к входному контакту IN1 микросхемы ULN2003, а соответствующий выходной контакт OUT1 микросхемы ULN2003 подключен к отрицательному выводу двигателя постоянного тока вентилятора.

Положительный вывод двигателя постоянного тока вентилятора подключен к контакту COM микросхемы ULN2003, к нему же подключена батарейка 9V. Общий провод (GND) микросхемы ULN2003 подключен к общему проводу платы STM32, к нему же подключен отрицательный вывод батарейки.

Соединения между платой STM32 и ЖК дисплеем 16x2 представлены в следующей таблице.

№ контакта ЖК дисплея Обозначение контакта ЖК дисплея Контакт платы STM32
1 Ground (Gnd) Ground (G)
2 VCC 5V
3 VEE средний контакт потенциометра
4 Register Select (RS) PB11
5 Read/Write (RW) Ground (G)
6 Enable (EN) PB10
7 Data Bit 0 (DB0) No Connection (NC)
8 Data Bit 1 (DB1) No Connection (NC)
9 Data Bit 2 (DB2) No Connection (NC)
10 Data Bit 3 (DB3) No Connection (NC)
11 Data Bit 4 (DB4) PB0
12 Data Bit 5 (DB5) PB1
13 Data Bit 6 (DB6) PC13
14 Data Bit 7 (DB7) PC14
15 LED Positive 5V
16 LED Negative Ground (G)

Потенциометр в правой части схемы используется для регулировки контрастности ЖК дисплея.

Внешний вид собранной конструкции проекта показан на следующем рисунке.

Внешний вид собранной конструкции проекта

Объяснение программы для платы STM32

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

Программировать плату STM32F103C8 мы будем с помощью Arduino IDE через USB порт, без использования FTDI программатора.

В нашей программе мы будем считывать значение с выхода АЦП контакта PA4 платы STM32, к которому подключен средний контакт потенциометра, и затем конвертировать аналоговое значение напряжения (0-3.3V) в цифровое значение в диапазоне от 0 до 4095. Это значение будет после еще одного преобразования передаваться в функцию формирования ШИМ сигнала для управления яркостью свечения светодиода и скоростью вращения вентилятора постоянного тока. ЖК дисплей 16x2 используется для отображения значения АЦП и сформированного значения ШИМ.

Первым делом в программе нам необходимо подключить библиотеку для работы с ЖК дисплеем, указать контакты платы, к которым подключен ЖК дисплей и создать объект для работы с дисплеем. Более подробно о подключении ЖК дисплея 16x2 к плате STM32F103C8 можно прочитать в этой статье.

Далее объявим используемые контакты платы STM32.

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

Далее в функции void loop() мы будем считывать аналоговый сигнал с контакта АЦП PA4 с помощью функции analogRead(analoginput) и сохранять его в переменной целого типа valueadc. Значение этой переменной будет в диапазоне (0-4095).

Здесь необходимо отметить что ШИМ контакты платы STM32 имеют разрешение 16-бит, что соответствует диапазону чисел 0-65535, поэтому мы преобразуем наше значение с выхода АЦП в диапазоне 0-4095 в диапазон 0-65535 с помощью функции map.

Затем мы подадим это значение ШИМ на контакты, к которым подключены светодиод и вентилятор, с помощью функций pwmWrite(led, result) и pwmWrite(fan, result) соответственно.

И, наконец, мы выведем на экран ЖК дисплея значения с выхода АЦП и сформированное значение ШИМ.

Исходный код программы (скетча)

Видео, демонстрирующее работу проекта

(Проголосуй первым!)
Загрузка...
1 301 просмотров

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

Ваш адрес email не будет опубликован.