Demo PIC10F322 : PWM + ADC + Interrupt Timer0. Moduliamo l’intensita´ luminosa con un trimmer
Una scheda di sviluppo con un PICmicro della serie 10F… E chi l’avrebbe mai detto! Ma che PIC10F… Un dispositivo con soli 6 pin con caratteristiche da paura per una MCU così piccola:
- Oscillatore interno fino a 16MHz
- Modulo A/D ad 8 bit, con 3 canali e sensore di temperatura integrato
- PWM con risoluzione a 10bit
Senza contare le periferiche di ultima generazione: Configurable Logic Cell (CLC), Numerically Controlled Oscillator (NCO) e Complementary Waveform Generator (CWG). Sto parlando del PIC10F322. Penso che nella categoria delle MCU più piccole al mondo, questa sia un vero gioiello. Ho avuto modo di provare questo pic su una scheda di sviluppo della Microchip che pare non sia più in vendita: la PIC10(L)F322 Development Board, nome in codice AC103011-P.
Questa scheda veniva venduta a meno di 4 euro su mouser a questo link: difatti è li che l’ho acquistata circa un mese fa, ma purtroppo ora vedo che non è più in vendita, e non lo è nemmeno sul sito microchip direct (qui non lo è mai stata, pare fosse un prodotto esclusivo per mouser). Ad ogni modo, dato che ce l’ho, ho deciso di provarla un po’ e di postare qui un programma di esempio che vi può essere utile per capire come utilizzare su questo PIC il modulo PWM, il modulo ADC e l’interrupt sul Timero. Un esempio molto ricco e utile insomma, anche perchè sui pic10F molti registri hanno nomi differenti da quelli che siamo abituati ad utilizzare. E anche perchè fin’ora del PWM non ne abbiamo mai parlato.
Lo schema di questa scheda è il seguente:
Abbiamo due led dai colori molto brillanti (arancione e blu) collegati rispettivamente su RA1 e RA0, un pulsante collegato su RA3 (che ha normalmente la funzione di Master Clear, ma da word di configurazione può essere configurato come ingresso) e un trimmer su RA2/AN2. Nella parte inferiore della scheda è presente un’area di prototipazione che può anche essere rimossa spezzandola.
EDIT: Il PIC10F322 può essere programmato anche con il PICkit2. Aggiornate il device File (lo potete scaricare in questa pagina, estraete il file zip e sostituite il file in quello dell’installazione del programma standalone del PICkit2). Dopodichè dal programma standalone dovete selezionare Device Family -> Midrange -> 1.8V Min come illustrato nell’immagine seguente:
Nel mio programma di esempio utilizzo l’oscillatore interno, impostato a 16MHz. Il led D1 viene fatto lampeggiare tramite interrupt su Timer0. L’interrupt viene impostato per scattare ogni millisecondo circa (992µS), quindi un contatore viene decrementato e causa l’inversione dello stato di accensione del led. La pressione del pulsante SW1 abilita/disabilita questo lampeggio settando un flag che viene poi controllato nell’interrupt service routine. Fin qui nulla di spettacolare.
In realtà questa scheda viene fornita con un programma già caricato che più o meno fa la stessa cosa ma senza usare l’interrupt e senza far lampeggiare il led. Ma di questo programma, attualmente, non ci sono i sorgenti da nessuna parte. Quindi ho deciso di rifarlo da me aggiungendo delle altre caratteristiche per mettere tutte insieme un po’ di nozioni. Ad ogni modo ho scaricato l’hex originale dal pic ed è disponibile in basso al paragrafo downloads.
Viene quindi impostato il modulo AD per leggere il trimmer collegato su RA2/AN2. Il valore in uscita dal modulo AD viene utilizzato per caricare i registri del duty cycle del modulo PWM. Il modulo PWM ha una risoluzione di 10bit, io utilizzo soltanto gli 8 bit alti dato che sfrutto il valore in uscita dal modulo AD, che è a 8 bit, mentre lascio a zero i 2 bit bassi del duty cycle.
Non starò qui a parlare del PWM dato che in giro ci sono miliardi di tutorial sull’argomento. Se siete a digiuno vi consiglio quindi la guida che ritengo migliore su questo argomento: http://www.laurtec.it/tutorial/elettronica-digitale/86-pwm-pulse-width-modulation. Ad ogni modo in fondo all’articolo ho messo altri link che reputo interessanti e che vi invito ovviamente a leggere.
Il modulo PWM integrato sul PIC10F322 sfrutta il Timer2 come base dei tempi e possiede due uscite. Le due uscite sono vincolate ad avere lo stesso periodo (la stessa frequenza) ma possono avere duty cycle differenti. L’uscita del modulo PWM1 si trova sul pin RA0 e quella del modulo PWM2 sul pin RA1 (cfr. Datasheet, pag.4). I due moduli PWM avranno quindi i loro registri PWMxCON per i settaggi e PWMxDCH e PWMxDCL per l’impostazione del duty cycle. Io andrò ad utilizzare unicamente l’uscita PWM1 modulando quindi l’intensità luminosa del led blu D2, per cui utilizzerò soltanto i registri PWM1DCH, PWM1DCL e PWM1CON.
L’impostazione del modulo PWM viene illustrata a pagina 110 del datasheet e ho quindi seguito la stessa sequenza consigliata. In realtà la sequenza di operazioni esposta sul datasheet serve unicamente a fare in modo da avere il primo impulso con le impostazioni scelte, altrimenti molti passaggi possono essere saltati non curandosi del segnale in uscita in partenza. Come dicevo, il periodo viene impostato dal Timer2. La formula per calcolare il periodo è riportata a pagina 108 del datasheet:
Nota: Il Timer2 ha anche un post-scaler, ma questo non viene utilizzato per l’impostazione del periodo del PWM
Dicevo che ho impostato l’oscillatore interno (Fosc) a 16MHz, per cui Tosc vale 62.5nS (nano secondi!). Impostando il registro PR2 al valore 128 e il prescaler del timer2 a 1:1 , il periodo del PWM vale: (128+1) * 4 * 62.5nS * 1 = 32.25µS che corrispondono ad una frequenza di 31KHz.
Il duty cycle viene infine impostato nei registri PWM1DCH – che contiene gli 8 bit più significativi – e PWM1DCL – che contiene i 2 bit meno significativi (in posizione 7 e 6), possiamo quindi dire che il valore del duty cycle è giustificato a sinistra e questo può creare un po’ di confusione. Utilizzando per l’impostazione del duty cycle il valore in uscita dal modulo A/D a 8 bit, non imposto il registro PWM1DCL, che rimango a zero, e assegno a PWM1DCH direttamente il valore in uscita dal modulo AD.
Il risultato di tutto ciò è che girando il trimmer varia la luminosità del led dato che varia il duty cycle del segnale applicato. Tutto questo avviene mentre l’altro lampeggia su interrupt e viene controllato il pulsante.
Downloads
- Datasheet PIC10F322
- Scheda informativa della PIC10(L)F322 Development Board
- PIC10F322 demo (805 download)
- HEX originale PIC10F322 development board (606 download)
Links
- Pagina di (ex) acquisto su Mouser
- Pagina Microchip sul PIC10F322
- Tutorial PWM
- Duty Cycle su wikipedia
- PWM su wikipedia
- Tutorial su PWM, controllo motori ed esempio di utilizzo su PIC16F877 a cura di Giovanni Giannetti