Pages: [1] 2   Go Down
Author Topic: [bug]PWM su pin 5 e 6 a 800Hz!  (Read 1677 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10106
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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);
  }
}
« Last Edit: October 06, 2012, 07:22:04 pm by lesto » Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9185
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10106
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley

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

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged


0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10106
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 103
Posts: 6588
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Potreste proporre la correzione.  smiley-wink
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10106
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

fatto, vediamo se serve a qualcosa smiley

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
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

fatto, vediamo se serve a qualcosa smiley

Che pagina hai editato?
Logged


0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10106
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-wink
Logged


Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9185
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ti ho dato man forte  smiley-wink

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9185
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10106
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Pages: [1] 2   Go Up
Jump to: