Parlons Arduino > Shields et Modules

Moification Timer 2 / PWM sur Arduino Nano

(1/2) > >>

Benoit92:
Bonjour,
J'ai monté un "Banc roulant" à partir d'une BR 80 (030) Märklin Echelle 1 et d'un arduino Nano et d'un shield L298 (pont en H).

J'ai changé le stator d'origine (qui est bobiné) par un stator- aimant de chez ESU et donc également supprimé l'inverseur de sens.

Normalement, cette locomotive (qui a le même moteur que la crocodile Märklin échelle HO) fonctionne en 16 V - 50 Hz.
Je voudrai pouvoir essayer plusieurs fréquences de récurrence PWM afin de vérifier : le bruit, l'échauffement (moteur et L298) et le comportement global du moteur.

1) La locomotive ne démarre que lorsque que le bouton de la Mobile Station 2 est supérieure au 3/4 ?

2) J'essaye de modifier la fréquence de récurrence du PWM sur la pin 3 à partir du Timer 2, mais je ne sais pas si le Nano fonctionne comme le Uno ?

3) Pour la modification du timer 2, j'utilise les instructions suivantes :

--- Code: ---//    int divisor;
//    int mode = 0x5;
//    switch (divisor) {
//      case 1: mode = 0x01; break; // 31 kHz
//      case 8: mode = 0x02; break; // 4 kHz
//      case 32: mode = 0x03; break; // 1 kHz
//      case 64: mode = 0x04; break; // 500 Hz
//      case 128: mode = 0x05; break; // 250 Hz
//      case 256: mode = 0x06; break; // 125 Hz
//      case 1024: mode = 0x07; break; // 30 Hz
//      default: return;
//    }
//    TCCR2B = TCCR2B & 0b11111000 | mode;
--- Fin du code ---

Normalement, si je modifie la valeur :

--- Code: --- int mode = 0x5;

--- Fin du code ---
Je devrai pouvoir changer la fréquence de récurrence du timer 2  sur l'arduino Nano ?



Jean-Luc:

--- Citation de: Benoit92 le décembre 01, 2017, 12:37:13 pm ---2) J'essaye de modifier la fréquence de récurrence du PWM sur la pin 3 à partir du Timer 2, mais je ne sais pas si le Nano fonctionne comme le Uno ?

--- Fin de citation ---

Il fonctionne à l'identique


--- Citer ---3) Pour la modification du timer 2, j'utilise les instructions suivantes :

--- Code: ---//    int divisor;
//    int mode = 0x5;
//    switch (divisor) {
//      case 1: mode = 0x01; break; // 31 kHz
//      case 8: mode = 0x02; break; // 4 kHz
//      case 32: mode = 0x03; break; // 1 kHz
//      case 64: mode = 0x04; break; // 500 Hz
//      case 128: mode = 0x05; break; // 250 Hz
//      case 256: mode = 0x06; break; // 125 Hz
//      case 1024: mode = 0x07; break; // 30 Hz
//      default: return;
//    }
//    TCCR2B = TCCR2B & 0b11111000 | mode;
--- Fin du code ---

Normalement, si je modifie la valeur :

--- Code: --- int mode = 0x5;

--- Fin du code ---
Je devrai pouvoir changer la fréquence de récurrence du timer 2  sur l'arduino Nano ?

--- Fin de citation ---

Que vaut divisor ?

Comme il n'est pas valué, il peut avoir une valeur quelconque

Utiliser plutôt la bibliothèque ici : http://www.locoduino.org/spip.php?article203
D'autres explications ici : http://www.locoduino.org/spip.php?article202

Benoit92:
1) Je sais pas, mais je suppose que l'on peut choisir entre 1, 8, 32, 64, 128, 256, 1024 (pour être Ok avec le switch...case).

2) Sinon, j'ai lu cela qui me crée un doute sur la différence entre UNO et NANO :

The best way to think about the Arduino Nano timers is to think about the timers in the underlying chip: the ATmega328. It has three timers:
•   Timer 0: 8-bit, PWM on chip pins 11 adn 12
•   Timer 1: 16-bit, PWM on chip pins 15 and 16
•   Timer 2: 8-bit, PWM on two pins 17 and 5
All of these timers can produce two kinds of interrupts:
•   The "value matched" interrupt occurs when the timer value, which is added to every tick of the timer reaches a comparison value in the timer register.
•   The timer overflow interrupt occurs when the timer value reaches its maximum value
Unfortunately, there is no Arduino function to attach interrupts to timers. To use timer interrupts you will need to write slightly more low-level code. Basically, you will need to declare an interrupt routine something like this:

--- Code: ---ISR(TIMER1_OVF_vect) {
   ...
}
This will declare a function to service timer1 overflow interrupt. Then you will need to enable the timer overflow interrupt using the TIMSK register. In the above example case this might look like this:
TIMSK1 |= (1<<TOIE1);
or
TIMSK1 |= BV(TOIE1);
This sets the TOIE1 (generate timer1 overflow interrupt, please) flag in the TIMSK1 register. Assuming that your interrupts are enabled, your ISR(TIMER1_OVF_vect) will get called every time timer1 overflows.
 
The Arduino delay() function looks as follows in the source code (wiring.c):
void delay(unsigned long ms)
{
    uint16_t start = (uint16_t)micros();

    while (ms > 0) {
        if (((uint16_t)micros() - start) >= 1000) {
            ms--;
            start += 1000;
        }
    }
}
--- Fin du code ---
So internally it uses the micros() function, which indeed relies on the timer0 count. The Arduino framework uses timer0 to count milliseconds, indeed, timer0 count is is where millis() function gets its value.
The delayMicroseconds() function, on the other hand, uses certain well-timed microprocessor operations to create the delay; which function is used depends on the processor and the clock speed; the most common being nop() (no operation) which takes exactly one clock cycle. Arduino Nano uses a 16mhz clock, here's what the source code looks like for that:

--- Code: ---// for a one-microsecond delay, simply return.  the overhead
// of the function call yields a delay of approximately 1 1/8 us.
if (--us == 0)
    return;

// the following loop takes a quarter of a microsecond (4 cycles)
// per iteration, so execute it four times for each microsecond of
// delay requested.
us <<= 2;

// account for the time taken in the proceeding commands.
us -= 2;
--- Fin du code ---

Jean-Luc:

--- Citation de: Benoit92 le décembre 01, 2017, 04:41:42 pm ---1) Je sais pas, mais je suppose que l'on peut choisir entre 1, 8, 32, 64, 128, 256, 1024 (pour être Ok avec le switch...case).

--- Fin de citation ---

Donc comme sa valeur est inconnue, n'importe quelle branche du switch peut être prise avec pour résultat la modification de mode et l'écrasement de la valeur que tu penses y avoir mise.


--- Citer ---2) Sinon, j'ai lu cela qui me crée un doute sur la différence entre UNO et NANO :

SNIP

--- Fin de citation ---

Il n'y a pas de différence, c'est le même micro.

Jean-Luc:

--- Citation de: Benoit92 le décembre 01, 2017, 04:41:42 pm ---•   Timer 0: 8-bit, PWM on chip pins 11 adn 12
•   Timer 1: 16-bit, PWM on chip pins 15 and 16
•   Timer 2: 8-bit, PWM on two pins 17 and 5

--- Fin de citation ---

Ça c'est la numérotation du chip pas celle de l'Arduino

Navigation

[0] Index des messages

[#] Page suivante

Utiliser la version classique