- Ce este un semnal PWM?
- PWM folosind PIC16F877A:
- Programarea PIC pentru a genera semnale PWM:
- Scheme și teste:
- Lucrul la hardware:
Acesta este al 10-lea tutorial despre învățarea microcontrolerelor PIC folosind MPLAB și XC8. Până acum, am acoperit multe tutoriale de bază, cum ar fi LED-urile care clipesc cu PIC, cronometrele în PIC, interfața LCD, interfața pe 7 segmente, ADC folosind PIC etc. Dacă sunteți un începător absolut, vă rugăm să vizitați lista completă a tutorialelor PIC aici și începe să înveți.
În acest tutorial, vom învăța cum să generați semnale PWM utilizând PIC PIC16F877A. MCU-ul nostru PIC are un modul special numit Compară modulul de captare (CCP) care poate fi utilizat pentru a genera semnale PWM. Aici, vom genera un PWM de 5 kHz cu un ciclu de funcționare variabil de la 0% la 100%. Pentru a varia ciclul de funcționare, folosim un potențiometru, de aceea este recomandat să învățați tutorialul ADC înainte de a începe cu PWM. Modulul PWM folosește, de asemenea, temporizatoare pentru a-și seta frecvența, prin urmare, aflați cum să utilizați temporizatoare în prealabil aici. În plus, în acest tutorial vom folosi un circuit RC și un LED pentru a converti valorile PWM în tensiune analogică și îl vom folosi pentru diminuarea luminii LED.
Ce este un semnal PWM?
Modularea lățimii pulsului (PWM) este un semnal digital care este cel mai frecvent utilizat în circuitele de control. Acest semnal este setat ridicat (5v) și scăzut (0v) într-un timp și viteză predefiniți. Timpul în care semnalul rămâne ridicat se numește „timp activ”, iar timpul în care semnalul rămâne scăzut se numește „timp oprit”. Există doi parametri importanți pentru un PWM, așa cum este discutat mai jos:
Ciclul de funcționare al PWM:
Procentul de timp în care semnalul PWM rămâne HIGH (la timp) este numit ciclu de funcționare. Dacă semnalul este întotdeauna PORNIT, este în ciclu de funcționare 100% și dacă este întotdeauna oprit, este ciclu de funcționare de 0%.
Ciclul de funcționare = Timp de pornire / (Timp de pornire + Timp de oprire)
Frecvența unui PWM:
Frecvența unui semnal PWM determină cât de rapid un PWM finalizează o perioadă. O perioadă este completă PORNIT și OPRIT un semnal PWM așa cum se arată în figura de mai sus. În tutorialul nostru vom seta o frecvență de 5KHz.
PWM folosind PIC16F877A:
Semnalele PWM pot fi generate în microcontrolerul nostru PIC utilizând modulul CCP (Compare Capture PWM). Rezoluția semnalului nostru PWM este de 10 biți, adică pentru o valoare de 0 va exista un ciclu de funcționare de 0% și pentru o valoare de 1024 (2 ^ 10) va exista un ciclu de funcționare de 100%. Există două module CCP în MCU-ul nostru PIC (CCP1 și CCP2), ceea ce înseamnă că putem genera două semnale PWM pe doi pini diferiți (pinii 17 și 16) simultan, în tutorialul nostru folosim CCP1 pentru a genera semnale PWM pe pinul 17.
Următoarele registre sunt utilizate pentru a genera semnale PWM utilizând MCU-ul nostru PIC:
- CCP1CON (Registrul de control CCP1)
- T2CON (Timer 2 Control Register)
- PR2 (Timer 2 module Period Register)
- CCPR1L (CCP Register 1 Low)
Programarea PIC pentru a genera semnale PWM:
În programul nostru vom citi o tensiune analogică de 0-5v de la un potențiometru și o vom mapa la 0-1024 folosind modulul nostru ADC. Apoi generăm un semnal PWM cu frecvența de 5000Hz și îi schimbăm ciclul de funcționare pe baza tensiunii analogice de intrare. Adică 0-1024 va fi convertit la 0% -100% Ciclul de funcționare. Acest tutorial presupune că ați învățat deja să utilizați ADC în PIC, dacă nu, citiți-l de aici, deoarece vom ignora detaliile despre acesta în acest tutorial.
Deci, odată ce biții de configurare sunt setați și programul este scris pentru a citi o valoare analogică, putem continua cu PWM.
Următorii pași ar trebui luați la configurarea modulului CCP pentru funcționarea PWM:
- Setați perioada PWM scriind în registrul PR2.
- Setați ciclul de funcționare PWM scriind în registrul CCPR1L și CCP1CON <5: 4> biți.
- Faceți pinul CCP1 o ieșire ștergând bitul TRISC <2>.
- Setați valoarea de prescalare TMR2 și activați Timer2 scriind pe T2CON.
- Configurați modulul CCP1 pentru funcționarea PWM.
Există două funcții importante în acest program pentru a genera semnale PWM. Una este funcția PWM_Initialize () care va inițializa registrele necesare configurării modulului PWM și apoi va stabili frecvența la care ar trebui să funcționeze PWM, cealaltă funcție este funcția PWM_Duty () care va seta ciclul de funcționare al semnalului PWM în registrele necesare.
PWM_Initialize () {PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1; // Setarea formulelor PR2 folosind foaia de date // Face ca PWM să funcționeze în 5KHZ CCP1M3 = 1; CCP1M2 = 1; // Configurați modulul CCP1 T2CKPS0 = 1; T2CKPS1 = 0; TMR2ON = 1; // Configurați modulul Timer TRISC2 = 0; // faceți portul PIN pe C ca ieșire}
Funcția de mai sus este funcția de inițializare PWM, în această funcție Modulul CCP1 este setat să utilizeze PWM făcând bitul CCP1M3 și CCP1M2 la fel de mare.
Prescalerul modulului temporizator este setat făcând bitul T2CKPS0 la fel de mare și T2CKPS1 la nivelul minim, bitul TMR2ON este setat pentru a porni temporizatorul.
Acum, trebuie să setăm Frecvența semnalului PWM. Valoarea frecvenței trebuie să fie scrisă în registrul PR2. Frecvența dorită poate fi setată utilizând formulele de mai jos
Perioada PWM = * 4 * TOSC * (valoarea de precalare TMR2)
Rearanjarea acestor formule pentru a obține PR2 va da
PR2 = (Perioada / (4 * Tosc * TMR2 Prescale)) - 1
Știm că Period = (1 / PWM_freq) și Tosc = (1 / _XTAL_FREQ). Prin urmare…..
PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1;
Odată ce frecvența este setată, această funcție nu trebuie apelată din nou decât dacă și până când trebuie să schimbăm din nou frecvența. În tutorialul nostru am atribuit PWM_freq = 5000; astfel încât să putem obține o frecvență de operare de 5 KHz pentru semnalul nostru PWM.
Acum, să stabilim ciclul de funcționare al PWM utilizând funcția de mai jos
PWM_Duty (nesemnat int duty) {if (duty <1023) {duty = ((float) duty / 1023) * (_ XTAL_FREQ / (PWM_freq * TMR2PRESCALE)); // La reducere // tax = (((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE); CCP1X = datorie & 1; // Stocați primul bit CCP1Y = duty & 2; // Stocați bitul 0 CCPR1L = duty >> 2; // Stocați restul de 8 biți}}
Semnalul nostru PWM are o rezoluție de 10 biți, prin urmare această valoare nu poate fi stocată într-un singur registru, deoarece PIC-ul nostru are doar linii de date pe 8 biți. Deci, avem obișnuit cu alți doi biți de CCP1CON <5: 4> (CCP1X și CCP1Y) pentru a stoca ultimii doi LSB și apoi pentru a stoca restul de 8 biți în registrul CCPR1L.
Timpul ciclului de funcționare PWM poate fi calculat utilizând formulele de mai jos:
PWM Duty Cycle = (CCPRIL: CCP1CON <5: 4>) * Tosc * (TMR2 Prescale Value)
Rearanjarea acestor formule pentru a obține valoarea CCPR1L și CCP1CON va da:
CCPRIL: CCP1Con <5: 4> = PWM Duty Cycle / (Tosc * TMR2 Prescale Value)
Valoarea ADC-ului nostru va fi 0-1024, trebuie să fie 0% -100%, prin urmare, PWM Duty Cycle = duty / 1023. În continuare, pentru a converti acest ciclu de funcționare într-o perioadă de timp, trebuie să-l înmulțim cu perioada (1 / PWM_freq)
Știm, de asemenea, că Tosc = (1 / PWM_freq), prin urmare..
Duty = (((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE);
Rezolvarea ecuației de mai sus ne va oferi:
Duty = ((float) duty / 1023) * (_XTAL_FREQ / (PWM_freq * TMR2PRESCALE));
Puteți verifica programul complet în secțiunea Cod de mai jos, împreună cu videoclipul detaliat.
Scheme și teste:
Ca de obicei, să verificăm ieșirea folosind simularea Proteus. Schema circuitului este prezentată mai jos.
Conectați un potențiometru la 7 - lea PIN pentru a hranei pentru animale într - o tensiune de 0-5. Modulul CCP1 este cu pinul 17 (RC2), aici va fi generat PWM care poate fi verificat folosind osciloscopul digital. În continuare, pentru a converti acest lucru într-o tensiune variabilă, am folosit un filtru RC și un LED pentru a verifica ieșirea fără scop.
Ce este un filtru RC?
Un filtru RC sau un filtru trece jos este un circuit simplu cu două elemente pasive și anume rezistorul și condensatorul. Aceste două componente sunt utilizate pentru a filtra frecvența semnalului nostru PWM și a face din acesta o tensiune continuă variabilă.
Dacă examinăm circuitul, când se aplică o tensiune variabilă la intrarea lui R, condensatorul C va începe să se încarce. Acum, pe baza valorii condensatorului, condensatorul va dura ceva timp pentru a se încărca complet, odată încărcat, acesta va bloca curentul continuu (Rețineți condensatorii blochează curent continuu, dar permite curent alternativ), prin urmare, tensiunea continuă de intrare va apărea pe ieșire. PWM de înaltă frecvență (semnal AC) va fi împământat prin condensator. Astfel se obține un DC pur pe condensator. O valoare de 1000Ohm și 1uf sa dovedit a fi adecvată pentru acest proiect. Calculul valorilor lui R și C implică analiza circuitului utilizând funcția de transfer, care nu intră în sfera acestui tutorial.
Ieșirea programului poate fi verificată folosind osciloscopul digital așa cum se arată mai jos, variați potențiometrul și ciclul de funcționare al PWM ar trebui să se schimbe. De asemenea, putem observa tensiunea de ieșire a circuitului RC folosind voltmetrul. Dacă totul funcționează conform așteptărilor, putem continua cu hardware-ul nostru. Verificați în continuare videoclipul la final pentru procesul complet.
Lucrul la hardware:
Configurarea hardware a proiectului este foarte simplă, vom reutiliza doar placa PIC Perf prezentată mai jos.
De asemenea, vom avea nevoie de un potențiometru pentru a alimenta tensiunea analogică, am atașat niște fire de capăt femele la potul meu (prezentat mai jos), astfel încât să le putem conecta direct la placa PIC Perf.
În cele din urmă, pentru a verifica ieșirea, avem nevoie de un circuit RC și un LED pentru a vedea cum funcționează semnalul PWM, am folosit pur și simplu o placă de perfecționare mică și am lipit circuitul RC și LED-ul (pentru a controla luminozitatea), așa cum se arată mai jos.
Putem folosi fire de conectare simple de la femele la femele și le putem conecta conform schemelor de mai sus. Odată ce conexiunea este terminată, încărcați programul pe PIC folosind pickit3-ul nostru și ar trebui să puteți obține o tensiune variabilă pe baza intrării potențiometrului. Ieșirea variabilă este utilizată pentru a controla luminozitatea LED-ului aici.
Mi-am folosit multimetrul pentru a măsura ieșirile variabile, putem observa, de asemenea, luminozitatea LED-ului schimbându-se pentru diferite niveluri de tensiune.
Asta este, am programat să citim tensiunea analogică din POT și să o convertim în semnale PWM care, la rândul lor, au fost convertite în tensiune variabilă folosind filtrul RC și rezultatul este verificat folosind hardware-ul nostru. Dacă aveți vreo îndoială sau vă blocați undeva, folosiți cu amabilitate secțiunea de comentarii de mai jos, vom fi bucuroși să vă ajutăm. Lucrarea completă funcționează în videoclip.
Verificați și celelalte tutoriale PWM pe alte microcontrolere:
- Tutorial Raspberry Pi PWM
- PWM cu Arduino Due
- Dimmer cu LED bazat pe Arduino folosind PWM
- Power LED Dimmer folosind microcontrolerul ATmega32