- Что такое ШИМ (импульсный с модуляцией)?
- ШИМ в STM32
- Необходимые компоненты
- Детали вывода STM32
- Принципиальная схема и подключения
- Программирование STM32
В предыдущей статье мы видели преобразование АЦП с использованием STM32. В этом руководстве мы узнаем о ШИМ (широтно-импульсной модуляции) в STM32 и о том, как мы можем контролировать яркость светодиода или скорость вентилятора постоянного тока с помощью техники ШИМ.
Мы знаем, что существует два типа сигнала: аналоговый и цифровой. Аналоговые сигналы имеют такие напряжения, как (3 В, 1 В… и т. Д.), А цифровые сигналы имеют (1 и 0). Выходы датчиков представляют собой аналоговые сигналы, и эти аналоговые сигналы преобразуются в цифровые с помощью АЦП, поскольку микроконтроллеры понимают только цифровые сигналы. После обработки этих значений АЦП выход снова необходимо преобразовать в аналоговую форму для управления аналоговыми устройствами. Для этого мы используем определенные методы, такие как ШИМ, цифро-аналоговые преобразователи (ЦАП) и т. Д.
Что такое ШИМ (импульсный с модуляцией)?
ШИМ - это способ управления аналоговыми устройствами с использованием цифровых величин, таких как управление скоростью двигателя, яркостью светодиода и т. Д. Мы знаем, что двигатель и светодиод работают с аналоговым сигналом. Но ШИМ не обеспечивает чистый аналоговый выход, ШИМ выглядит как аналоговый сигнал из коротких импульсов, который обеспечивается рабочим циклом.
Рабочий цикл ШИМ
Процент времени, в течение которого сигнал ШИМ остается ВЫСОКИМ (по времени), называется рабочим циклом. Если сигнал всегда включен, это 100% рабочий цикл, а если он всегда выключен, это 0% рабочего цикла.
Рабочий цикл = время включения / (время включения + время выключения)
ШИМ в STM32
STM32F103C8 имеет 15 контактов PWM и 10 контактов ADC. Есть 7 таймеров, и каждый выход ШИМ обеспечивается каналом, подключенным к 4 таймерам. Он имеет 16-битное разрешение ШИМ (2 16), то есть счетчики и переменные могут достигать 65535. При тактовой частоте 72 МГц выходной сигнал ШИМ может иметь максимальный период около одной миллисекунды.
- Таким образом, значение 65535 дает ПОЛНУЮ ЯРКОСТЬ СВЕТОДИОДА И ПОЛНУЮ СКОРОСТЬ вентилятора постоянного тока (рабочий цикл 100%).
- Аналогичным образом значение 32767 дает ПОЛОВИНУ ЯРКОСТИ светодиода И ПОЛОВИНУ СКОРОСТИ вентилятора постоянного тока (рабочий цикл 50%).
- А значение 13107 дает (20%) ЯРКОСТЬ И (20%) СКОРОСТЬ (рабочий цикл 20%).
В этом руководстве мы используем потенциометр и STM32 для изменения яркости светодиода и скорости вентилятора постоянного тока с помощью метода ШИМ. ЖК-дисплей 16x2 используется для отображения значения АЦП (0-4095) и измененной переменной (значение PWM), которая выводится (0-65535).
Вот несколько примеров ШИМ с другим микроконтроллером:
- Генерация ШИМ с использованием микроконтроллера PIC с MPLAB и XC8
- Управление сервомотором с Raspberry Pi
- Светодиодный диммер на базе Arduino с использованием ШИМ
- Широтно-импульсная модуляция (ШИМ) с использованием MSP430G2
Проверьте все проекты, связанные с ШИМ здесь.
Необходимые компоненты
- STM32F103C8
- Вентилятор постоянного тока
- ULN2003 Драйвер двигателя IC
- LED (КРАСНЫЙ)
- ЖК-дисплей (16x2)
- Потенциометр
- Макетная плата
- Аккумулятор 9В
- Перемычки
Вентилятор постоянного тока: здесь используется вентилятор постоянного тока со старым ПК. Для него требуется внешний источник питания, поэтому мы используем аккумулятор постоянного тока на 9 В.
ULN2003 Motor Driver IC: он используется для вращения двигателя в одном направлении, поскольку двигатель является однонаправленным, и для вентилятора требуется внешнее питание. Узнайте больше о схеме драйвера двигателя на основе ULN2003 здесь. Ниже приведена диаграмма ULN2003:
Контакты (с IN1 по IN7) являются входными контактами, а (OUT 1 до OUT 7) - соответствующими выходными контактами. На COM подается положительное напряжение источника, необходимое для выходных устройств.
Светодиод: используется КРАСНЫЙ светодиод, который излучает КРАСНЫЙ свет. Можно использовать любые цвета.
Потенциометры: используются два потенциометра, один для делителя напряжения для аналогового входа в АЦП, а другой для управления яркостью светодиода.
Детали вывода STM32
Как мы видим, выводы ШИМ обозначены в волновом формате (~), таких выводов 15, выводы АЦП представлены зеленым цветом, 10 выводов АЦП используются для аналоговых входов.
Принципиальная схема и подключения
Соединения STM32 с различными компонентами объясняются ниже:
STM32 с аналоговым входом (АЦП)
Потенциометр, присутствующий в левой части схемы, используется в качестве регулятора напряжения, который регулирует напряжение с вывода 3,3 В. Выход потенциометра, то есть центральный контакт потенциометра, подключен к контакту АЦП (PA4) STM32.
STM32 со светодиодом
Выходной вывод ШИМ STM32 (PA9) подключен к положительному выводу светодиода через последовательный резистор и конденсатор.
Светодиод с резистором и конденсатором
Последовательный резистор и конденсатор соединены параллельно со светодиодом для генерации правильной аналоговой волны на выходе ШИМ, поскольку аналоговый выход не является чистым, когда генерируется непосредственно с вывода ШИМ.
STM32 с ULN2003 и ULN2003 с вентилятором
Выходной контакт STM32 PWM (PA8) подключен к входному контакту (IN1) микросхемы ULN2003, а соответствующий выходной контакт (OUT1) ULN2003 подключен к отрицательному проводу вентилятора постоянного тока.
Положительный вывод вентилятора постоянного тока подключен к выводу COM микросхемы ULN2003, а внешняя батарея (9 В постоянного тока) также подключена к тому же выводу COM микросхемы ULN2003. Вывод GND ULN2003 подключен к выводу GND STM32, а минус батареи подключен к тому же выводу GND.
STM32 с ЖК-дисплеем (16x2)
ЖК-вывод Нет |
Имя вывода ЖК-дисплея |
Имя контакта STM32 |
1 |
Земля (Gnd) |
Земля (G) |
2 |
VCC |
5В |
3 |
VEE |
Штифт от центра потенциометра |
4 |
Выбрать регистр (RS) |
PB11 |
5 |
Чтение / запись (RW) |
Земля (G) |
6 |
Включить (EN) |
PB10 |
7 |
Бит данных 0 (DB0) |
Нет соединения (NC) |
8 |
Бит данных 1 (DB1) |
Нет соединения (NC) |
9 |
Бит данных 2 (DB2) |
Нет соединения (NC) |
10 |
Бит данных 3 (DB3) |
Нет соединения (NC) |
11 |
Бит данных 4 (DB4) |
PB0 |
12 |
Бит данных 5 (DB5) |
PB1 |
13 |
Бит данных 6 (DB6) |
PC13 |
14 |
Бит данных 7 (DB7) |
PC14 |
15 |
Светодиод Положительный |
5В |
16 |
Светодиод отрицательный |
Земля (G) |
Потенциометр на правой стороне используется для управления контрастностью ЖК-дисплея. В приведенной выше таблице показано соединение между ЖК-дисплеем и STM32.
Программирование STM32
Как и в предыдущем руководстве, мы запрограммировали STM32F103C8 с помощью Arduino IDE через порт USB без использования программатора FTDI. Чтобы узнать о программировании STM32 с помощью Arduino IDE, перейдите по ссылке. Мы можем продолжить программирование, как в Arduino. Полный код приведен в конце.
В этой кодировке мы собираемся взять входное аналоговое значение с вывода АЦП (PA4), который подключен к центральному выводу левого потенциометра, а затем преобразовать аналоговое значение (0–3,3 В) в цифровой или целочисленный формат (0–4095). Это цифровое значение дополнительно предоставляется как выход ШИМ для управления яркостью светодиода и скоростью вентилятора постоянного тока. ЖК-дисплей 16x2 используется для отображения АЦП и отображаемого значения (выходного значения ШИМ).
Сначала нам нужно включить файл заголовка ЖК-дисплея, объявить контакты ЖК-дисплея и инициализировать их, используя приведенный ниже код. Узнайте больше о взаимодействии ЖК-дисплея с STM32 здесь.
#включают
Затем объявите и определите имена контактов, используя контакт STM32.
const int analoginput = PA4; // Ввод с потенциометра const int led = PA9; // выход светодиода const int fan = PA8; // выход вентилятора
Теперь внутри setup () нам нужно отобразить некоторые сообщения и очистить их через несколько секунд, а также указать контакты INPUT и PWM output.
lcd.begin (16,2); // Готовим ЖК-дисплей lcd.clear (); // Очищает ЖК-дисплей lcd.setCursor (0,0); // Устанавливает курсор в row0 и column0 lcd.print ("CIRCUIT DIGEST"); // Отображает дайджест схемы lcd.setCursor (0,1); // Устанавливает курсор в столбце 0 и строке 1 lcd.print ("PWM USING STM32"); // Отображение ШИМ с использованием задержки STM32 (2000); // Время задержки lcd.clear (); // Очищает LCD pinMode (analoginput, INPUT); // установить режим вывода для аналогового входа как INPUT pinMode (led, PWM); // устанавливаем светодиод режима вывода как вывод PWM pinMode (fan, PWM); // установить режим вывода вентилятора как выход ШИМ
Вывод аналогового входа (PA4) устанавливается как INPUT с помощью pinMode (аналоговый вход, INPUT), вывод светодиода устанавливается как выход PWM с помощью pinMode (led, PWM), а вывод вентилятора устанавливается как выход PWM с помощью pinMode (fan, PWM) . Здесь выходные контакты ШИМ подключены к светодиоду (PA9) и вентилятору (PA8).
Затем в функции void loop () мы считываем аналоговый сигнал с вывода АЦП (PA4) и сохраняем его в целочисленной переменной, которая преобразует аналоговое напряжение в цифровые целые значения (0-4095), используя приведенный ниже код int valueadc = analogRead (analoginput);
Здесь важно отметить, что контакты PWM, которые являются каналами STM32, имеют 16-битное разрешение (0-65535), поэтому нам нужно сопоставить это с аналоговыми значениями, используя функцию карты, как показано ниже.
int результат = карта (значениеadc, 0, 4095, 0, 65535).
Если отображение не используется, мы не сможем получить полную скорость вращения вентилятора или полную яркость светодиода, изменяя потенциометр.
Затем мы записываем вывод ШИМ на светодиод с помощью pwmWrite (светодиод, результат) и вывод ШИМ на вентилятор с помощью функций pwmWrite (вентилятор, результат ).
Наконец, мы отображаем значение аналогового входа (значение АЦП) и выходные значения (значения ШИМ) на ЖК-дисплее, используя следующие команды
lcd.setCursor (0,0); // Устанавливает курсор в row0 и column0 lcd.print ("ADC value ="); // печатает слова «» lcd.print (valueadc); // отображает valueadc lcd.setCursor (0,1); // Устанавливает курсор в столбце 0 и строке 1 lcd.print ("Output ="); // печатает слова в "" lcd.print (result); // выводит значение результат
Полный код с демонстрационным видео приведен ниже.