- Какво е ШИМ (импулс с модулация)?
- ШИМ в STM32
- Необходими компоненти
- Подробности за щифта на STM32
- Електрическа схема и връзки
- Програмиране на STM32
В предишната статия видяхме за преобразуването на ADC с помощта на STM32. В този урок ще научим за PWM (Pulse Width Modulation) в STM32 и как можем да контролираме яркостта на LED или скоростта на DC вентилатора, използвайки PWM техника.
Знаем, че има два вида сигнал: аналогов и цифров. Аналоговите сигнали имат напрежения като (3V, 1V… и т.н.), а цифровите сигнали имат (1 'и 0's). Изходите на сензорите са от аналогови сигнали и тези аналогови сигнали се преобразуват в цифрови с помощта на ADC, тъй като микроконтролерите разбират само цифрово. След обработка на тези ADC стойности, отново изходът трябва да бъде преобразуван в аналогова форма, за да задвижва аналоговите устройства. За това използваме определени методи като ШИМ, цифрово-аналогови (ЦАП) преобразуватели и т.н.
Какво е ШИМ (импулс с модулация)?
PWM е начин за управление на аналоговите устройства, използвайки цифрова стойност като контрол на скоростта на двигателя, яркостта на светодиода и т.н. Ние знаем, че двигателят и led работят на аналогов сигнал. Но PWM не осигурява чист аналогов изход, PWM изглежда като аналогов сигнал, направен от къси импулси, който се осигурява от работен цикъл.
Работен цикъл на ШИМ
Процентът от времето, през което ШИМ сигналът остава ВИСОКИ (навреме) се нарича работен цикъл. Ако сигналът винаги е включен, той е в 100% работен цикъл и ако винаги е изключен, това е 0% работен цикъл.
Работен цикъл = Време за включване / (Време за включване + Време за изключване)
ШИМ в STM32
STM32F103C8 има 15 PWM щифта и 10 ADC щифта. Има 7 таймера и всеки ШИМ изход се осигурява от канал, свързан с 4 таймера. Той има 16-битова PWM резолюция (2 16), тоест броячите и променливите могат да достигнат 65535. С тактова честота 72MHz, PWM изходът може да има максимален период от около една милисекунда.
- Така стойността на 65535 дава ПЪЛНА ЯРКОСТ НА LED И ПЪЛНА СКОРОСТ на DC вентилатора (100% работен цикъл)
- По същия начин стойността на 32767 дава ПОЛОВИНА ЯРКОСТ НА LED И ПОЛОВИНА СКОРОСТ на DC вентилатор (50% работен цикъл)
- И стойността на 13107 дава (20%) ЯРКОСТ И (20%) СКОРОСТ (20% работен цикъл)
В този урок използваме потенциометър и STM32, за да променяме яркостта на светодиода и скоростта на DC вентилатор чрез PWM техника. 16x2 LCD се използва за показване на ADC стойност (0-4095) и модифицираната променлива (PWM стойност), която се извежда (0-65535).
Ето няколко примера за ШИМ с други микроконтролери:
- Генериране на ШИМ с помощта на микроконтролер PIC с MPLAB и XC8
- Серво моторно управление с Raspberry Pi
- LED димер, базиран на Arduino, използващ ШИМ
- Модулация с широчина на импулса (ШИМ) с използване на MSP430G2
Проверете всички проекти, свързани с ШИМ тук.
Необходими компоненти
- STM32F103C8
- DC вентилатор
- ULN2003 IC драйвер за двигател
- LED (ЧЕРВЕН)
- LCD (16x2)
- Потенциометър
- Макет
- Батерия 9V
- Джъмперни проводници
DC вентилатор: Използваният тук вентилатор за постоянен ток е BLDC вентилатор от стар компютър. Той изисква външно захранване, така че използваме 9V DC батерия.
IC драйвер за двигател ULN2003: Използва се за задвижване на двигателя в една посока, тъй като двигателят е еднопосочен, а за вентилатора е необходимо и външно захранване. Научете повече за базирана на ULN2003 верига за моторни драйвери тук. По-долу е представена диаграмата на ULN2003:
Пиновете (IN1 до IN7) са входни щифтове и (OUT 1 до OUT 7) са съответните изходни щифтове. COM се дава положително напрежение на източника, необходимо за изходните устройства.
LED: Използва се червен цветен светодиод, който излъчва ЧЕРВЕНА светлина. Могат да се използват всякакви цветове.
Потенциометри: Използват се два потенциометра, единият е за делител на напрежение за аналогов вход към ADC, а друг е за управление на яркостта на led.
Подробности за щифта на STM32
Както виждаме PWM щифтовете са посочени във вълнов формат (~), има 15 такива щифта, ADC щифтовете са представени в зелен цвят, има 10 ADC щифта, които се използват за аналогови входове.
Електрическа схема и връзки
Връзките на STM32 с различни компоненти са обяснени по-долу:
STM32 с аналогов вход (ADC)
Потенциометърът, присъстващ в лявата страна на веригата, се използва като регулатор на напрежението, който регулира напрежението от пина 3.3V. Изходът от потенциометъра, т.е. централният щифт на потенциометъра, е свързан към ADC щифта (PA4) на STM32.
STM32 със светодиод
Изходният щифт STM32 PWM (PA9) е свързан към положителния щифт на LED чрез последователен резистор и кондензатор.
LED с резистор и кондензатор
Резистор последователно и кондензатор паралелно са свързани с LED, за да генерират правилна аналогова вълна от PWM изход, тъй като аналоговият изход не е чист, когато се генерира директно от PWM щифт.
STM32 с ULN2003 и ULN2003 с вентилатор
STM32 PWM изходният щифт (PA8) е свързан към входния щифт (IN1) на ULN2003 IC и съответният изходен щифт (OUT1) на ULN2003 е свързан към отрицателен проводник на DC ВЕНТИЛАТОРА.
Положителният щифт на DC вентилатора е свързан към COM щифта на ULN2003 IC, а външната батерия (9V DC) също е свързан към същия COM щифт на ULN2003 IC. GND щифт на ULN2003 е свързан към GND щифт на STM32, а отрицателният батерия е свързан към същия GND пин.
STM32 с LCD (16x2)
LCD щифт № |
Име на LCD щифт |
Име на щифта STM32 |
1 |
Земя (Gnd) |
Земя (G) |
2 |
VCC |
5V |
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 |
LED Положителен |
5V |
16. |
LED отрицателен |
Земя (G) |
Потенциометър от дясната страна се използва за управление на контраста на LCD дисплея. Горната таблица показва връзката между LCD и STM32.
Програмиране на STM32
Подобно на предишния урок, ние програмирахме STM32F103C8 с Arduino IDE през USB порт, без да използваме FTDI програмист. За да научите повече за програмирането на STM32 с Arduino IDE, следвайте връзката. Можем да продължим програмирането както в Arduino. Пълният код е даден в края.
При това кодиране ще вземем входна аналогова стойност от ADC щифт (PA4), който е свързан към централния щифт на левия потенциометър, и след това ще преобразуваме аналоговата стойност (0-3.3V) в цифров или цяло число формат (0-4095). Тази цифрова стойност допълнително се предоставя като ШИМ изход за контрол на яркостта на LED и скоростта на DC вентилатора. LCD 16x2 се използва за показване на ADC и картографирана стойност (изходна стойност на ШИМ).
Първо трябва да включим заглавния файл на LCD, да декларираме щифтовете на LCD и да ги инициализираме, използвайки кода по-долу. Научете повече за свързването на LCD със STM32 тук.
#include
След това декларирайте и дефинирайте имената на пиновете, като използвате щифта на STM32
const int analoginput = PA4; // Вход от потенциометър const int led = PA9; // LED изход const int fan = PA8; // изход на вентилатора
Сега вътре в настройката () , трябва да покажем някои съобщения и да ги изчистим след няколко секунди и да посочим пина INPUT и изхода PWM
lcd.begin (16,2); // Подготовка за LCD lcd.clear (); // Изчиства LCD lcd.setCursor (0,0); // Задава курсор на ред0 и колона0 lcd.print ("CIRCUIT DIGEST"); // Показва Circuit Digest lcd.setCursor (0,1); // Задава курсор в колона0 и ред1 lcd.print ("PWM USING STM32"); // Показва ШИМ с използване на закъснение STM32 (2000); // Време за забавяне lcd.clear (); // Изчиства LCD pinMode (аналогов вход, INPUT); // задаване на аналогов режим на пинов режим като INPUT pinMode (led, PWM); // задаване на режим на пин, воден като PWM изход pinMode (вентилатор, ШИМ); // задаване на вентилатор в режим на щифт като PWM изход
Аналоговият входен щифт (PA4) е зададен като INPUT by pinMode (analoginput, INPUT), LED pin е зададен като ШИМ изход от pinMode (led, PWM), а щифтът на вентилатора е зададен като ШИМ изход от pinMode (вентилатор, PWM) . Тук PWM изходните щифтове са свързани към LED (PA9) и вентилатора (PA8).
Следваща функция void loop () , четем аналоговия сигнал от ADC щифта (PA4) и го съхраняваме в целочислена променлива, която преобразува аналоговото напрежение в цифрови цели числа (0-4095), като използваме по-долу код int valueadc = analogRead (analoginput);
Важното нещо, което трябва да се отбележи тук, е PWM щифтовете, които са канали на STM32 с 16-битова резолюция (0-65535), така че трябва да го картографираме с аналогови стойности, като използваме функцията за карта, както по-долу
int резултат = карта (valueadc, 0, 4095, 0, 65535).
Ако не се използва картографиране, няма да получим пълна скорост на вентилатора или пълна яркост на светодиода, като променяме потенциометъра.
След това записваме PWM изхода на светодиода, като използваме pwmWrite (led, резултат) и PWM изход към вентилатора, като използваме функциите pwmWrite (вентилатор, резултат ).
Накрая показваме аналоговата входна стойност (ADC стойност) и изходните стойности (PWM стойности) на LCD дисплей, като използваме следните команди
lcd.setCursor (0,0); // Задава курсор на ред0 и колона0 lcd.print ("ADC стойност ="); // отпечатва думите “” lcd.print (valueadc); // показва valueadc lcd.setCursor (0,1); // Задава курсора в колона0 и ред1 lcd.print ("Output ="); // отпечатва думите в "" lcd.print (резултат); // показва резултата от стойността
Пълният код с демонстрационно видео е даден по-долу.