Рубрики
Проекты на STM32

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

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

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

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

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

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

Важным параметром ШИМ сигнала является его коэффициент заполнения (скважность, в англ. — 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 при различных коэффициентах заполнения показан на следующем рисунке.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

№ контакта ЖК дисплея Обозначение контакта ЖК дисплея Контакт платы 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. Это значение будет после еще одного преобразования передаваться в функцию формирования ШИМ сигнала для управления яркостью свечения светодиода и скоростью вращения вентилятора постоянного тока. ЖК дисплей 16×2 используется для отображения значения АЦП и сформированного значения ШИМ.

Первым делом в программе нам необходимо подключить библиотеку для работы с ЖК дисплеем, указать контакты платы, к которым подключен ЖК дисплей и создать объект для работы с дисплеем. Более подробно о подключении ЖК дисплея 16×2 к плате 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) соответственно.

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

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

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

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

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