Soluzione: se non esistono librerie già scritte è necessario scrivere a manina una o più funzioni per generazione del PWM. Questo può essere fatto tramite software puro, con una tecnica mista (timer+gestione software) o utilizzando uno o più timer con comparatore.
Fare riferimento al datasheet specifico del microcontrollore per l' uso dei timer.
Cliccare QUI per il datasheet dell' ATmega328.A Pagina 95 del datasheet c'è la struttura interna del Timer0 che può generare il PWM. Nelle pagine successive è descritto il funzionamento e come utilizzarlo.
A Pagina 114 la struttura interna del Timer1 che può generare il PWM. Nelle pagine successive è descritto il funzionamento e come utilizzarlo.
A Pagina 144 la struttura interna del Timer2 che può generare il PWM. Nelle pagine successive è descritto il funzionamento e come utilizzarlo.
Il linea generale, e questo vale praticamente per tutti i microcontrollori, si utilizzano i timer forniti di registri di comparazione. Uno di questi registri viene utilizzato per resettare il contatore interno, in pratica per definire la frequenza del PWM, un altro registro viene utilizzato per far commutare un' uscita (se il timer ha un' uscita hardware) o per generare un interrupt all' interno della quale si fa commutare il pin desiderato. Questo secondo compratore determina il duty cycle del PWM.
L' approccio misto prevede l' utilizzo di un timer che funge da base tempi mentre la gestione vera e propria del PWM viene fatta tramite software. Di solito questo tipo di gestione viene inglobato nella funzione di servizio dell' interrupt del timer utilizzato come base tempi.
Questo articolo è un esempio di questo tipo di implementazione.
La soluzione puramente software non è molto elegante ma funziona lo stesso. In pratica si costringe il micro a fare solo da gestore del PWM utilizzando il ciclo principale infinito di funzionamento. Avevo scritto un post a riguardo ma non riesco più a trovarlo. Se lo trovo modificherò questo messaggio.
Edit: trovato l' articolo.
viewtopic.php?f=17&t=20129&hilit=PWM+veloce+e+senza+timerIl firmware è scritto per un PIC ma funziona benissimo su qualsiasi micro. Le uniche cose che variano sono l' accensione/spegnimento/inizializzazione dei pin di uscita (che variano, appunto, da micro a micro).
Edit 2:In
questo articolo c'è un esempio di implementazione di interrupt ciclica proprio su un micro della Atmel. Può essere utile per un primo approccio con i timers del ATmega328.
Anche in
questo articolo viene implementata una base tempi.
Edit 3:Un' ultima cosa ma non meno importante: non hai specificato la frequenza massima del segnale analogico (non del PWM eh!). Più il segnale è lento meno difficile è l' implementazione.
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.