La seguente esercitazione è puramente didattica.
E' sconsigliabile utilizzare i Timer dei PIN 5 e 6 nei programmi in quanto si riflettono sulle istruzioni delay() e Millis().
I Registri B ( TCCR0B, TCCR1B, TCCR2B ) hanno il compito di impostare il dividendo (prescaler) della frequenza PWM.
I prescaler (dividendi) per i PIN 6 5 9 10 sono 5 : 1 8 64 256 1024
I prescaler (dividendi) per i PIN 11 3 sono 7 : 1 8 32 64 128 256 1024
Il valore, prescaler, di default per tutti i TIMER è 64
31250 / 64 = 488 Hz
62500 / 64 = 976 Hz
Applicazioni personali didattiche
L’input sopporta un massimo di 50 Vpk con una scala compresa fra 5mV/div a 20 V/div.
I TEMPI possono variare da 10 us(micro secondi) a 500 s
La Frequenza arriva fino a 200 kHz con un errore massimo del 5%.
Set a corredo: alimentatore da 9 Volt e connettore BNC
Esercitazione sul PIN 11
Utilizzato IDE 1.6.4
void setup()
{ pinMode (11, OUTPUT); //setto il PIN 11 come uscita
setPwmFrequency(11, 1); //applico il divisore 1 sul timer del pin 11
}
void loop()
{
analogWrite (11, 127); //genero sul pin 11 un segnale con duty cycle 50% (127 nel range 0-255)
}
void setPwmFrequency(int pin, int divisor) //funzione per modificare la frequenza del PWM
{
byte mode;
if (pin == 5 || pin == 6 || pin == 9 || pin == 10) //se il pin è uno di questi
{
switch (divisor) //in base al divisore scelto viene dato un valore esadecimale a "mode"
{
case 1: mode = 0x01; break;
case 8: mode = 0x02; break;
case 64: mode = 0x03; break;
case 256: mode = 0x04; break;
case 1024: mode = 0x05; break;
default: return;
}
if (pin == 5 || pin == 6) //se il pin è il 5 o il 6 cambio il valore del registro TCCR0B
{
TCCR0B = TCCR0B & 0b11111000 | mode;
} else //altrimenti cambio il valore del registro TCCR1B
{
TCCR1B = TCCR1B & 0b11111000 | mode;
}
} else if (pin == 3 || pin == 11) //se il pin è il 3 o 11 cambio il valore del registro TCCR2B
{
switch (divisor) {
case 1: mode = 0x01; break;
case 8: mode = 0x02; break;
case 32: mode = 0x03; break;
case 64: mode = 0x04; break;
case 128: mode = 0x05; break;
case 256: mode = 0x06; break;
case 1024: mode = 0x07; break;
default: return;
}
TCCR2B = TCCR2B & 0b11111000 | mode;
}
}
Questo è il risultato:
Att.ne : Ogni quadretto orizzontale vale 10 microsecondi
Il PERIODO (Cycle) è uguale a circa 31 microsecondi => 0.031 millisecondi
1 / 31250 = 0.000032 sec 0.000032 x 1000 = 0.032 millisecondi
Si denota una leggera imprecisione delle creste dei segnali.
ULTIMO TEST : Frequenza a 62500 Hz
Esercitazione sul PIN 5
Utilizzato IDE 1.6.4
void setup()
{ pinMode (5, OUTPUT); //setto il PIN 5 come uscita
setPwmFrequency(5, 1); //applico il divisore 1 sul timer del pin 5
}
void loop()
{
analogWrite (5, 127); //genero sul pin 5 un segnale con duty cycle 50% (127 nel range 0-255)
}
void setPwmFrequency(int pin, int divisor) //funzione per modificare la frequenza del PWM
{
byte mode;
if (pin == 5 || pin == 6 || pin == 9 || pin == 10) //se il pin è uno di questi
{
switch (divisor) //in base al divisore scelto viene dato un valore esadecimale a "mode"
{
case 1: mode = 0x01; break;
case 8: mode = 0x02; break;
case 64: mode = 0x03; break;
case 256: mode = 0x04; break;
case 1024: mode = 0x05; break;
default: return;
}
if (pin == 5 || pin == 6) //se il pin è il 5 o il 6 cambio il valore del registro TCCR0B
{
TCCR0B = TCCR0B & 0b11111000 | mode;
} else //altrimenti cambio il valore del registro TCCR1B
{
TCCR1B = TCCR1B & 0b11111000 | mode;
}
} else if (pin == 3 || pin == 11) //se il pin è il 3 o 11 cambio il valore del registro TCCR2B
{
switch (divisor) {
case 1: mode = 0x01; break;
case 8: mode = 0x02; break;
case 32: mode = 0x03; break;
case 64: mode = 0x04; break;
case 128: mode = 0x05; break;
case 256: mode = 0x06; break;
case 1024: mode = 0x07; break;
default: return;
}
TCCR2B = TCCR2B & 0b11111000 | mode;
}
}
Questo è il risultato:
Il divisore, nel programma, dopo il test viene impostato a 64.
Verifico correttamente la frequenza di 978 Hz (del pin 5), dopo aver "caricato" il programma su Arduino.
CONTINUA ......