Creative Commons BY-NC-ND 2.5Questo sito e tutto il suo contenuto sono distribuiti sotto la licenza Creative Commons Attribuzione - Non Commerciale - Non opere derivate 2.5 Italia e con le condizioni d'uso definite nel disclaimer: siete pregati di leggere entrambi questi documenti prima di usufruire dei contenuti di questo sito. Per alcuni contenuti è necessaria una registrazione gratuita: non è necessario pagare e non è necessario accumulare punteggi per accedere agli articoli e scaricare i sorgenti: basta solo essere onesti. Se volete che questo sito continui a rimanere attivo, a contribuire ogni giorno alla diffusione della cultura libera, non copiate il materiale per ripubblicarlo in altri luoghi. Se volete partecipare su settorezero e rendere le vostre idee, i vostri progetti, fruibili da tutti senza limitazioni potete farlo tranquillamente.

Demo PIC10F322 : PWM + ADC + Interrupt Timer0. Moduliamo l’intensità luminosa con un trimmer

Autore: Giovanni Bernardo | Data pubblicazione: 5 marzo 2012
Categorie: PICmicro 10/12/16

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.

E' proprio il caso di dire che questa scheda è un soldo di cacio

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

Links

L'articolo ti è piaciuto o ti è stato utile per risolvere un problema? SettoreZero è realizzato soltanto con contenuti originali: tutti gli articoli sono curati con passione dagli autori e nulla viene copiato da altri siti. Supporta e mantieni in vita SettoreZero con una donazione: basta soltanto un caffè o una birra. Puoi supportare SettoreZero anche con uno dei progetti elencati nella sezione servizi o partecipare anche tu con un tuo articolo/progetto personale.

Se desiderate che SettoreZero continui a rimanere gratuito e fruibile da tutti, non copiate il nostro materiale e segnalateci se qualcuno lo fa.

Puoi andare alla fine dell'articolo e lasciare un commento. I trackback e i ping non sono attualmente consentiti.

  1. #1 da marco2551 il 6 marzo 2012

    Non sapevo dell’esistenza di questi pic. Questo è un invito ad imparare a saldare componenti smd. Come sempre ottimo lavoro, grazie

  2. #2 da volcane il 6 marzo 2012

    Ciao!

    Ho provato a vedere se il PICkit 2 supporta il Pic10F322, in Mplab versione 8.84 se si sceglie select device, esce il pallino rosso su PICkit2

  3. #3 da tester2 il 6 marzo 2012

    Ciao, il PIC in questione, esiste anche in versione PDIP, si chiama: 10F322-I/P

    • #4 da Giovanni Bernardo il 6 marzo 2012

      Si hai ragione. La cosa che però non mi piace è che l’hanno fatto a 8 pin, con due non connessi… Dato che i package a 6 pin dip esistono… potevano farlo così. O forse avevano paura che fosse scambiato per un fotoaccoppiatore?

  4. #5 da marco2551 il 6 marzo 2012

    Anche su mplabX due pallini rossi. Qua dice che è supportato ma solo usando “PICkit 2 Programmer Application” (La prima riga in grossetto) http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en027813. Ma purtroppo è riservato ad utenti windows…

  5. #7 da diodo il 9 marzo 2012

    Se c’è ancora, provate ad andare alla pagina dedicata al pickit2:

    http://www.microchip.com/pickit2

    dove potrete scaricare l’aggiornamento del PK2DeviceFile.dat (attualmente alla versione 1.62.14)

    http://ww1.microchip.com/downloads/en/DeviceDoc/PK2DFUpdate-1-62-14.zip

    che supporta molti pic più recenti, compresi i 10F322.
    Vedere lista:

    http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en027813

    Basta copiare il file scompattato, sopra alla versione precedente, nella cartella dove è installato il pickit2.
    Ciao a tutti

  6. #9 da diodo il 17 marzo 2012

    Giovanni Bernardo :
    L’applicazione del pickit2 non me lo riconosce.

    Ciao Giovanni e grazie per gli articoli che condividi.

    Hai provato con l’aggiornamento del devicefile?
    Prima di ordinare qualche 10F322, sarei grato se qualcuno potesse confermare
    che il pickit2 li riconosce, con questo aggiornamento.
    Grazie e ciao a tutti

  7. #14 da tester2 il 17 marzo 2012

    Scusa l’OT, sai se il Pickit2 clone (con ultimo file .dat aggiornato), supporta anche 12F1822-I/P ?
    Ciao.

    • #15 da tester2 il 17 marzo 2012

      Sì confermo, anche il 12F1822-I/P è elencato nela lista, seguendo la stesso procedura del 10F322. :-)
      Ciao.

  8. #16 da marco89lisa il 29 marzo 2012

    Salve, bel lavoro sempre ben fatto; l’ unica pecca credo sia la mancanza del file sorgente; per quanto mi riguarda sarebbe l’ ideale legge la parte “teorica” e ricercare passo passo le righe di programmazione ( un po come nelle lezione sul pic micro), crede sia possibile postare il sorgente??

  9. #17 da marco89lisa il 29 marzo 2012

    Pardon non ho notato il link pic10…demo (27) chiedo scusa

  10. #18 da tester2 il 7 agosto 2012

    Per chi è interessato a questa scheda, è in vendita su: http://www.voti.nl/shop/catalog.html?DEV-AC103011
    Ciao.

  11. #19 da brufab il 25 settembre 2012

    Salve a tutti,
    vorrei una info se io volessi avere un tempo di dutycycle pari a minuti come posso fare. Mi spiego meglio io vorrei realizzare una luce che dato il tempo di un minuto posso in questo intervallo gestire i tempi di on e i tempi di off leggendo appunto la porta analogica e modificado in percentuale i valori di duty.
    Non sò se sono riuscito a spiegarmi bene. Devo agire sicuramente sui tempi dei timer…ma vorrei avere info su quale calcolo effettuare.
    Grazie a tutti

    • #20 da Giovanni Bernardo il 10 ottobre 2012

      Variazione del duty cicle con un trimmer -> esempio qui http://www.settorezero.com/wordpress/demo-pic10f322-pwm-adc-interrupt-pic10f322-development-board/ bastava utilizzare la funzione di ricerca. Duty Cycle in minuti? Non capisco.
      “vorrei realizzare una luce che dato il tempo di un minuto posso in questo intervallo gestire i tempi di on e i tempi di off ” non arrivo a capire il significato e nemmeno quello che vorresti fare. Vuoi tenere una lampadina accesa per 10 minuti, spenta per altri 10 minuti e cosi via? Se è cosi: non è certo il pwm che ti interessa, ne tantomeno ha senso parlare di duty cycle. Vuoi semplicemente un’accensione ciclica. Imposti un timer con un contatore in maniera che arrivi ai minuti desiderati. Puoi anche usare il timer2 come un orologio. Esempi ce ne sono a palate, basta cercare.

Devi essere collegato per lasciare un commento.

  1. Ancora nessun trackback
settorezero.com e il logo Zroid™ ©2007÷2015 Giovanni Bernardo - E' vietata la copia e la distribuzione anche parziale dei contenuti di questo sito web senza l'esplicito consenso dell'autore.
I contenuti di settorezero.com sono distribuiti sotto una licenza Creative Commons Attribuzione-Non Commerciale-Non Opere derivate 2.5 Italia a cui vanno aggiunte le condizioni d'uso definite nel disclaimer.
settorezero.com e tutti i suoi contenuti sono tutelati dalla legge sul diritto d'autore per cui i trasgressori sono perseguibili a norma di legge. Settorezero fa uso dei cookie leggi l'informativa estesa.
Creative Commons BY-NC-ND 2.5
Il tema di questo sito è basato sul tema Fusion per wordpress, realizzato originariamente da digitalnature e fa uso del plugin Wassup per il computo delle statistiche. Per contattare l'autore siete pregati di utilizzare la sezione contatti.
Per essere aggiornato con tutte le novità di settorezero.com seguici anche anche su Facebook Twitter Tumblr Blogspot Youtube.