- Što je PWM signal?
- PWM koji koristi PIC16F877A:
- Programiranje PIC-a za generiranje PWM signala:
- Sheme i ispitivanje:
- Rad na hardveru:
Ovo je naš deseti vodič za učenje PIC mikrokontrolera pomoću MPLAB-a i XC8. Do sada smo pokrili mnoge osnovne vodiče poput LED-a koji trepće s PIC-om, mjerači vremena u PIC-u, povezivanje LCD-a, povezivanje 7-segmenta, ADC-a pomoću PIC-a itd. Ako ste apsolutni početnik, posjetite cijeli popis PIC tutorijala ovdje i počnite učiti.
U ovom uputstvu naučit ćemo kako generirati PWM signale pomoću PIC PIC16F877A. Naš PIC MCU ima poseban modul koji se naziva Usporedni modul za snimanje (CCP) koji se može koristiti za generiranje PWM signala. Ovdje ćemo generirati PWM od 5 kHz s promjenjivim radnim ciklusom od 0% do 100%. Da bismo varirali radni ciklus, koristimo potenciometar, stoga je preporučljivo naučiti ADC tutorial prije početka s PWM-om. PWM modul također koristi tajmere za podešavanje frekvencije, pa ovdje unaprijed naučite kako koristiti tajmere. Nadalje, u ovom uputstvu koristit ćemo RC krug i LED za pretvorbu vrijednosti PWM-a u analogni napon i koristiti ga za prigušivanje LED svjetla.
Što je PWM signal?
Modulacija širine impulsa (PWM) digitalni je signal koji se najčešće koristi u upravljačkim krugovima. Ovaj je signal postavljen na visoku (5v) i nisku (0v) u unaprijed definiranom vremenu i brzini. Vrijeme tijekom kojeg signal ostaje visok naziva se "on time", a vrijeme tijekom kojeg signal ostaje nizak "vrijeme isključenja". Postoje dva važna parametra za PWM o kojima se govori u nastavku:
Radni ciklus PWM:
Postotak vremena u kojem PWM signal ostaje VISOK (na vrijeme) naziva se radnim ciklusom. Ako je signal uvijek UKLJUČEN, on je u 100% radnom ciklusu, a ako je uvijek isključen, to je 0% radnog ciklusa.
Radni ciklus = Vrijeme UKLJUČIVANJA / (Vrijeme UKLJUČIVANJA + Vrijeme isključivanja)

Učestalost PWM-a:
Učestalost PWM signala određuje koliko brzo PWM završava jedno razdoblje. Jedno razdoblje je potpuno UKLJUČENO i ISKLJUČENO za PWM signal, kao što je prikazano na gornjoj slici. U našem uputstvu ćemo postaviti frekvenciju od 5KHz.
PWM koji koristi PIC16F877A:
PWM signali mogu se generirati u našem PIC mikrokontroleru pomoću CCP (Compare Capture PWM) modula. Razlučivost našeg PWM signala je 10-bitna, odnosno za vrijednost 0 bit će radni ciklus 0%, a za vrijednost 1024 (2 ^ 10) radni ciklus 100%. U našem PIC MCU-u postoje dva CCP modula (CCP1 i CCP2), to znači da istovremeno možemo generirati dva PWM signala na dva različita pina (pin 17 i 16), u našem vodiču koristimo CCP1 za generiranje PWM signala na pin 17.
Sljedeći registri koriste se za generiranje PWM signala pomoću našeg PIC MCU-a:
- CCP1CON (CCP1 kontrolni registar)
- T2CON (registar upravljanja timerom 2)
- PR2 (registracija razdoblja modula odbrojavanja 2)
- CCPR1L (CCP registar 1 nizak)
Programiranje PIC-a za generiranje PWM signala:
U našem programu očitat ćemo analogni napon 0-5v s potenciometra i mapirati ga na 0-1024 pomoću našeg ADC modula. Tada generiramo PWM signal s frekvencijom 5000Hz i mijenjamo njegov radni ciklus na temelju ulaznog analognog napona. To je 0-1024 pretvorit će se u 0% -100% radnog ciklusa. Ovaj tutorial pretpostavlja da ste već naučili koristiti ADC u PIC-u, ako ne, pročitajte ga odavde, jer ćemo preskočiti detalje o njemu u ovom vodiču.
Dakle, nakon što se postave konfiguracijski bitovi i program napiše za čitanje analogne vrijednosti, možemo nastaviti s PWM-om.
Sljedeće korake treba poduzeti prilikom konfiguriranja CCP modula za rad PWM-a:
- Postavite PWM razdoblje upisivanjem u PR2 registar.
- Postavite radni ciklus PWM upisivanjem u CCPR1L registar i CCP1CON <5: 4> bitova.
- Napravite CCP1 pin izlazom uklanjanjem bita TRISC <2>.
- Postavite TMR2 vrijednost predskaliranja i omogućite Timer2 pisanjem u T2CON.
- Konfigurirajte CCP1 modul za rad PWM-a.
U ovom programu postoje dvije važne funkcije za generiranje PWM signala. Jedna je funkcija PWM_Initialize () koja će pokrenuti registre potrebne za postavljanje PWM modula, a zatim postaviti frekvenciju na kojoj bi PWM trebao raditi, druga funkcija je funkcija PWM_Duty () koja će postaviti radni ciklus PWM signala u potrebni registri.
PWM_Initialize () {PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1; // Postavljanje PR2 formula pomoću tablice podataka // PWM radi u 5KHZ CCP1M3 = 1; CCP1M2 = 1; // Konfiguriranje CCP1 modula T2CKPS0 = 1; T2CKPS1 = 0; TMR2ON = 1; // Konfiguriranje modula Timer TRISC2 = 0; // napravimo pin na C kao izlaz}
Gornja funkcija je funkcija inicijalizacije PWM-a, u ovoj je funkciji modul CCP1 postavljen za upotrebu PWM-a tako da bit CCP1M3 i CCP1M2 bude visok.

Predkaler modula tajmera postavlja se postavljanjem bita T2CKPS0 kao visokog, a T2CKPS1 kao nižeg bita TMR2ON za pokretanje tajmera.

Sada moramo postaviti frekvenciju PWM signala. Vrijednost frekvencije mora se upisati u registar PR2. Željena frekvencija može se postaviti pomoću dolje navedenih formula
Razdoblje PWM = * 4 * TOSC * (TMR2 vrijednost predškolske skale)
Preuređivanje ovih formula da bi se dobio PR2 dat će
PR2 = (Razdoblje / (4 * Tosc * TMR2 prescale)) - 1
Znamo da je Period = (1 / PWM_freq) i Tosc = (1 / _XTAL_FREQ). Stoga…..
PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1;
Jednom kad je frekvencija postavljena, ovu funkciju ne treba ponovno pozivati, osim ako i dok ponovno ne promijenimo frekvenciju. U našem uputstvu dodijelio sam PWM_freq = 5000; tako da možemo dobiti radnu frekvenciju od 5 KHz za naš PWM signal.
Postavimo sada radni ciklus PWM- a pomoću donje funkcije
PWM_Duty (nepotpisana int duty) {if (duty <1023) {duty = ((float) duty / 1023) * (_ XTAL_FREQ / (PWM_freq * TMR2PRESCALE)); // Pri smanjenju // duty = (((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE); CCP1X = carina & 1; // Spremimo 1. bit CCP1Y = duty & 2; // Spremimo 0-bitni CCPR1L = duty >> 2; // Spremimo podsmjerni 8-bitni}}
Naš PWM signal ima 10-bitnu razlučivost, stoga se ova vrijednost ne može pohraniti u jedan registar, jer naš PIC ima samo 8-bitne podatkovne linije. Dakle, koristimo za druga dva bita CCP1CON <5: 4> (CCP1X i CCP1Y) za spremanje posljednja dva LSB-a, a zatim za pohranu preostalih 8 bita u CCPR1L registar.
Vrijeme radnog ciklusa PWM može se izračunati pomoću sljedećih formula:
Radni ciklus PWM = (CCPRIL: CCP1CON <5: 4>) * Tosc * (TMR2 vrijednost predskale)
Preuređivanjem ovih formula da se dobiju vrijednosti CCPR1L i CCP1CON dobit će se:
CCPRIL: CCP1Con <5: 4> = radni ciklus PWM / (vrijednost predskale Tosc * TMR2)
Vrijednost našeg ADC-a bit će 0-1024, a to treba biti u 0% -100%, dakle, radni ciklus PWM = carina / 1023. Da bismo pretvorili ovaj radni ciklus u vremensko razdoblje, moramo ga pomnožiti s razdobljem (1 / PWM_freq)
Također znamo da je Tosc = (1 / PWM_freq), dakle..
Dužnost = (((plutajuća) carina / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE);
Rješavanje gornje jednadžbe dat će nam:
Dužnost = ((plutajuća) dužnost / 1023) * (_XTAL_FREQ / (PWM_freq * TMR2PRESCALE));
Kompletni program možete provjeriti u odjeljku Code ispod s detaljnim videozapisom.
Sheme i ispitivanje:
Kao i obično, provjerimo izlaz koristeći Proteusovu simulaciju. Spojnoj shemi je prikazan ispod.

Spojiti potenciometar do 7 th klin za životinje na napon od 0-5. CCP1 modul je s pinom 17 (RC2), ovdje će se generirati PWM koji se može provjeriti pomoću digitalnog osciloskopa. Da bismo to pretvorili u promjenjivi napon , koristili smo RC-filter i LED za provjeru izlaza bez opsega.
Što je RC-filtar?
RC filtar ili Niskopropusni filtar je jednostavan sklop s dva pasivnih elemenata naime otpornika i kondenzatora. Te dvije komponente koriste se za filtriranje frekvencije našeg PWM signala i čine ga promjenjivim istosmjernim naponom.
Ako ispitamo krug, kad se na ulaz R primijeni promjenjivi napon, kondenzator C će se početi puniti. Sada na temelju vrijednosti kondenzatora, kondenzatoru će trebati neko vrijeme da se potpuno napuni, nakon što se napuni blokirat će istosmjernu struju (sjetite se da kondenzatori blokiraju istosmjernu struju, pa će se ulazni istosmjerni napon pojaviti na izlazu. Visokofrekventni PWM (AC signal) bit će uzemljen kroz kondenzator. Tako se preko kondenzatora dobije čisti DC. Utvrđeno je da je vrijednost od 1000Ohm i 1uf prikladna za ovaj projekt. Izračunavanje vrijednosti R i C uključuje analizu kruga pomoću prijenosne funkcije, što je izvan opsega ovog vodiča.

Izlaz programa može se provjeriti pomoću digitalnog osciloskopa, kao što je prikazano u nastavku, mijenjajte potenciometar i treba se promijeniti radni ciklus PWM-a. Izlazni napon RC kruga također možemo primijetiti pomoću Voltmetra. Ako sve funkcionira prema očekivanjima, možemo nastaviti s našim hardverom. Dalje provjerite videozapis na kraju za cjelovit postupak.

Rad na hardveru:
Hardversko postavljanje projekta je vrlo jednostavno, mi ćemo samo ponovno koristiti našu PIC Perf ploču prikazanu u nastavku.

Trebat će nam i potenciometar za napajanje analognog napona, na svoj lonac sam spojio neke ženske krajnje žice (prikazano dolje) kako bismo ih mogli izravno povezati s PIC Perf pločom.


Konačno, da bismo provjerili izlaz, trebaju nam RC krug i LED da bismo vidjeli kako funkcionira PWM signal, jednostavno sam upotrijebio malu perf ploču i na njega zalemio RC krug i LED (za kontrolu svjetline) kao što je prikazano dolje

Možemo koristiti jednostavne ženske i ženske spojne žice i spojiti ih prema gore prikazanim shemama. Nakon što je veza završena, prenesite program na PIC koristeći naš pickit3 i trebali biste moći dobiti promjenjivi napon na temelju ulaza vašeg potenciometra. Varijabilni izlaz koristi se za kontrolu svjetline LED ovdje.
Multimetar sam koristio za mjerenje promjenljivih izlaza, također možemo primijetiti kako se svjetlina LED mijenja za različite razine napona.

To je sve što smo programirali za očitavanje analognog napona s POT-a i pretvaranje u PWM signale koji su zauzvrat pretvoreni u promjenjivi napon pomoću RC filtra, a rezultat se provjerava pomoću našeg hardvera. Ako sumnjate ili negdje zapnete, ljubazno upotrijebite odjeljak za komentare u nastavku, rado ćemo vam pomoći. Kompletan radni radi u videu.
Provjerite i ostale naše PWM upute na drugim mikrokontrolerima:
- Vodič za PWM za Raspberry Pi
- PWM s Arduino zbog
- LED zatamnjivač zasnovan na Arduinu koji koristi PWM
- Prigušivač LED napajanja pomoću ATmega32 mikrokontrolera
