- Ano ang PWM (Pulse na may Modulasyon)?
- PWM sa STM32
- Kinakailangan ang Mga Bahagi
- Mga Detalye ng Pin ng STM32
- Circuit Diagram at Mga Koneksyon
- Programming STM32
Sa nakaraang artikulo nakita natin ang tungkol sa pag-convert ng ADC gamit ang STM32. Sa tutorial na ito, malalaman natin ang tungkol sa PWM (Pulse Width Modulation) sa STM32 at kung paano namin makokontrol ang liwanag ng LED o bilis ng fan ng DC gamit ang diskarteng PWM.
Alam namin na mayroong dalawang uri ng signal: Analog at Digital. Ang mga signal ng analog ay may mga voltages tulad ng (3V, 1V… atbp) at ang mga digital signal ay mayroong (1 'at 0's). Ang mga output ng sensor ay nasa mga analog signal at ang mga analog signal na ito ay na-convert sa digital gamit ang ADC, dahil ang mga microcontroller ay nakakaintindi lamang ng digital. Matapos maproseso ang mga halagang ADC, muli ang output ay kailangang i-convert sa analog form upang himukin ang mga analog na aparato. Para doon ginagamit namin ang ilang mga pamamaraan tulad ng mga converter ng PWM, Digital to Analog (DAC) atbp.
Ano ang PWM (Pulse na may Modulasyon)?
Ang PWM ay isang paraan upang makontrol ang mga analog na aparato gamit ang digital na halaga tulad ng pagkontrol sa bilis ng motor, ningning ng isang humantong atbp. Alam namin na ang motor at pinangunahan ay gumagana sa analog signal. Ngunit ang PWM ay hindi nagbibigay ng purong analog output, ang PWM ay parang analog signal na ginawa ng mga maikling pulso, na ibinibigay ng duty cycle.
Pag-ikot ng tungkulin ng PWM
Ang porsyento ng oras kung saan ang signal ng PWM ay mananatiling TAAS (sa oras) ay tinawag bilang duty cycle. Kung ang signal ay laging ON ito ay nasa 100% na cycle ng tungkulin at kung palaging naka-off ito ay 0% na cycle ng tungkulin.
Duty Cycle = I-ON ang oras / (I-ON ang oras + I-OFF ang oras)
PWM sa STM32
Ang STM32F103C8 ay may 15 PWM na pin at 10 ADC pin. Mayroong 7 timer at bawat output ng PWM ay ibinibigay ng isang channel na konektado sa 4 na timer. Mayroon itong resolusyon na 16-bit PWM (2 16), iyon ang mga counter at variable ay maaaring kasing laki ng 65535. Sa isang rate ng orasan na 72MHz, ang isang output ng PWM ay maaaring magkaroon ng maximum na tagal ng halos isang millisecond.
- Kaya't ang halagang 65535 ay nagbibigay ng BUONG Liwanag ng LED AT BUONG BILIS ng DC Fan (100% Duty Cycle)
- Gayundin ang halaga ng 32767 ay nagbibigay sa BAGONG KARAPATAN ng LED AT HALF SPEED ng DC Fan (50% Duty Cycle)
- At ang halagang 13107 ay nagbibigay (20%) KARAPATAN AT (20%) SPEED (20% Duty Cycle)
Sa tutorial na ito, gumagamit kami ng potensyomiter at STM32 upang iiba-iba ang ningning ng LED at bilis ng isang DC fan ng diskarteng PWM. Ginagamit ang isang 16x2 LCD upang maipakita ang halaga ng ADC (0-4095) at ang binagong variable (halagang PWM) na output (0-65535).
Narito ang ilang mga halimbawa ng PWM sa iba pang Microcontroller:
- Bumubuo ng PWM gamit ang PIC Microcontroller na may MPLAB at XC8
- Servo Motor Control na may Raspberry Pi
- Batay sa Arduino LED Dimmer gamit ang PWM
- Pulse width Modulation (PWM) gamit ang MSP430G2
Suriin ang lahat ng mga proyekto na nauugnay sa PWM dito.
Kinakailangan ang Mga Bahagi
- STM32F103C8
- DC fan
- ULN2003 Motor Driver IC
- LED (PULA)
- LCD (16x2)
- Potensyomiter
- Breadboard
- Baterya 9V
- Jumper Wires
DC Fan: Ang DC fan na ginamit dito ay fan ng BLDC mula sa isang lumang PC. Nangangailangan ito ng panlabas na supply kaya gumagamit kami ng isang 9V dc na baterya.
ULN2003 Motor Driver IC: Ginagamit ito upang himukin ang motor sa isang direksyon habang ang motor ay unidirectional at kailangan din ng panlabas na lakas para sa fan. Dagdagan ang nalalaman tungkol sa ULN2003 batay sa Motor Driver Circuit dito. Nasa ibaba ang larawan ng larawan ng ULN2003:
Ang mga pin (IN1 hanggang IN7) ay mga input pin at (OUT 1 hanggang OUT 7) ay kaukulang mga output pin. Ibinibigay ang COM ng Positibong mapagkukunan ng mapagkukunan na kinakailangan para sa mga output device.
LED: RED na may kulay na led na ginagamit na naglalabas ng RED light. Ang anumang mga kulay ay maaaring magamit.
Mga Potensyometro: Ang dalawang potentiometers ay ginagamit ng isa ay para sa voltage divider para sa analog input sa ADC at isa pa ay para sa pagkontrol ng brightness ng led.
Mga Detalye ng Pin ng STM32
Tulad ng nakikita natin ang mga PWM na pin ay ipinahiwatig sa format ng alon (~), mayroong 15 mga naturang pin, ang mga ADC pin ay representd sa berdeng kulay, 10 mga ADC na pin ang naroroon na ginagamit para sa mga analog input.
Circuit Diagram at Mga Koneksyon
Ang mga koneksyon ng STM32 na may iba't ibang mga sangkap ay ipinaliwanag tulad ng sa ibaba:
STM32 na may Analog Input (ADC)
Ang potentiometer na naroroon sa kaliwang bahagi ng circuit ay ginagamit bilang voltage regulator na kumokontrol sa boltahe mula sa 3.3V pin. Ang output mula sa potentiometer ie center pin ng potentiometer ay konektado sa ADC pin (PA4) ng STM32.
STM32 na may LED
Ang STM32 PWM output pin (PA9) ay konektado sa positibong pin ng LED sa pamamagitan ng isang serye ng risistor at isang kapasitor.
LED na may Resistor at Capacitor
Ang isang risistor sa serye at isang capacitor sa kahanay ay konektado sa LED upang makabuo ng tamang Analog alon mula sa PWM output bilang analog output ay hindi sa dalisay mula sa kapag direktang nabuo mula sa PWM pin.
Ang STM32 na may ULN2003 & ULN2003 na may Fan
Ang STM32 PWM output pin (PA8) ay konektado sa Input pin (IN1) ng ULN2003 IC at ang kaukulang output pin (OUT1) ng ULN2003 ay konektado sa negatibong wire ng DC FAN.
Ang positibong pin ng fan ng DC ay konektado sa COM pin ng ULN2003 IC at ang panlabas na baterya (9V DC) ay konektado din sa parehong COM pin ng ULN2003 IC. Ang GND pin ng ULN2003 ay konektado sa GND pin ng STM32 at ang negatibo sa baterya ay nakakonekta sa parehong pin ng GND.
STM32 na may LCD (16x2)
LCD Pin Hindi |
Pangalan ng LCD Pin |
Pangalan ng STM32 Pin |
1 |
Lupa (Gnd) |
Lupa (G) |
2 |
VCC |
5V |
3 |
VEE |
Pin mula sa Center of Potentiometer |
4 |
Pagpili ng Rehistro (RS) |
PB11 |
5 |
Basahin / Isulat (RW) |
Lupa (G) |
6 |
Paganahin (EN) |
PB10 |
7 |
Data Bit 0 (DB0) |
Walang Koneksyon (NC) |
8 |
Data Bit 1 (DB1) |
Walang Koneksyon (NC) |
9 |
Data Bit 2 (DB2) |
Walang Koneksyon (NC) |
10 |
Data Bit 3 (DB3) |
Walang Koneksyon (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 |
Positive na LED |
5V |
16 |
Negatibo sa LED |
Lupa (G) |
Ginagamit ang isang potensyomiter sa kanang bahagi upang makontrol ang kaibahan ng LCD display. Ipinapakita ng talahanayan sa itaas ang koneksyon sa pagitan ng LCD at STM32.
Programming STM32
Tulad ng nakaraang tutorial, pinrograma namin ang STM32F103C8 kasama ang Arduino IDE sa pamamagitan ng USB port nang hindi ginagamit ang FTDI programmer. Upang malaman ang tungkol sa programa ng STM32 na may Arduino IDE sundin ang link. Maaari kaming magpatuloy sa pagprograma tulad ng sa Arduino. Ang kumpletong code ay ibinibigay sa dulo.
Sa pag-coding na ito ay kukuha kami ng isang input na halaga ng analog mula sa ADC pin (PA4) na konektado sa gitnang pin ng kaliwang potensyomiter at pagkatapos ay i-convert ang halaga ng Analog (0-3.3V) sa digital o integer format (0-4095). Ang digital na halaga na ito ay karagdagang ibinigay bilang PWM output upang makontrol ang LED brightness at bilis ng DC fan. Ang isang 16x2 LCD ay ginagamit upang ipakita ang ADC at na-map na halaga (halaga ng output ng PWM).
Una kailangan naming isama ang LCD header file, ideklara ang mga LCD pin at ipasimula ang mga ito gamit ang code sa ibaba. Dagdagan ang nalalaman tungkol sa interfacing LCD sa STM32 dito.
# isama
Susunod na ideklara at tukuyin ang mga pangalan ng pin gamit ang pin ng STM32
Const int analoginput = PA4; // Input from potentiometer const int led = PA9; // LED output const int fan = PA8; // output ng fan
Ngayon sa loob ng pag- setup () , kailangan naming ipakita ang ilang mga mensahe at i-clear ang mga ito pagkatapos ng ilang segundo at tukuyin ang INPUT pin at PWM output pin
lcd.begin (16,2); // Paghahanda ng LCD lcd.clear (); // Nilinaw ang LCD lcd.setCursor (0,0); // Nagtatakda ng cursor sa row0 at haligi0 lcd.print ("CIRCUIT DIGEST"); // Ipinapakita ang Circuit Digest lcd.setCursor (0,1); // Sets Cursor sa haligi0 at row1 lcd.print ("PWM USING STM32"); // Ipinapakita ang PWM gamit ang pagkaantala ng STM32 (2000); // Delay Time lcd.clear (); // Nilinaw ang LCD pinMode (analoginput, INPUT); // set pin mode analoginput as INPUT pinMode (led, PWM); // set pin mode led as PWM output pinMode (fan, PWM); // itakda ang pin mode fan bilang output ng PWM
Ang Analog input pin (PA4) ay itinakda bilang INPUT ng pinMode (analoginput, INPUT), ang LED pin ay itinakda bilang PWM output ng pinMode (led, PWM) at fan pin ay itinakda bilang PWM output ng pinMode (fan, PWM) . Narito ang mga PWM output pin ay konektado sa LED (PA9) at Fan (PA8).
Susunod sa pag- andar ng void loop () , binasa namin ang signal ng Analog mula sa ADC pin (PA4) at iniimbak ito sa isang variable na integer na nagko-convert ng analog voltage sa mga digital integer na halaga (0-4095) sa pamamagitan ng paggamit sa ibaba ng code int valueadc = analogRead (analoginput);
Mahalagang bagay na dapat tandaan dito ay ang mga PWM na pin na mga channel ng STM32 ay may resolusyon na 16-Bit (0-65535) kaya kailangan nating i-map ang na may mga halagang analog na gumagamit ng pag-andar ng mapa tulad ng sa ibaba
int resulta = mapa (valueadc, 0, 4095, 0, 65535).
Kung hindi nagamit ang pagmamapa hindi kami makakakuha ng buong bilis ng fan o buong ningning ng LED sa pamamagitan ng pag-iiba ng potensyomiter.
Pagkatapos ay isinusulat namin ang output ng PWM sa LED sa pamamagitan ng paggamit ng pwmWrite (led, resulta) at output ng PWM sa fan sa pamamagitan ng paggamit ng pwmWrite (fan, resulta ) na mga pagpapaandar.
Sa wakas ipinapakita namin ang halaga ng pag-input ng Analog (halaga ng ADC) at ang mga halaga ng output (halaga ng PWM) sa LCD display sa pamamagitan ng paggamit ng mga sumusunod na utos
lcd.setCursor (0,0); // Nagtatakda ng cursor sa row0 at haligi0 lcd.print ("ADC value ="); // naglilimbag ng mga salitang "" lcd.print (valueadc); // ipinapakita ang valueadc lcd.setCursor (0,1); // Sets Cursor sa haligi0 at row1 lcd.print ("Output ="); // nakalimbag ang mga salita sa "" lcd.print (resulta); // nagpapakita ng resulta ng halaga
Kumpletuhin ang Code na may isang demonstration Video ay ibinibigay sa ibaba.