MODIFICA FREQUENZA E PERIODO      

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