- Cos'è un segnale PWM?
- PWM utilizzando PIC16F877A:
- Programmazione del PIC per generare segnali PWM:
- Schemi e test:
- Lavorare sull'hardware:
Questo è il nostro decimo tutorial sull'apprendimento dei microcontrollori PIC utilizzando MPLAB e XC8. Fino ad ora, abbiamo coperto molti tutorial di base come LED lampeggiante con PIC, Timer in PIC, interfaccia LCD, interfacciamento a 7 segmenti, ADC utilizzando PIC ecc. Se sei un principiante assoluto, visita l'elenco completo dei tutorial PIC qui e inizia a imparare.
In questo tutorial, impareremo come generare segnali PWM utilizzando PIC PIC16F877A. Il nostro MCU PIC ha un modulo speciale chiamato Compare Capture module (CCP) che può essere utilizzato per generare segnali PWM. Qui, genereremo un PWM di 5 kHz con un duty cycle variabile dallo 0% al 100%. Per variare il ciclo di lavoro utilizziamo un potenziometro, quindi si consiglia di imparare il tutorial ADC prima di iniziare con PWM. Il modulo PWM utilizza anche i timer per impostare la sua frequenza, quindi impara come utilizzare i timer in anticipo qui. Inoltre, in questo tutorial useremo un circuito RC e un LED per convertire i valori PWM in tensione analogica e lo useremo per oscurare la luce LED.
Cos'è un segnale PWM?
Pulse Width Modulation (PWM) è un segnale digitale più comunemente utilizzato nei circuiti di controllo. Questo segnale è impostato alto (5v) e basso (0v) in un tempo e una velocità predefiniti. Il tempo durante il quale il segnale rimane alto è chiamato "tempo di accensione" e il tempo durante il quale il segnale rimane basso è chiamato "tempo di spegnimento". Esistono due parametri importanti per un PWM come discusso di seguito:
Ciclo di lavoro del PWM:
La percentuale di tempo in cui il segnale PWM rimane ALTO (tempo di attivazione) viene chiamata duty cycle. Se il segnale è sempre ON è nel duty cycle del 100% e se è sempre spento è nel duty cycle dello 0%.
Ciclo di lavoro = Tempo di accensione / (Tempo di accensione + Tempo di spegnimento)
Frequenza di un PWM:
La frequenza di un segnale PWM determina la velocità con cui un PWM completa un periodo. Un periodo è completo ON e OFF di un segnale PWM come mostrato nella figura sopra. Nel nostro tutorial imposteremo una frequenza di 5KHz.
PWM utilizzando PIC16F877A:
I segnali PWM possono essere generati nel nostro microcontrollore PIC utilizzando il modulo CCP (Compare Capture PWM). La risoluzione del nostro segnale PWM è di 10 bit, cioè per un valore 0 ci sarà un duty cycle dello 0% e per un valore 1024 (2 ^ 10) ci sarà un duty cycle del 100%. Ci sono due moduli CCP nel nostro PIC MCU (CCP1 e CCP2), questo significa che possiamo generare due segnali PWM su due pin diversi (pin 17 e 16) contemporaneamente, nel nostro tutorial stiamo usando CCP1 per generare segnali PWM sul pin 17.
I seguenti registri vengono utilizzati per generare segnali PWM utilizzando il nostro MCU PIC:
- CCP1CON (registro di controllo CCP1)
- T2CON (registro di controllo del timer 2)
- PR2 (Timer 2 moduli Period Register)
- CCPR1L (CCP registro 1 basso)
Programmazione del PIC per generare segnali PWM:
Nel nostro programma leggeremo una tensione analogica di 0-5v da un potenziometro e la mapperemo a 0-1024 usando il nostro modulo ADC. Quindi generiamo un segnale PWM con frequenza 5000Hz e ne modifichiamo il duty cycle in base alla tensione analogica in ingresso. Questo è 0-1024 verrà convertito in ciclo di lavoro 0% -100%. Questo tutorial presume che tu abbia già imparato a usare ADC in PIC, altrimenti leggilo da qui, perché tralasceremo i dettagli in questo tutorial.
Quindi, una volta impostati i bit di configurazione e scritto il programma per leggere un valore analogico, possiamo procedere con PWM.
Quando si configura il modulo CCP per il funzionamento PWM, è necessario eseguire i seguenti passaggi:
- Impostare il periodo PWM scrivendo nel registro PR2.
- Impostare il ciclo di lavoro PWM scrivendo nel registro CCPR1L e nei bit CCP1CON <5: 4>.
- Rendere il pin CCP1 un'uscita cancellando il bit TRISC <2>.
- Impostare il valore di prescala TMR2 e abilitare Timer2 scrivendo su T2CON.
- Configurare il modulo CCP1 per il funzionamento PWM.
Ci sono due importanti funzioni in questo programma per generare segnali PWM. Una è la funzione PWM_Initialize () che inizializzerà i registri necessari per impostare il modulo PWM e quindi imposterà la frequenza alla quale il PWM dovrebbe funzionare, l'altra funzione è la funzione PWM_Duty () che imposterà il duty cycle del segnale PWM in i registri richiesti.
PWM_Initialize () {PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1; // Impostazione delle formule PR2 utilizzando Datasheet // Fa funzionare il PWM in 5KHZ CCP1M3 = 1; CCP1M2 = 1; // Configura il modulo CCP1 T2CKPS0 = 1; T2CKPS1 = 0; TMR2ON = 1; // Configura il modulo Timer TRISC2 = 0; // crea il pin della porta su C come output}
La funzione sopra è la funzione di inizializzazione PWM, in questa funzione Il modulo CCP1 è impostato per usare PWM rendendo i bit CCP1M3 e CCP1M2 più alti.
Il prescaler del modulo timer viene impostato portando il bit T2CKPS0 più alto e T2CKPS1 più basso, il bit TMR2ON è impostato per avviare il timer.
Ora dobbiamo impostare la frequenza del segnale PWM. Il valore della frequenza deve essere scritto nel registro PR2. La frequenza desiderata può essere impostata utilizzando le seguenti formule
Periodo PWM = * 4 * TOSC * (TMR2 Prescale Value)
Riorganizzare queste formule per ottenere PR2 darà
PR2 = (Periodo / (4 * Tosc * TMR2 Prescale)) - 1
Sappiamo che Period = (1 / PWM_freq) e Tosc = (1 / _XTAL_FREQ). Perciò…..
PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1;
Una volta impostata la frequenza, non è necessario richiamare questa funzione a meno che e fino a quando non sia necessario modificare nuovamente la frequenza. Nel nostro tutorial ho assegnato PWM_freq = 5000; in modo che possiamo ottenere una frequenza operativa di 5 KHz per il nostro segnale PWM.
Ora impostiamo il ciclo di lavoro del PWM utilizzando la funzione seguente
PWM_Duty (unsigned int duty) {if (duty <1023) {duty = ((float) duty / 1023) * (_ XTAL_FREQ / (PWM_freq * TMR2PRESCALE)); // In riduzione // duty = (((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE); CCP1X = dovere & 1; // Memorizza il primo bit CCP1Y = duty & 2; // Memorizza lo 0 ° bit CCPR1L = duty >> 2; // Memorizza il remining 8 bit}}
Il nostro segnale PWM ha una risoluzione di 10 bit, quindi questo valore non può essere memorizzato in un singolo registro poiché il nostro PIC ha solo linee dati a 8 bit. Quindi dobbiamo usare altri due bit di CCP1CON <5: 4> (CCP1X e CCP1Y) per memorizzare gli ultimi due LSB e quindi memorizzare i restanti 8 bit nel registro CCPR1L.
Il tempo del ciclo di lavoro PWM può essere calcolato utilizzando le seguenti formule:
Ciclo di lavoro PWM = (CCPRIL: CCP1CON <5: 4>) * Tosc * (TMR2 Prescale Value)
Riorganizzare queste formule per ottenere il valore di CCPR1L e CCP1CON darà:
CCPRIL: CCP1Con <5: 4> = PWM Duty Cycle / (Tosc * TMR2 Prescale Value)
Il valore del nostro ADC sarà 0-1024, abbiamo bisogno che sia compreso tra 0% e 100%, quindi PWM Duty Cycle = duty / 1023. Inoltre per convertire questo ciclo di lavoro in un periodo di tempo dobbiamo moltiplicarlo per il periodo (1 / PWM_freq)
Sappiamo anche che Tosc = (1 / PWM_freq), quindi..
Duty = (((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE);
Risolvere l'equazione di cui sopra ci darà:
Duty = ((float) duty / 1023) * (_XTAL_FREQ / (PWM_freq * TMR2PRESCALE));
Puoi controllare il programma completo nella sezione Codice sotto insieme al video dettagliato.
Schemi e test:
Come al solito, verifichiamo l'output utilizzando la simulazione Proteus. Lo schema del circuito è mostrato di seguito.
Collegare un potenziometro al 7 ° pin per alimentare una tensione di 0-5. Il modulo CCP1 è con pin 17 (RC2), qui verrà generato il PWM che può essere verificato utilizzando l'oscilloscopio digitale. Oltre a convertire questo in una tensione variabile, abbiamo utilizzato un filtro RC e un LED per verificare l'uscita senza oscilloscopio.
Cos'è un filtro RC?
Un filtro RC o un filtro passa basso è un semplice circuito con due elementi passivi, vale a dire il resistore e il condensatore. Questi due componenti vengono utilizzati per filtrare la frequenza del nostro segnale PWM e renderlo una tensione CC variabile.
Se esaminiamo il circuito, quando viene applicata una tensione variabile all'ingresso di R, il condensatore C inizierà a caricarsi. Ora, in base al valore del condensatore, il condensatore impiegherà un po 'di tempo per caricarsi completamente, una volta caricato bloccherà la corrente CC (ricorda che i condensatori bloccano CC ma consentono CA) quindi la tensione CC in ingresso apparirà attraverso l'uscita. Il PWM ad alta frequenza (segnale AC) verrà messo a terra tramite il condensatore. In questo modo si ottiene una corrente continua pura attraverso il condensatore. Un valore di 1000Ohm e 1uf è risultato appropriato per questo progetto. Il calcolo dei valori di R e C implica l'analisi del circuito utilizzando la funzione di trasferimento, che non rientra nell'ambito di questo tutorial.
L'output del programma può essere verificato utilizzando l'oscilloscopio digitale come mostrato di seguito, variare il potenziometro e il ciclo di lavoro del PWM dovrebbe cambiare. Possiamo anche notare la tensione di uscita del circuito RC utilizzando il voltmetro. Se tutto funziona come previsto possiamo procedere con il nostro hardware. Controlla ulteriormente il video alla fine per l'intero processo.
Lavorare sull'hardware:
La configurazione hardware del progetto è molto semplice, riutilizzeremo la nostra scheda PIC Perf mostrata di seguito.
Avremo anche bisogno di un potenziometro per alimentare la tensione analogica, ho collegato alcuni fili terminali femminili al mio pot (mostrato sotto) in modo da poterli collegare direttamente alla scheda PIC Perf.
Infine per verificare l'uscita abbiamo bisogno di un circuito RC e un LED per vedere come funziona il segnale PWM, ho semplicemente usato una piccola scheda perf e saldato il circuito RC e il LED (per controllare la luminosità) su di esso come mostrato di seguito
Possiamo usare semplici cavi di collegamento femmina a femmina e collegarli secondo gli schemi mostrati sopra. Una volta effettuata la connessione, carica il programma sul PIC usando il nostro pickit3 e dovresti essere in grado di ottenere una tensione variabile in base all'ingresso del tuo potenziometro. L'uscita variabile viene utilizzata per controllare la luminosità del LED qui.
Ho usato il mio multimetro per misurare le uscite variabili, possiamo anche notare che la luminosità del LED viene modificata per diversi livelli di tensione.
Ecco che abbiamo programmato per leggere la tensione analogica dal POT e convertirla in segnali PWM che a loro volta sono stati convertiti in tensione variabile utilizzando il filtro RC e il risultato viene verificato utilizzando il nostro hardware. Se hai qualche dubbio o rimani bloccato da qualche parte, usa la sezione commenti qui sotto, saremo felici di aiutarti. Il lavoro completo sta funzionando nel video.
Controlla anche i nostri altri tutorial PWM su altri microcontrollori:
- Tutorial PWM Raspberry Pi
- PWM con Arduino Due
- Dimmer LED basato su Arduino con PWM
- Dimmer LED di potenza con microcontrollore ATmega32