[bug]PWM su pin 5 e 6 a 800Hz!

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...)

testato su ide 1.0.1

uint8_t pwm=127;

void setup(){
  Serial.begin(9600);
  delay(1000);
  Serial.println();
  analogWrite(5, pwm);
  analogWrite(10, pwm);
}

void loop(){
  Serial.println( pulseIn(12, HIGH) );
  Serial.println( pulseIn(12, LOW) );
  int r = Serial.read();
  if (r=='+'){
    pwm+=5;
    analogWrite(5, pwm);
    analogWrite(10, pwm);
    Serial.println(pwm);
  }
  if (r=='-'){
    pwm-=5;
    analogWrite(5, pwm);
    analogWrite(10, pwm);
    Serial.println(pwm);
  }
}

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/(64
256) = 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 :grin:

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 :slight_smile:

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)

Mi meraviglio che dopo tutto questo tempo tu creda ancora al fatto che la doc ufficiale sia esente da errori per grazia divina :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

mi meraviglio che una grossolanità del genere non sia stata ancora corretta.

Potreste proporre la correzione. :wink:

fatto, vediamo se serve a qualcosa :slight_smile:

ps. chiedo scusa a uwe per aver messo il post in generale, però è il genere di post che non saprei se mettere in HW o in SW :grin:

lesto:
fatto, vediamo se serve a qualcosa :slight_smile:

Che pagina hai editato?

non si può editare il reference, ma c'è un link alla board http://arduino.cc/forum/index.php/board,23.0.html
il mio messaggio è http://arduino.cc/forum/index.php/topic,126161.0.html

lesto:
non si può editare il reference, ma c'è un link alla board http://arduino.cc/forum/index.php/board,23.0.html
il mio messaggio è http://arduino.cc/forum/index.php/topic,126161.0.html

Ti ho dato man forte :wink:

leo72:
Ti ho dato man forte :wink:

E io ti ho corretto perché hai scritto l'esatto contrario di come stanno le cose :grin:

Che fava! E dire che ho anche fatto tutti i calcoli in questo thread per far vedere come si arriva a quei valori :sweat_smile:
Cmq ho corretto, grazie.

leo72:
E dire che ho anche fatto tutti i calcoli in questo thread per far vedere come si arriva a quei valori :sweat_smile:

Vero, speriamo che il messaggio arrivi in tempi brevi a chi di dovere.

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 :slight_smile:

In pratica avete fatto comunella per prendere in castagna AWOL e fargli modificare la pagina.
Sembra il gioco delle tre carte coi pali.
Cattivoni! ]:smiley: ]:smiley: :grin:

PaoloP:
In pratica avete fatto comunella per prendere in castagna AWOL e fargli modificare la pagina.

Così impara non "fregarmi" l'avatar, lo uso da oltre 13 anni e ne rivendico il diritto di unicità :grin:

io lo distraggo, leo lo prende da dietro, e astro fa il palo :grin:

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 :slight_smile:

ROFTL :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:
Non me ne sono reso conto.... doppia figurimme..... :sweat_smile: :sweat_smile:

lesto:
io lo distraggo, leo lo prende da dietro, e astro fa il palo :grin:

per fortuna ne sono fuori sta volta. 8) 8)