Auteur Sujet: Moification Timer 2 / PWM sur Arduino Nano  (Lu 679 fois)

Benoit92

  • Full Member
  • ***
  • Messages: 185
    • Voir le profil
Moification Timer 2 / PWM sur Arduino Nano
« le: décembre 01, 2017, 12:37:13 pm »
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 :
//    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;

Normalement, si je modifie la valeur :
int mode = 0x5;
Je devrai pouvoir changer la fréquence de récurrence du timer 2  sur l'arduino Nano ?




Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1222
    • Voir le profil
Re : Moification Timer 2 / PWM sur Arduino Nano
« Réponse #1 le: décembre 01, 2017, 01:15:02 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 ?

Il fonctionne à l'identique

Citer
3) Pour la modification du timer 2, j'utilise les instructions suivantes :
//    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;

Normalement, si je modifie la valeur :
int mode = 0x5;
Je devrai pouvoir changer la fréquence de récurrence du timer 2  sur l'arduino Nano ?

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
« Modifié: décembre 01, 2017, 01:27:01 pm par Jean-Luc »

Benoit92

  • Full Member
  • ***
  • Messages: 185
    • Voir le profil
Re : Moification Timer 2 / PWM sur Arduino Nano
« Réponse #2 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).

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:
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;
        }
    }
}
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:
// 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;


Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1222
    • Voir le profil
Re : Re : Moification Timer 2 / PWM sur Arduino Nano
« Réponse #3 le: décembre 01, 2017, 04:44:38 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).

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

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

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1222
    • Voir le profil
Re : Re : Moification Timer 2 / PWM sur Arduino Nano
« Réponse #4 le: décembre 01, 2017, 04:49: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


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

Benoit92

  • Full Member
  • ***
  • Messages: 185
    • Voir le profil
Re : Modification Timer 2 / PWM sur Arduino Nano
« Réponse #5 le: décembre 01, 2017, 06:10:47 pm »
Ok, merci.
1) Je vais réessayer en spécifiant une valeur pour "divisor".
J'espère que le stator aimanté ESU n'est pas désaimanté !

2) "Il n'y a pas de différence, c'est le même micro"
Ok, mais peut être que la répartition des entrées/sorties est différente?
Il y a en apparemment moins sur le Nano

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1222
    • Voir le profil
Re : Moification Timer 2 / PWM sur Arduino Nano
« Réponse #6 le: décembre 01, 2017, 06:59:16 pm »
Non ce sont les mêmes broches.

PS: je ne sais même pas pourquoi je m'enquiquine à faire des bibliothèques

Benoit92

  • Full Member
  • ***
  • Messages: 185
    • Voir le profil
Re : Moification Timer 2 / PWM sur Arduino Nano
« Réponse #7 le: décembre 01, 2017, 11:08:39 pm »
Euh Merci, Toutes mes confuses !!
Sinon, pour les fréquences de pilotage du pont sur le moteur de la BR80 :
A 30 Hz, trop saccadé
A 125 Hz, ça va mieux
A 250 Hz, le moteur demande une tension plus grande pour démarrer (la moitié du potentiomètre de la MS2).

Bon, à priori, je choisis 125 Hz.

Petit problème, quand le potentiomètre de la MS2 est à 0, quelque soit la fréquence, il y a une tension "résiduelle" d'environ 100 mV qui est suffisante pour faire "chanter" un peu le moteur  !!!!!!!!!

Benoit92

  • Full Member
  • ***
  • Messages: 185
    • Voir le profil
Re : Re : Moification Timer 2 / PWM sur Arduino Nano
« Réponse #8 le: décembre 02, 2017, 10:30:30 am »
Petit problème, quand le potentiomètre de la MS2 est à 0, quelque soit la fréquence, il y a une tension "résiduelle" d'environ 100 mV qui est suffisante pour faire "chanter" un peu le moteur  !!!!!!!!!
Problème résolu : oubli de décommenter une ligne !
Sinon, après essais, je dois mettre :
analogWrite(pinPWMoteurs,(Speed*7)+45) pour démarrer la locomotive.