tone() che "gracchia"

Buonasera forum,
Ho un problemino con arduino e audio. Utilizzo un Atmega8 con clock interno a 8Mhz e con la funzione tone() tutto ok nel generare suoni tramite cuffie auricolari. Il problema nasce quando contemporaneamente attivo un motorino vibrante (di quelli da cellulare per intenderci). Il suono non è più nitido ma leggermente distorto.
Come posso rimediare?
Grazie in anticipo
M.

Ma come lo attivi questo motorino?

Utilizzo un transistor C547 pilotato in PWM...

Ciao, stai per caso alimentando tutto da un’unica fonte?
Prova ad alimentare separatamente il motore con un alimentatore esterno oppure una batteria (basta mettere le masse in comune)

Il problema si presenta sia alimentando a batterie che con un alimentatore.
Ho provato con alimentazioni separate e il problema non si verifica.

A parte seguire il suggerimento di Pelletta, a cui aggiungo anche quello di mettere un paio di condensatori di disaccoppiamento sui pin 7/8 e 20/22 del micro (0.1uF), ti dico una cosa: la funzione analogWrite dell’Arduino è tarata (per lo meno fino alla versione 002x dell’IDE) per operare con chip a 16 MHz. A frequenze inferiori i tempi non tornano perché il timer non viene impostato correttamente.
La funzione tone usa poi il timer 2: se usi i pin 3 o 11 per il PWM ottieni che la modalità PWM altera i tempi del timer, portando probabilmente al gracchìo dell’audio.

ecco i risultati dei test.
Aggiunti i due condensatori: risultato invariato.
Provato il tutto su Arduino Mega 16Mhz: il ronzio è meno percettibile ma c'è.
L'alimentazione separata risolve il problema, ma purtroppo nel mio caso non è fattibile..
Altre idee?
M.

Ti avevo chiesto che pin usavi per il PWM.

Si giusto... sono i pin 9 e 10.

9 e 10 sono il timer 1. Quindi non c'entra la tone, che usa il timer 2.

Se non puoi separare le alimentazioni, metti un bel condensatore all'ingresso del circuito, tipo 47/100uF, in modo da fare da serbatoio per il micro nel momento in cui azioni il motorino. Altre idee non me ne vengono.
I condensatori sui pin di alimentazione tienili lo stesso: servono, anche se sembra che non facciano nulla.

Sull'alimentazione c'è un bel 4700uF. Qualcosa fa, ma non abbastanza..

Ma che alimentazione usi?

è uno switching 5v 1A.

Mettere un diodo sul motore potrebbe essere di aiuto?
Il motore seppur piccolo è sempre un carico induttivo, magari sporca l'alimentazione.
L'ho buttata là, magari è una sciocchezza

Il diodo dovrebbe esserci a prescindere, per proteggere il transistor.

Purtroppo anche il diodo c'è già...

Ho eliminato il PWM e il problema sembra scomparso.
Adesso però ho bisogno di abbassare la corrente che va al motore (tensione nominale 3V, mentre il tutto è alimentato a 5V).
Ho pensato ad una resistenza in serie al motore cioè: 5V-R-motore-collettore.
È fattibile o esiste una soluzione più "elegante" ?
M.

Io continuo a pensare ad un problema di interferenza fra PWM e Tone, il tutto abbinato al clock a 8 MHz.

PS:
la soluzione da te proposta non è elegante. Dovresti usare un apposito regolatore di tensione che ti fornisca i 3V con la corrente che ti serve. Tipo questo:

La soluzione da te proposta è più complessa, costosa e forse meno efficiente della resistenza in serie. Tieni presente che devo pilotare un motorino da circa 80mA.
Con soluzione più elegante intendevo dire se per esempio è possibile intervenire sulla resistenza alla base del transistor per limitare cosi la corrente che va al carico.
M.

Le resistenze non limitano la tensione ma la corrente. Se il motorino va a 3V, gli devi dare 3V.