Funzione tone()

Salve a tutti, potrei sapere perché la funzione tone() sui pin pwm mi da un segnale quadro di ampiezza fino a 3,5v? Essendo basato sui livelli logici dovrebbe un'ampiezza fino a 5v...
C'é un modo per arrivare a 5v? O devo agire con amplificatori operazionali?
Grazie a tutti.

Ciao. Il segnale PWM generato da tone(), se lo guardi con un oscilloscopio vedrai un treno di impulsi a 5V, se lo misuri con un multimetro ti darà il "valore effettivo" di quella frequenza di impulsi a 5V. È come se stessi regolando un led, gli impulsi sono 5v ma la sua luminosità non è il massimo.
Saluti.

Grazie mille allora sarà un errata calibrazione del mio oscilloscopio.

tone() genera un'onda quadra, non un PWM. L'ampiezza deve essere pari a quella di alimentazione. Stai usando un Arduino con microcontrollore alimentato a 5V come Arduino Uno o uno a 3,3V?... Sul pin su cui stai misurando è collegato un carico di qualche tipo?

Sto usando un esp8266, probabilmente la sua tensione è 3,3v?
Ad ogni modo, il mio scopo era quello di generare un'onda quadra, ma poi ho saputo che al progetto serviva una tensione continua variabile da 0 a 5v, quindi mi sono organizzato con un dac mcp4725. Insomma errate indicazioni da parte del progettista.

Eh, sì! :slight_smile: L'ESP8266 è alimentato a 3,3V!
Per avere direttamente fino a 5V in uscita, il DAC deve essere alimentato a 5V e deve comunicare in I2C con l'8266 alimentato a 3,3V, perciò devi adattare i livelli:
https://www.google.com/search?q=i2c+3,3v+5V&tbm=isch

In alternativa, puoi alimentare il DAC a 3,3V e poi amplificare il segnale con un operazionale con uscita "rail to rail". Se non ti serve la precisione di 12 bit e ti puoi accontentare del PWM dell'ESP8266 (che è a 10 bit, diversamente da quello dell'ATmega328P che è a 8 bit) puoi fare semplicemente un passa basso con una resistenza e un condensatore e poi amplificare con un operazionale rail to rail.

Gli opamp rail to rail:

Su ciò sono già informato, grazie mille a tutti, gentili come sempre!