GENERATORE PWM A FREQUENZA VARIABILE - 3

Implementazione FIRMWARE

A livello di firmware per prima cosa, definito il micro utilizzato e opportunamente configurato come sistema. bisognerà configurare i pins per assolvere il compito a loro associato agendo sui registri di configurazione della porta A e del modulo PWM.  Per la definizione del duty cycle si utilizza la parte MSB della conversione della tensione sul pin RA0 (I00 nel PICCINO) che e' direttamente caricata sul registro PWMxDCH <7:0> mettendo a zero i bit 7 e 6 del registro PWMxDCL: in questo modo si hanno 256 livelli per il duty cycle DC nel range 0-100%. Nel caso in cui il valore della conversione e' zero ( la tensione sul pin e' zero)  allora  la tensione di uscita PWM sarà' sempre zero mentre nel caso in cui il valore della conversione e' 255  la tensione sul pin di uscita PWM e' forzata al valore alto di tensione  qualunque sia il valore delle frequenza impostato. Le routine CHECK_0 e CHECK_FF assolvano questa funzione.

Per la definizione della frequenza, dovendo garantire la risoluzione del duty cycle e la precisione con cui viene genenrato ( numero di bit) , si utilizza un sistema che  fa uso di una lookup table o tabella di corrispondenza. I valori selezionabili tramite il potenziometro sono riportati nella seguente tabella ( valori in Hz). Questi valori possono essere cambiati da firmware compatibilmente ai settaggio del del modulo PWM circa il numero di bit di con cui si vuole definire il duty cycle del segnale PWM. Si rimanda alla pagina 1 per

IND
FREQ
IND
FREQ
IND
FREQ
IND
FREQ
1
1
7
1000
13
15000
19
1500
2
5
8
1500
14
20000
20
1600
3
10
9
2000
15
25000
21
1700
4
50
10
2500
16
50000
22
1800
5
100
11
5000
17
1300
23
1900
6
500
12
10000
18
1400
24
2000

TAB 1: valori frequenza selezionabili in Hz

* se la frequenza e’ impostata a 0 Hz l’uscita e’ fissata a 0V qualunque sia il valore del duty cycle.

La selezione avviene tramite un indice IND che e' ricavato dalla conversione della tensione sul pin RA2 ( IO2 nel PICCINO) e diviso per 8 in modo da avere 32 livelli possibili. In realtà i valori possibili di frequenza, come indicato nella tabella presente nella pagina precedente, sono 24. Quindi il valore di IND e' limitato dalla costante NUM_FREQ che vale 23. La routine CHECK_NUM assolve questo compito. Ottenuto l'indice IND vengono ricavati i valori dalla mappe FREQ_MAP e FREQ_CONF alla posizione IND. Queste mappe sono calcolate in modo da avere per ogni frequenza selezionata il valore corrispondente del registro PR2, T2CON e OOSCON. In  particolare, dalla mappa FREQ_GEN si ricava il valore del registro PR2 mentre dalla mappa FREQ_CONF si ricavano i valori del registro T2CON prendendo il nibble superiore del byte letto alla posizione IND mentre il nibble inferiore e' il valore del registro OSCON con cui si definisce la frequenza dell'oscillatore interno del micro. Questa funzione e' assolta dalla routine SEL_FREQ.  Definito il valore della frequenza viene aggiornato il valore del DUTY CYCLE  tramite la routine GEN_PWM. Di seguito il codice ASM del generatore PWM scaricabile dal seguente link: PWMGEN.zip in cui sono presenti tutti i files (ASM, Hex ) e quelli relativi allo IDE MPLAB oltre al foglio di calcolo che permette calcolare tabella di corrispondenze delle frequenze nel caso si volessero cambiare rispetto a  quelle fornite nel progetto.