Go Down

Topic: [bug]PWM su pin 5 e 6 a 800Hz! (Read 2184 times) previous topic - next topic

lesto

Oct 07, 2012, 02:18 am Last Edit: Oct 07, 2012, 02:22 am by lesto Reason: 1
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

Code: [Select]
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);
 }
}
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

astrobeed

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.

leo72

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/(prescaler*256)
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().

lesto

ah ok, quindi è un "bug" della documentazione.. ed anche bello grosso  :smiley-mr-green:

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:
Quote
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)
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

leo72

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

lesto

mi meraviglio che una grossolanità del genere non sia stata ancora corretta.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie


lesto

fatto, vediamo se serve a qualcosa :)

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  :smiley-mr-green:
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

leo72


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
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

leo72


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

astrobeed


Ti ho dato man forte  ;)


E io ti ho corretto perché hai scritto l'esatto contrario di come stanno le cose  :smiley-mr-green:

leo72

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

astrobeed


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


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

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 :)
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Go Up