Quote:Comunque in ogni caso quando avrete tempo una spiegazione piu dettagliata per i non adddetti mi sarabbe molto utile prima di proseguire
Probabilmente i tuoi dubbi sono legati alla non conoscenza degli interrupt.
A tal proposito ti consiglio di leggere la breve guida in italiano di Mauro Alfieri, riportata a questo link:
http://www.mauroalfieri.it/elettronica/tutorial-arduino-interrupt.htmlSe hai letto la guida dovresti incominciare a capire la direzione che dobbiamo prendere, ma proviamo a spiegare (elettro correggimi se sbaglio, anche per me sono argomenti inesplorati !).
Sappiamo che all'interno dell'atmega ci sono 3 timer, ovvero 3 circuiti indipendenti dal codice che contano da 0 a xxx per poi ripartire, con una frequenza di 16 MHz.
Dovremmo anche essere in grado di resettare tali timer, ovvero farli ripartire da zero a nostro piacimento.
Sappiamo anche che per rallentare il conteggio possiamo utilizzare i prescaler, ovvero una calcolatrice che in tempo reale divide il valore del timer per 2 o un suo multiplo.
A questo punto, dopo aver fatto i dovuti conteggi e impostato i giusti parametri, possiamo impostare un interrupt per essere richiamato tutte le volte che il Timer x arriva al numero y
Ma che vuol dire tutto ciò ?
Che il timer inizia a contare (essendo un contatore hardware il cui clock è determinato da un quarzo è molto preciso) e ipotizziamo che quando arriva a 500 siano passati esattamente 100 microsecondi.
A questo punto agganciamo una funzione interrupt al valore 500 del timer.
Mentre il codice contenuto nella funzione loop viene eseguito, il contatore del timer, indipendentemente è contemporaneamente al codice, conta e appena arriva al valore 500 interrompe il codice della funzione loop e lancia la funzione dell'interrupt.
Nel nostro caso, in tale funzione, ci saranno inserite le istruzioni per leggere il nuovo valore del vettore ed impostarlo sul pin PWM.
Finita la funzione dell'interrupt il codice riprende da dove era stato interrotto e il timer continua il suo conteggio (conviene resettarlo dentro la funzione dell'interrupt ?)
Allora come possiamo fare per variare la frequenza di qualche decimo di Hz ?
Semplice, modifichiamo il valore 500 con 499, 498 o 501, 502 etc.
Tutto chiaro ?
Elettro tutto giusto ?