Auteur Sujet: PWM - Faire varier la fréquence  (Lu 27437 fois)

PhB22

  • Invité
Re : PWM - Faire varier la fréquence
« Réponse #15 le: février 04, 2017, 03:24:36 pm »
Oui, mais comme j'ai dit, c'est assez subjectif.
C'est surtout à basse vitesse ou au démarrage/freinage que j'ai toute mon attention.
Des moteurs restent silencieux (tout est relatif) comme ceux que j'ai récupéré en informatique ou en HIFI.
D'autres comme les JOUEF sont un peu plus bruyants (Moteur de Picasso Hobby de JOUEF) mais présentent une montée ou une descente en vitesse sans bruit particulier.
Je pense que chacun doit faire ses essais.
Mon problème était de comprendre le changement de fréquence du PWM et c'est réglé grâce à vous (y compris les auteurs des articles sur le site).
Quant à la chauffe : ? Rien d'anormal.
« Modifié: février 04, 2017, 03:31:10 pm par PhB22560 »

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : PWM - Faire varier la fréquence
« Réponse #16 le: février 04, 2017, 05:15:16 pm »
En HO les moteurs sont gros, La chaleur s'évacue facilement. Et puis il faut le faire tourner quelques dizaines de minutes :)

Note que l'idéal pour avoir de bon ralentis, c'est de faire un asservissement de vitesse
« Modifié: février 04, 2017, 05:26:45 pm par Jean-Luc »
Cordialement

maxou9914

  • Newbie
  • *
  • Messages: 29
    • Voir le profil
Re : PWM - Faire varier la fréquence
« Réponse #17 le: février 04, 2017, 05:22:49 pm »
j'ai compris qu'il existe 3 timer indépendant ( le timer 2 gère aussi millis donc il ne faut pas y toucher )

Citer
Bon, donc il y a trois Timers (UNO ou MEGA) :
Le Timer 0 correspond aux broches 5 et 6
Le Timer 1 correspond aux broches 9 et 10
Le Timer 2 correspond aux broches 3 et 11.

Afin de modifier la fréquence rajouter en fonction de du moteur:

- TCCR1B |= B00000001;
ou
- TCCR1B |= B00000010;
ou
- TCCR1B |= B00000011;
ou
- TCCR1B |= B00000100;
ou
- TCCR1B |= B00000101;


Mais je ne comprend pas comment faire le lien entre le timer de son choix et TCCR1B ?

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : PWM - Faire varier la fréquence
« Réponse #18 le: février 04, 2017, 05:24:27 pm »
TCCR1B pour le timer 1,
TCCR2B pour le timer 2 :)

C'est le Timer 0 qui gère les millis.
« Modifié: février 04, 2017, 05:44:01 pm par Jean-Luc »
Cordialement

PhB22

  • Invité
Re : Re : PWM - Faire varier la fréquence
« Réponse #19 le: février 04, 2017, 06:29:42 pm »
Afin de modifier la fréquence rajouter en fonction de du moteur:

- TCCR1B |= B00000001;
ou
- TCCR1B |= B00000010;
ou
- TCCR1B |= B00000011;
ou
- TCCR1B |= B00000100;
ou
- TCCR1B |= B00000101;

Oui, mais comme l'a dit Jean-Luc, avant d'écrire cela dans le setup, il faut écrire cette commande :
TCCR1B &= 0xF8;

Puis ensuite :
TCCR1B |= B00000001;
ou
TCCR1B |= B00000010;
ou
TCCR1B |= B00000011;
ou
TCCR1B |= B00000100;
ou
TCCR1B |= B00000101;

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : PWM - Faire varier la fréquence
« Réponse #20 le: février 04, 2017, 06:34:57 pm »
Je vous propose une fonction que je viens d'écrire pour faciliter cette configuration. C'est 3 fois rien mais ça peut servir (j'ai pas testé  ::)):

/* Allowed pins to change the PWM */
const byte PINS_9_10 = 0;
const byte PINS_3_11 = 1;

/* Allowed frequencies */
const byte PWM_32k = B00000001;
const byte PWM_4k  = B00000010;
const byte PWM_500 = B00000011;
const byte PWM_100 = B00000100;
const byte PWM_30  = B00000101;

void setPWMFrequency(byte pins, byte frequency)
{
  if (frequency >= 1 && frequency <= 5) {
    if (pins == PINS_9_10) {
      TCCR1B &= B11111000; /* aucune horloge */
      TCCR1B |= frequency;
    }
    else if (pins == PINS_3_11) {
      TCCR2B &= B11111000; /* aucune horloge */
      TCCR2B |= frequency;
    }
  }
}

void setup() {
  // Configuration des PWM des broches 9 et 10 à 32kHz
  setPWMFrequency(PINS_9_10, PWM_32k);
}

void loop() {
  // put your main code here, to run repeatedly:

}
Cordialement

PhB22

  • Invité
Re : PWM - Faire varier la fréquence
« Réponse #21 le: février 04, 2017, 06:44:00 pm »
Au début de ce fil, il y a eu cela :

CS2 CS1 CS0 Effet
0      0      0   Aucune horloge, le timer ne compte pas
0      0      1   division par 1
0      1      0   division par 8
0      1      1   division par 64
1      0      0   division par 256
1      0      1   division par 1024

On peut diviser par 1, 8, 64 etc.
Question peut être naïve : existe-t-il une possibilité de mettre des valeurs intermédiaires comme 2, 4, 16 etc. pour diviser ? En puissance de 2 bien sur.
« Modifié: février 04, 2017, 06:46:43 pm par PhB22560 »

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : PWM - Faire varier la fréquence
« Réponse #22 le: février 04, 2017, 06:49:13 pm »
Non on ne peut pas mettre n'importe quelle valeur.

Je suis en train de tester et, ayant un problème, je viens de m'apercevoir que le timer 2 permet plus de fréquences. Sur le timer 2, on a des divisions par 1, 8, 32, 64, 128, 256 et 1024. Je modifie la fonction pour prendre ça en charge.
Cordialement

PhB22

  • Invité
Re : PWM - Faire varier la fréquence
« Réponse #23 le: février 04, 2017, 06:56:48 pm »
Comme j'ai le montage devant moi, je peux tester des valeurs intermédiaires pour le Timer mais je vois pas trop comment les écrire dans la suite de 0 et 1 après le B

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : PWM - Faire varier la fréquence
« Réponse #24 le: février 04, 2017, 06:58:54 pm »
Tu ne peux pas. Tu as 3 bits, donc 8 valeurs possibles et j'ai donné dans la table la correspondance du diviseur pour ces valeurs (pour timer 1). C'est en dur dans le matériel, pas moyen d'avoir une valeur quelconque.
« Modifié: février 04, 2017, 07:00:28 pm par Jean-Luc »
Cordialement

PhB22

  • Invité
Re : PWM - Faire varier la fréquence
« Réponse #25 le: février 04, 2017, 07:09:34 pm »
En revanche je viens de mettre une ampoule à filament genre de celles que l'on utilise dans le décor (intérieur de maison par exemple), c'est très bien, l'intensité lumineuse monte et descend dans un bel effet.
Je pensais à ceux qui veulent passer du jour vers la nuit et l'inverse.

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : PWM - Faire varier la fréquence
« Réponse #26 le: février 04, 2017, 07:12:44 pm »
Ce coup-ci c'est testé et corrigé.

Effectivement Timer 1 et Timer 2 ne sont pas identiques en ce qui concerne la division d'horloge. La fonction dans le programme suivant permet de régler la fréquence sur les broches 9 et 10 (timer 1) et sur les broches 3 et 11 (timer 2). Les broches 3 et 11 permettent des fréquences de 32k, 4k, 1k, 500, 250, 100 et 30 (environ, j'ai arrondi). les broches 9 et 10 permettent des fréquences de 32k, 4k, 500, 100 et 30.

Si on essaye d'appeler la fonction pour les broches 9 et 10 avec des fréquences de 1k ou 250, l'horloge est coupée (plus de PWM).

/* Allowed pins to change the PWM */
const byte PINS_9_10 = 0;
const byte PINS_3_11 = 1;

/* Allowed frequencies */
const byte PWM_32k = 0; /* All pins */
const byte PWM_4k  = 1; /* All pins */
const byte PWM_1k  = 2; /* Pins 3 and 11 only */
const byte PWM_500 = 3; /* All pins */
const byte PWM_250 = 4; /* Pins 3 and 11 only */
const byte PWM_100 = 5; /* All pins */
const byte PWM_30  = 6; /* All pins */

/* CS codes for timer 1 */
const byte codeForTimer1[] PROGMEM = {
  B00000001,
  B00000010,
  B00000000, /* no clock if config not allowed */
  B00000011,
  B00000000, /* no clock if config not allowed */
  B00000100,
  B00000101,
};

/* CS codes for timer 2 */
const byte codeForTimer2[] PROGMEM = {
  B00000001,
  B00000010,
  B00000011,
  B00000100,
  B00000101,
  B00000110,
  B00000111,
};

void setPWMFrequency(byte pins, byte frequency)
{
  if (frequency < 7) {
    if (pins == PINS_9_10) {
      byte csCode = pgm_read_byte_near(codeForTimer1 + frequency);
      TCCR1B &= B11111000; /* aucune horloge */
      TCCR1B |= csCode;
    }
    else if (pins == PINS_3_11) {
      byte csCode = pgm_read_byte_near(codeForTimer2 + frequency);
      TCCR2B &= B11111000; /* aucune horloge */
      TCCR2B |= csCode;
    }
  }
}

void setup() {
  // put your setup code here, to run once:
  setPWMFrequency(PINS_9_10, PWM_32k);
  setPWMFrequency(PINS_3_11, PWM_32k);
  analogWrite(9,128);
  analogWrite(3,128);
}

void loop() {
  // put your main code here, to run repeatedly:

}
Cordialement

PhB22

  • Invité
Re : PWM - Faire varier la fréquence
« Réponse #27 le: février 04, 2017, 07:18:10 pm »
Bon pour moi c'est OK.
Il s'agit d'un va et vient pour voie unique avec détection IR à chaque extrémité. Les temps de réglage pour l'accélération et le freinage ainsi que les temps de pause aux extrémités sont réglables par potentiomètre.
Rien de vraiment compliqué mais j'avais ce souci de fréquence avec le PWM.
Lorsque l'alimentation variable sera montée, je ferrais un autre fil.
Encore merci à Jean-Luc et Pierre59 pour leur aide précieuse... et leur patience ;) ;)

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : Re : PWM - Faire varier la fréquence
« Réponse #28 le: février 05, 2017, 12:20:57 pm »
En revanche je viens de mettre une ampoule à filament genre de celles que l'on utilise dans le décor (intérieur de maison par exemple), c'est très bien, l'intensité lumineuse monte et descend dans un bel effet.
Je pensais à ceux qui veulent passer du jour vers la nuit et l'inverse.

Oui, ça peut tout à fait servir à faire un éclairage gradué.

Ceci dit, j'avais fait des essais avec un ruban de LED et avec les paramètres mis en place par le logiciel Arduino il y a un défaut (du moins de mon point de vue). La PWM est 8 bits, donc on a 256 pas de réglage. Le problème est que en passant de 0 (éteint) à 1 (premier pas), la transition est trop brusque à mon goût. Trop brusque pour simuler l'aube ou le crépuscule.

Or le Timer 1 est un Timer 16 bits qui permet de générer des PWM de 65536 pas. J'avais donc reparamétré cela et ça fonctionnait bien avec une transition extinction totale à allumage imperceptible. Je vous retrouve le code qui doit être quelque part :)
Cordialement