Questo sito utilizza cookie, anche di terze parti, per migliorare la tua esperienza e offrire servizi in linea con le tue preferenze. Chiudendo questo banner, scorrendo questa pagina o cliccando qualunque suo elemento acconsenti all’uso dei cookie. Se vuoi saperne di più o negare il consenso a tutti o ad alcuni cookie vai alla sezioneCookie Policy

Pic 12F683 e PWM

Ultimo aggiornamento: 31/07/2015

pic 12f683Il Pic 12F683 è un picmicro molto interessante, utile ed economico con soli 8 pins. Puo' essere considerato, infatti, la naturale evoluzione del 'vecchio' popolarissimo 12F675 del quale, pur mantenendo tutte le peculiarità che lo contraddistinguono, è stato decisamente migliorato: velocità (sino a 20Mhz con quarzo esterno) 8Mhz con oscillatore, 2Kword di memoria, 4 moduli adc, 1 pwm ecc.

12F683

 

con Mikrobasic:

 


dim adc as word
main:
CMCON0 = 7                      'comparatori off
ANSEL = %00101000         'AN3 enabled
TRISIO.3 = 1                       'set input
TRISIO.2 = 0
PWM1_Init (10000)             'frequenza a 10Khtz
PWM1_Set_duty (127)       '50% duty cicle
PWM1_Start()

start:
   while(1)
     adc = Adc_Read(3)    'valore: 0-1023
     PWM1_Set_duty (adc/4)      'dividiamo per 4: 0-254
   wend
end.

12f683 pwm

Il programma è elementare.

  • Dovremo:
  • settare i comparato del picmicro
  • settare ed avviare il pwm
  • settare il duty cicle in base al valore analogico letto (schema). 

Il valore analogico in ingresso riporterà un valore numerico 0-1023  (risoluzione 10 bit). Inseriremo tale valore per settare il duty cicle del pwm (0-255).

Tutto qua.

 

Cambiare la frequenza di lavoro: una volta avviato il pwm (senza doverlo stoppare, e riavviare) non risulta possibile. Una soluzione a questo potrà essere cercata nel non utilizzare il pwm integrato del picmicro ma semplicemente simularlo per mezzo della funzione delay:


dim adc as word
main:
CMCON0 = 7                   'comparatori off
ANSEL = %00001000       'AN3 enabled
TRISIO.3 = 1                   'set input 
TRISIO.2 = 0                   'set output

start:
      while(1)
        gpio.2 = 0
        delay_us (4)                   (ritardo minimo per poter essere riconosciuto da un driver per motori stepper, solo a titolo di esempio)
        gpio.2 = 1
        for t=1 to adc next t         (ritardo proporzionale al valore risportato dalla funzione adc_read)
wend

end.

 

 

Tale soluzione genererà un pwm 'simulato', variabile in frequenza, sul piedino GP2. Mentre utilizzando il mikroc avremo lo stesso risultato:

 

 

void main() {
   unsigned int temp;
   GPIO = 0;
   cmcon0 = 7 ;                        //disable comparators
   cmcon1 = 0;
   osccon = 0b01110001;          //set int osc to 8MHz
   ansel = 0b00001000;             //An3 enabled
   TRISIO = 0b00001000;
    do {
        temp = ADC_Read(ANS3);  //read
        GPIO.F2 = 1;
        delay_cyc (temp);               //proportional delay
        GPIO.F2 = 0;
    } while(1);
}

Diritti riservati Cuteminds.com 2008-2015. Tutti i marchi riportati sono detenuti dai legittimi proprietari. Tutto il materiale e` liberamente utilizzabile ma non per scopi commerciali. Non si assume alcuna responsabilita` sul materiale pubblicato per eventuali danni diretti o indiretti che possano derivare dall`utilizzo di schemi, progetti o altro materiale presente nel sito. Inviare una mail a: remove-admin@cuteminds.com (contenuti) remove-webmaster@cuteminds.com (webserver) per domande e/o suggerimenti.