sketch di test (confronta il PWM pin 10 con il PWM pin 5)
sommando la durata di segnale alto+basso si ottene ~2ms (~400Hz) nel caso del pin 10, ~1ms(~800Hz) nel caso pin 5.
Vero che la documentazione prala di una "piccola differenza", ma quì si parla del doppio!
necessario: arduino, cavo volante dalpin 12 al pin 5 o 10 (NON insieme eh...)
Non è un bug, è una svista nella documentazione, prima di tutto ~2 ms sono ~500 Hz, ovvero la frequenza attesa per il PWM, mentre ~1ms sono circa ~1kHz, ovvero il doppio della frequenza attesa.
Sia il pin 5 che il 6 per il PWM usano il timer 0 che effettua tutti i 256 count in ~1ms (per effetto del prescaler 1:64) perchè abbinato alla millis, da questo deriva il fatto che il pwm su tali pin è per forza di cose ~1 kHz.
Per sicurezza ho controllato con il DSO, su i pin 3-9-10-11 la frequenza del PWM è 489 Hz, su i pin 5 e 6 è 978 Hz, ovviamente sono possibili leggere variazioni da questi valori a seconda della reale frequenza di oscillazione del risuonatore visto che è meno preciso di un quarzo.
Come ha detto astrobeed, il timer 0 usa il prescaler a /64 per non avere troppi overflow al secondo, a causa del fatto che esso è anche usato per le funzioni temporali dell'Arduino. Senza entrare nei dettagli del metodo usato per ottenere la frequenza di 1 overflow al secondo (che ho spiegato tempo), il timer 0 viene poi impostato per lavorare in modalità Fast PWM, dato che usando la Phase Correct PWM si avrebbe una frequenza dimezzata visto che in questa modalità il contatore non riparte da 0 non appena ha raggiunto il valore massimo ma viene decrementato finché non raggiunge 0 nuovamente. In modalità Fast PWM viene generata sui pin esterni un'onda quadra la cui frequenza è data dalla formula:
Fpwm = Fclk/(prescaler256)
Da cui si ha 16.000.000/(64256) = 976,5625 Hz.
I timer 1 e 2 vengono invece impostati in modalità Phase Correct PWM. Rispetto alla Fast PWM, questa modalità permette di ottenere un'onda quadra più simmetrica ma al costo di una frequenza dimezzata per i motivi suddetti, e cioè che il contatore cicla continuamente da 0 al valore massimo e poi torna nuovamente a 0, con lo stato dei pin che viene cambiato ad ogni raggiungimento del valore massimo (che può essere il massimo gestibile dal contatore oppure il valore impostato dal registro OCRxA). Siccome il timer 1 è a 16 bit, viene impostato ad 8 bit, in modo che la frequenza ottenibile si calcoli con la stessa formula usata nel caso del PWM sul timer 2 (anch'esso ad 8 bit), e cioè:
Fpwm = Fclk/(prescaler * 510) = 490,1961 Hz
Tutto questo si evince analizzando il file wiring.c, alla funzione init().
ah ok, quindi è un "bug" della documentazione.. ed anche bello grosso
i valori in Hz riportati sono ~, proprio perchè i valori non sono stabilissimi (magari pulsein influenzatat dalla seriale asincrona?), eppoi ragassuoli guardate l'ora a cui ho scritto
nel reference è spiegato che c'è una differenza per via del timer usato per le "temporarizzazioni", ma riporto le parole:
The PWM outputs generated on pins 5 and 6 will have higher-than-expected duty cycles. This is because of interactions with the millis() and delay() functions, which share the same internal timer used to generate those PWM outputs. This will be noticed mostly on low duty-cycle settings (e.g 0 - 10) and may result in a value of 0 not fully turning off the output on pins 5 and 6.
cioè, non è che mi dici che è IL DOPPIO, ma che è "qualcosa in più", e sinceramente io mi aspettavo magari massimo un +-10Hz o giù di lì (perchè immaginavo che il pwm fosse simulato via software prendendo in considerazione un interrupt sì e uno no, per esempio, e quindi fosse un minimo di errore)
ahahah grande leo, sei riuscito a cannare la correzzione, ovvero hai quotato la tua risposta come se fosse detta da astro. chi ci capisce qualcosa è bravo
lesto:
ahahah grande leo, sei riuscito a cannare la correzzione, ovvero hai quotato la tua risposta come se fosse detta da astro. chi ci capisce qualcosa è bravo
ROFTL
Non me ne sono reso conto.... doppia figurimme.....