PWM

simulatorhck:
Grazie per la risposta.
Che per qualche istante il pwm si blocchi non è un problema..le frequenze fisse degli apparecchi commerciali atti a tale uso sono in genere con un frequenza fissa a 100Hz e poi con un potenziometro si va in genere mi pare dai 400HZ fino ai 3KHZ. naturalmente la precisione millesimale non è richiesta come anche il range puo essere maggiore se l'hardware lo consente :).

Se il range di frequenze è questo, puoi usare il timer 1 (a 16 bit) in modalità Phase Correct PWM con top fissato da OCR1A.
Con questa modalità la frequenza è data da:
Fpwm = Fclk/(Prescalertop2*2)
Prescaler vale 8, Fclk sugli Arduino vale 16 MHz, per cui:
con OCR1A come top a 5000 ottieni 100 Hz
ocn OCR1A a 167 ottieni 2994 Hz.

In questo modo vari solo OCR1A con il potenziometro. Per variare il duty cycle devi variare il registro OCR1B.
Il duty cycle è dato da (OCR1B/OCR1A)*100
Quindi se mettiamo hai OCR1A a 5000 e OCR1B a 1000, hai un duty cycle del 20%