Nella Settima Parte si Parlerà del PWM e di Come Generare un Segnale con Duty Cicle Variabile, Sarà Inoltre Presentato un Esempio…
INTRO
Il PIC dispone di un modulo PWM in grado di generare forme d’onda quadrate con Duty Cicle variabile utili per pilotare LED, motori, step up, step down o semplicemente come generatore di forme d’onda. La forma d’onda è la seguente:
Come viene generata questa forma d’onda? Si sfrutta la comparazione con il Timer Counter ovvero il Timer Counter viene settato e conta, ad ogni inizio conteggio vi è un fronte di salita e si ha un inizio conteggio ogni qual volta il Timer Counter si resetta ovvero quando il Timer Counter eguaglia il valore contenuto nel registro PR2. Il fronte di discesa si ha quando il Timer Counter è uguale al registro che contiene il valore di comparazione per il duty cicle. La struttura è la seguente:
Vi sono due registri, PR2 per settare la frequenza e i registri CCPR1L e CCPR1H per la selezione del duty cicle. L’uscita del segnale PWM si trova su RC2 ovvero il PIN 17.
CONFIGURAZIONE
Per configurare il PWM bisogna effettuare le seguenti operazioni:
- Inserire il valore desiderato nel registro PR2 per settare la frequenza. La frequenza si ottiene dalla seguente formula:
Con quest’ultima formula posso conoscere il valore da inserire nel registro PR2.
- Settare il valore del registro CCPR1L e dei due bit contenuti nel registro CCP1CON che si trovano in posizione 5:4, in modo tale da settare il Duty Cicle. Il PIC18F252 ha un PWM con risoluzione di 10 bit, ovvero si possono avere 1023 possibili Duty Cicle, questo numero decresce all’aumentare della frequenza del PWM, in particolare la risoluzione è:
Quindi ad esempio se si ha una frequenza di funzionamento di 8MHz e una frequenza del PWM di 2KHz si ha una risoluzione di 11,96Bit quindi ho la risoluzione massima della struttura, ovvero 10Bit, se invece ho una frequenza del segnale PWM di 20KHz si avrà una risoluzione di 8,64Bit quindi posso variare solo 8 LSB a disposizione dei 10Bit. Inoltre la risoluzione è legata al valore contenuto nel registro PR2.
Il Duty Cicle può essere variato in opera variando il valore dei registri, solo che la modifica del Duty Cicle avverrà quando si ha la comparazione tra il Timer Counter 2 e il registro PR2.
- Settare il pin d’uscita ovvero TRISC.F2
- Settare i valori di prescaler del Timer Counter 2 e accenderlo tramite il registro T2CON. Questo registro è così organizzato:
I Bit 6:3 servono a settare il Postscaler, che in questa applicazione non viene usato. Il Bit TMR2ON serve per attivare il Timer Counter 2 mentre gli ultimi due bit, T2CKPS1 e T2CKPS1 servono a settare il Prescaler (00 =>Prescaler 1, 01 =>Prescaler 4, 10 e 11 =>Prescaler 16).
- Infine si setta il modulo CCP per farlo lavorare come PWM. Questo si fa settando opportunamente il registro CCP1CON, in particolare si fa settando gli ultimi 4Bit ad 1.
ESEMPIO
Ecco di seguito il codice per avere in uscita un segnale PWM con frequenza di 2KHz e Duty Cicle del 25%.
Iniziamo dalla formule, considerando il fatto di avere una frequenza di funzionamento di 8MHz e usare un prescaler del TMR2 di 4:
Il codice sarà quindi:
void main() {
PR2 = 0b11111001; //valore 250 nel registro PR2
CCPR1L = 0b01000000; //Valore di comparazione setting DC
CCP1CON = 0b00000000; //25% del valore max
TRISC.F2 = 0; //Pin 17 uscita
T2CON = 0b00000101; //TMR2 on, prescaler 4
CCP1CON = 0b00001111; //pwm on
while(1){ //ciclo infinito
}
}
Quindi prima di tutto setto il valore della frequenza, poi setto il valore del Duty Cicle e configuro il pin 17 come uscita. Attivo e setto il Timer Counter 2 e attivo il PWM. Infine chiudo il programma in un ciclo infinito. Il risultato sarà:
Potete scaricare il codice e la simulazione dal seguente LINK!!!
Perchè ci siamo fermati? Il sito è ben sviluppato: interessante, ordinato, contiene validi schemi e tutor per chi è appassionato di elettronica, digitale e non.
Un invito a continuare e grazie fin qui per il lavoro eseguito e condiviso in rete.
Cordialità.
Dario
La sessione d’esami finalmente è finita. A breve ricomincio. Grazie mille per l’incoraggiamento 🙂
sto cercando di imparare a programmare le sezioni degli articoli sono ben fatti complimenti ,per le spiegazioni
un incoraggiamento per continuare ,le sessioni per imparare ,sempre più grazie ancora