LOCODUINO

Les Timers

Les Timers (IV)

La génération des PWM

.
Par : Christian

DIFFICULTÉ :

Nous avons appris dans les trois premiers articles à utiliser les timers de nos microcontrôleurs ATmega328P équipant les modules Arduino Uno, Nano et Mini. Nous avons décrit deux modes de fonctionnement des timers, le mode normal, voir l’article Les Timers (I), et le mode CTC, voir l’article Les Timers (III). Nous allons découvrir dans cet article deux autres modes de fonctionnement qui servent, entre autre, à fabriquer la PWM. Une introduction à ce qu’est la PWM se trouve dans l’article La PWM : Qu’est-ce que c’est ? (1). Bien entendu, la lecture du présent article suppose d’avoir lu et compris les trois premiers articles sur les Timers, Les Timers (I), Les Timers (II) et Les Timers (III).

PWM et broches de sortie

Le module Arduino Uno est capable de générer de la PWM sur 6 broches de sorties grâce à la fonction analogWrite. D’une manière transparente pour l’utilisateur, cette fonction utilise les timers du microcontrôleur pour générer sur les sorties, un signal carré de fréquence fixe mais de largeur variable pour l’impulsion à l’état haut. Le tableau suivant indique quel timer est utilisé pour générer la PWM et sur quelles sorties du module Uno elle est générée.

TimerSorties du module Uno
timer0 5 et 6
timer1 9 et 10
timer2 3 et 11

Un timer gère donc deux broches de sortie ; la figure 1 (extraite de la datasheet de l’ATmega328P) permet de comprendre l’architecture d’un bloc timer. Sur cette figure, la lettre « n » est utilisée pour désigner le numéro du timer (n = 0, 1, 2).

Figure 1
Figure 1
Architecture du bloc timer à l’intérieur du microcontrôleur ATmega328P

Le signal d’horloge clkTn (en jaune) arrive à la logique de contrôle, en provenance de l’extérieur (Tn) ou bien de l’horloge interne et du prescaler. La logique de contrôle incrémente ou décrémente le timer TCNTn (en vert) et celui-ci est comparé aux valeurs des registres OCRnA et OCRnB (en bleu). Lorsqu’il y a égalité, un signal est envoyé à un bloc appelé « Waveform Generation » (Génération de la forme d’onde) (en rouge) et c’est ce bloc qui met en forme la PWM en positionnant à 0 ou à 1 le registre des broches OCnA ou OCnB (en violet). Bien entendu, ces broches doivent avoir été déclarées comme des sorties auparavant.

Le timer0 génère donc de la PWM sur les broches OC0A et OC0B. La figure 2 (extraite de la datasheet de l’ATmega328P) montre que ces broches (en rouge) sont les broches 12 et 11 du microcontrôleur (PD6 et PD5).

Figure 2
Figure 2
Brochage du microcontrôleur ATmega328P

Le schéma de câblage du module Arduino Uno Rev 3, donné sur le site d’Arduino, permet de voir que la broche PD5 est reliée à la sortie 5 du module alors que la broche PD6 est reliée à la sortie 6 :
http://arduino.cc/en/uploads/Main/A...

De la même façon, on peut voir sur la figure 2 que le timer1 génère la PWM sur les broches en bleu (broches 15 et 16 du microcontrôleur) et que le timer2 le fait sur les broches en vert (broches 5 et 17 du microcontrôleur). Les broches 15 et 16 sont reliées aux sorties 9 et 10 du module Uno et les broches 5 et 17 le sont aux sorties 3 et 11.

Génération de la PWM

Maintenant que nous savons où récupérer nos signaux PWM, voyons comment ils sont générés. Deux modes de fonctionnement de nos timers peuvent être utilisés pour générer de la PWM :

  • Le mode « Fast PWM Mode »
  • Le mode « Phase Correct PWM Mode »

Comme son nom l’indique (fast signifiant rapide), le Fast PWM Mode permet d’obtenir une PWM ayant une fréquence plus élevée que le Phase Correct PWM Mode (pratiquement un facteur deux comme nous le verrons), mais en contrepartie, une résolution du signal moins bonne. En effet, le mode Fast est basé sur une opération à simple pente, ce qui signifie que le timer/counter ne fait que s’incrémenter pour aller chercher la valeur de comparaison OCRnx (« x » signifiant A ou B). Rappelez-vous que nous avons dit que lorsqu’il y a égalité, un signal est envoyé au bloc Waveform Generation qui va alors générer le signal PWM désiré. Le mode Phase Correct est basé sur une opération à double pente, ce qui signifie que le timer/counter s’incrémente de la valeur BOTTOM à la valeur TOP puis se décrémente de TOP à BOTTOM. Ces deux opérations prennent plus de temps, ce qui donne une période plus longue donc une fréquence moins élevée.

Pour bien comprendre la différence entre ces deux modes, il est nécessaire de rentrer dans le détail des deux modes de fonctionnement de nos timers. À partir de maintenant, nous raisonnerons avec le timer2, mais il est tout aussi possible d’utiliser d’autres timers.

Fast PWM Mode

On est dans ce mode si les 3 bits WGM2 de 0 à 2 sont égaux à la valeur 3 ou 7 (on écrit alors WGM22:0 = 3 ou 7, et on rappelle ce qui a été dit dans l’article Les Timers (I), WGM signifie Waveform Generation Mode). Ce mode est un mode à simple pente, ce qui signifie que le timer/counter ne fait que s’incrémenter entre la valeur BOTTOM jusqu’à la valeur TOP, puis redémarre depuis BOTTOM, etc.

BOTTOM est égal à 00 et TOP est égal à FF (ou 255) si WGM22:0 = 3 ou OCR2A si WGM22:0 = 7.

L’unité de comparaison génère alors la forme d’onde du signal PWM sur la broche OC2x. Ce signal PWM peut être inversé, comme nous le verrons plus loin. Pour que le signal PWM soit non inversé, il faut que les 2 bits COM2x1:0 soient égaux à la valeur 2 (COMnx signifie Compare Match Output « x » Mode du timer « n »). Dans ce cas, la forme d’onde du signal PWM est générée automatiquement en mettant à 0 le registre OC2x lorsque le timer/counter TCNT2 atteint la valeur OCR2x, et en le positionnant à 1 le registre OC2x lorsque le timer/counter TCNT2 passe de la valeur TOP à BOTTOM. C’est ce que montre la figure 3 ; la petite marque horizontale sur la pente du timer représente le moment où le timer/counter TCNT2 est égal à la valeur du registre OCR2x. Dans la figure, le rapport cyclique de la PWM est changé plusieurs fois par la mise à jour du registre OCR2x.

Figure 3
Figure 3
Diagramme temporel du Fast PWM Mode

Si TOP vaut 255, le timer/counter TCNT2 compte de 0 à 255 puis au coup suivant qui devrait être 256, il se remet à 0 (overflow) ; une période représente 256 opérations de comptage. Ces opérations de comptage se font à la fréquence de l’horloge divisée par la valeur N du prescaler. La fréquence du signal PWM obtenu est donc :

$$ f = \frac{F_{clk}}{N\times 256} $$

Phase Correct PWM Mode

On est dans ce mode si les 3 bits WGM22:0 = 1 ou 5 ; ce mode produit une forme d’onde de PWM à haute résolution, basée sur un mode opératoire à double pente. Le timer/counter TCNT2 compte de façon répétitive depuis BOTTOM jusqu’à TOP puis redescend à BOTTOM. Encore une fois, BOTTOM est égal à 00 et TOP est égal à FF (ou 255) si WGM22:0 = 1 ou OCR2A si WGM22:0 = 5.

Le timer/counter est donc incrémenté depuis BOTTOM jusqu’à ce qu’il atteigne la valeur TOP, puis la direction de comptage est inversée et le timer/counter est décrémenté de TOP jusqu’à BOTTOM. La valeur de TCNT2 est donc égale à TOP pendant un cycle d’horloge.

L’unité de comparaison génère alors la forme d’onde du signal PWM sur la broche OC2x. Ce signal PWM peut également être inversé, comme nous le verrons plus loin. Pour que le signal PWM soit non inversé, il faut que les 2 bits COM2x1:0 soient égaux à la valeur 2. Dans ce cas, la forme d’onde du signal PWM est donc générée en mettant à 0 le registre OC2x lorsque le timer/counter TCNT2 atteint la valeur OCR2x quand il s’incrémente, et en le positionnant à 1 le registre OC2x lorsque le timer/counter TCNT2 atteint la valeur de OCR2x quand il se décrémente. C’est ce que montre la figure 4 ; la petite marque horizontale sur les pentes du timer représente le moment où le timer/counter TCNT2 est égal à la valeur du registre OCR2x. Dans la figure, le rapport cyclique de la PWM est changé plusieurs fois par la mise à jour du registre OCR2x.

Figure 4
Figure 4
Diagramme temporel du Phase Correct PWM Mode

Si TOP vaut 255, le timer/counter TCNT2 compte de 0 à 255 puis décompte jusqu’à 0 ; la période pour faire cela vaut donc 510 cycles d’horloge (2 fois 255). Si Fclk est la fréquence d’horloge et N le facteur de division du prescaler, la fréquence du signal PWM obtenu est donc :

$$ f = \frac{F_{clk}}{N\times 510} $$

Cette fréquence est donc à peu près deux fois moins élevée que dans le mode Fast.

Inversion du signal PWM

Que l’on travaille en mode « Fast » ou en mode « Phase Correct », on peut inverser le signal PWM sur la broche OC2x en faisant en sorte que les 2 bits COM2x1:0 soient égaux à la valeur 3, ou, ce qui revient au même, que les deux bits soient positionnés à 1. Dans le cas du mode « Fast », la forme d’onde du signal PWM est générée automatiquement en positionnant à 1 le registre OC2x lorsque le timer/counter TCNT2 atteint la valeur OCR2x, et en mettant à 0 le registre OC2x lorsque le timer/counter TCNT2 passe de la valeur TOP à BOTTOM, comme le montre la figure 3. Dans le cas du mode « Phase Correct », la forme d’onde du signal PWM est générée automatiquement en positionnant à 1 le registre OC2x lorsque le timer/counter TCNT2 atteint la valeur OCR2x quand il s’incrémente, et en mettant à 0 le registre OC2x lorsque le timer/counter TCNT2 atteint la valeur de OCR2x quand il se décrémente, comme le montre également la figure 4.

Valeurs extrêmes du registre OCR2A

Dans les deux modes, les valeurs extrêmes du registre OCR2A représentent des cas particuliers pour générer le signal PWM. Dans le mode Fast, si OCR2A est égal à BOTTOM, le signal de sortie sera un pic étroit pour chaque cycle d’horloge MAX + 1 du timer et si OCR2A est égal à MAX, la sortie sera constamment à l’état haut ou bas selon le mode de sortie PWM (inversé ou non inversé) réglé par les 2 bits COM2A1:0 . Dans le mode Phase Correct, si OCR2A est égal à BOTTOM, la sortie sera constamment à l’état bas et si OCR2A est égal à MAX, la sortie sera constamment à l’état haut, ceci pour un mode PWM non inversé ; pour un mode PWM inversé, la sortie aura les valeurs logiques opposées. On rappelle que MAX vaut FF (ou 255).

Deux exemples

Nous allons voir comment fabriquer un signal PWM de rapport 50% dans chacun des deux modes, avec le timer2. Peu importe la fréquence, il suffit de régler le prescaler en fonction de ce qu’on veut comme cela a été décrit dans les articles précédents (bits CS22:0 à régler).
Dans le cas du Fast PWM Mode, on veut que notre timer/counter compte de 0 à 255 ; les 3 bits (des registres de contrôle TCCR2A et TCCR2B) WGM22:0 doivent former la valeur 3 (soit 011 en binaire, ce qui règle TOP = 255). On veut récupérer un signal PWM non inversé sur la broche OC2B (la broche 5 du microcontrôleur ATmega328P ou encore la sortie 3 du module Arduino Uno). Les 2 bits (du registre de contrôle TCCR2A) COM2B1:0 doivent former la valeur 2 (soit 10 en binaire) pour que le signal soit non inversé. Pour un rapport de 50%, on charge le registre OCR2B avec la valeur 128.
La figure 5 montre comment le timer2 évolue ; le registre OC2B est mis à 0 quand le timer2 est égal à OCR2B et mis à 1 quand le timer2 est remis à 0.

Figure 5
Figure 5

Le programme suivant est celui de ce premier exemple avec N = 1 : d’après la formule donnée plus haut, la fréquence est de 62,500 kHz.

/* ----------------------------------------------
Exemple 1 de l'article Timers IV
N = 1 pour le prescaler
La PWM de frequence 62500 Hz  
est sur la sortie 3 du module UNO
-------------------------------------------------
*/

void setup(){
  pinMode (3, OUTPUT);
  TCCR2A = 0b00100011;
  TCCR2B = 0b00000001;
  OCR2B = 128;
}

void loop(){
}

La photo 1 montre le signal PWM obtenu sur l’écran d’un oscilloscope.

Photo 1
Photo 1
Le signal de l’exemple 1 analysé par Jean-Luc

Dans le cas du Phase Correct PWM Mode, on veut que le timer2 compte de 0 à 255 et décompte de 255 à 0 ; les 3 bits (des registres de contrôle TCCR2A et TCCR2B) WGM22:0 doivent former la valeur 1 (soit 001 en binaire, ce qui règle TOP = 255). On veut récupérer un signal PWM non inversé sur la broche OC2A (la broche 17 du microcontrôleur ATmega328P ou encore la sortie 11 du module Arduino Uno). Les 2 bits (du registre de contrôle TCCR2A) COM2A1:0 doivent former la valeur 2 (soit 10 en binaire) pour que le signal soit non inversé. Pour un rapport de 50%, on charge le registre OCR2A avec la valeur 128.
La figure 6 montre comment le timer2 évolue ; le registre OC2A est mis à 0 quand le timer2 devient égal à OCR2A en s’incrémentant et le registre OC2A est mis à 1 quand le timer2 devient égal à OCR2A en se décrémentant.

Figure 6
Figure 6

Le programme suivant est celui de ce deuxième exemple avec N = 8 : d’après la formule donnée plus haut, la fréquence est de 3,9216 kHz.

/* ---------------------------------------------
Exemple 2 de l'article Timers IV
N = 8 pour le prescaler
La PWM de frequence 3921,6 Hz
est sur la sortie 11 du module UNO
------------------------------------------------
*/

void setup(){
  pinMode (11, OUTPUT);
  TCCR2A = 0b10000001;
  TCCR2B = 0b00000010;
  OCR2A = 128;
}

void loop(){
}

La photo 2 montre le signal PWM obtenu sur l’écran d’un oscilloscope.

Photo 2
Photo 2
Le signal de l’exemple 2 analysé par Jean-Luc

Il est évident que ces deux exemples ne peuvent pas être obtenus en même temps puisqu’un timer ne peut travailler que dans un seul mode à la fois.

Conclusion

Nous n’avons fait que survoler la génération d’un signal PWM par les timers du microcontrôleur ATmega328P. Encore une fois, le recours à la documentation du constructeur est nécessaire pour bien programmer les timers dans les modes PWM, mais cette programmation au cœur même du microcontrôleur permet de compléter la fonction analogWrite du langage Arduino.
En effet, l’IDE d’Arduino configure les timers avant même d’exécuter la fonction setup. Le timer2 par exemple est initialisé en mode Phase Correct PWM avec un prescaler où N vaut 64, ce qui donne une fréquence de 490 Hz nettement insuffisante pour la bonne santé de nos moteurs de trains miniatures. Quand la fonction analogWrite est appelée, elle agit sur les bits COM2A ou COM2B pour connecter les sorties et obtenir la PWM dessus. Vous savez maintenant comment agir sur les registres de contrôle pour changer la fréquence de vos signaux PWM.

29 Messages

  • Les Timers (IV) 10 avril 2015 13:09

    Article sympa, mais je me pose une question : quelle est la bonne solution pour nos moteurs ? Si je veux faire un contrôleur analogique basé sur un Arduino, puis-je directement utiliser un PWM pour alimenter les rails (via un LMD18200 quand même) , est-ce que je dois lisser la sortie pour avoir un signal plus proche d’une alimentation continue, ou est ce qu’il faut adapter la fréquence du PWM ?

    Répondre

    • Les Timers (IV) 11 avril 2015 09:23, par Jean-Luc

      Bonjour,

      On ne peut pas lisser simplement pour obtenir une tension voulue. Ce n’est pas non plus souhaitable. Le comportement avec une tension continue, notamment les ralentis, n’est pas aussi bon. Il vaut mieux augmenter la fréquence de la PWM à quelques dizaines de kHz. Les raisons sont exposées dans cet article : Tension hachée et pertes par effet Joule.

      Répondre

    • Les Timers (IV) 11 avril 2015 16:16, par Christian Bézanger

      L’article cité par Jean-Luc est aussi celui que j’aurais conseillé de lire, tout comme j’en ai parlé dans l’article du Loco-Revue N°811 février 2015, lorsque j’évoquais la commande des moteurs avec Arduino.
      C’est d’ailleurs cet article qui m’a fait comprendre que la fréquence de la PWM de base d’Arduino n’était pas assez élevée. Voici ici une méthode pour changer cette fréquence.

      Répondre

  • Les Timers (IV) 22 juin 2015 08:17, par stephd

    Bonjour,
    Je viens de parcourir les 4 sujets sur les timers. Je n’ai pas tout compris mais presque ;). En tout merci car j’ai pu découvrir des choses intéressantes.
    Je suis arrivé sur ces sujets car je cherches modifier la vitesse de lecture d’un fichier wave (dans un SD). et je pense que c’est via les timers qu’on peut arriver a moduler la vitesse de lecture.
    Mais voila je n’arrive pas a trouver la solution malgré des tentatives, je ne doit surement pas agir sur les bons timers.
    Auriez vous la possibilité de m’éclairer, voir de créer un tuto spécifique, cela peut avoir un intérêt pour tout ce qui est reproduction d’un son moteur diesel et simuler accélération a partir d’un échantillon de .wav. (ce que je cherches à faire ;) )
    Merci d’avance,
    Stephd

    Répondre

    • Les Timers (IV) 22 juin 2015 10:15, par Christian Bézanger

      Bonjour,
      Je ne sais pas si je vais pouvoir vous aider car je ne suis pas un spécialiste de la lecture des fichiers .wav ou .mp3 ; il est vrai que ceci présente un grand intérêt pour la sonorisation des réseaux. Je voulais essayer à partir d’une carte shield MP3 Player de chez Sparkfun ou bien à partir du Wave Shield d’Adafruit, mais comme tout le monde, le temps me manque !
      La première question est donc à partir de quelle configuration essayez-vous de lire vos fichiers audio ? Avez-vous cherché sur des forums des compléments de documentation pour savoir quel timer la carte utilise ? Je pense qu’il faut chercher dans cette voie car ce que vous voulez faire a peut-être déjà été tenté (et résolu) par d’autres dans un domaine hors modélisme.
      La deuxième question est pourquoi voulez-vous changer la fréquence de lecture ; un fichier wav correspond à une fréquence d’échantillonnage qui découle du théorème de Shannon. Il doit donc être relu de la même façon qu’il a été encodé ou bien il y aura une distorsion du signal sonore.
      Il faut également prendre en compte la résolution des convertisseurs analogique/numérique lié au shield.
      Christian Tavernier, dans son livre Arduino, applications avancées, traite des problèmes de lecture des fichiers audio (wav et MP3). Ce livre se trouve facilement et pourrait sans doute vous aider à trouver une solution à ce que vous voulez faire. Et peut-être que d’autres Arduineurs sauront vous aider mieux que moi...
      Bien cordialement.

      Christian

      Répondre

      • Les Timers (IV) 22 juin 2015 16:17, par stephd

        Alors je ne m’intéresse pas au shield, car je ne trouve pas la possibilité justement de jouer plus ou moins vite les wav.
        Ils n’ont souvent que les fonctions de base.
        Coté Adafruit ils ont des cartes qui savent le faire mais beaucoup trop grosses et trop complète pour mon utilisation finale. Et un prix qui se rapproche de ce qu’on trouve en modélisme spécialisé, plus d’intérêt. Mon idée serait de passer par un arduino nano ou pro mini... très faible encombrement.

        Coté montage d’autres Arduinautes ? je cherche mais je ne trouve pas cette fonction précisément pour le moment. c’est en questionnant sur les timers que je suis arrivés ici et que je vois des similitudes.

        Et pour ce qui est de modifier la fréquence, je pars sur cette idée pour justement espéré pouvoir accélérer la lecture d’un Wav, afin de simuler l’accélération d’un échantillon de bruit de diesel de mon choix (enregistré). Pour ce qui est du rendu, on verra quand je serai arrivé à accélérer ;).

        Répondre

        • Les Timers (IV) 24 juin 2015 11:41, par Christian Bézanger

          La solution me paraissait plus simple de partir d’un shield et d’agir sur sa façon d’opérer pour obtenir ce qu’on souhaite.
          Comme vous n’utilisez pas de shield, la lecture du fichier dans une carte SD doit être écrite en suivant un certain protocole et l’interfaçage de la carte SD avec Arduino doit aussi être réalisée.
          Je ne sais pas à quel niveau vous en êtes, mais je pense que ce projet dépasse mes connaissances actuelles. De plus, cet endroit (question-réponse pour l’article) n’est pas le mieux adapté, il vaudrait mieux ouvrir un fil sur le forum pour trouver les compétences capables de vous aider.
          Je vous souhaite bonne chance pour arriver au bout de votre projet, tout en étant désolé de ne pas pouvoir mieux vous aider.

          Christian

          Répondre

  • Les Timers (IV) 29 octobre 2015 10:33, par Maxime Crichton

    Bonjour,

    Je me suis intéressé à vos articles sur les timers et les PWM, merci pour votre travail, il est précieux :).

    Pas contre, je ne suis pas arrivé à ce que je souhaitais faire. Dans le cadre d’un projet, je dois générer une PWM de rapport cyclique de 50 % et de fréquence de 600KHz.

    Dans votre article "Les Timers (I)" vous montrez que l’horloge du timer2 viens du 16MHz, mais quand je ne met aucune prédivision, ou une faible prédivision, j’arrive à un maximun de 10 KHz de fréquence.

    Est-ce que quelque chose m’a échappé ou alors il n’est pas possible d’aller plus haut que 10 KHz de cette manière ?

    Cordialement,
    Maxime Crichton

    Répondre

    • Les Timers (IV) 31 octobre 2015 10:39, par Christian Bézanger

      Bonjour Maxime,

      Je n’ai pas beaucoup d’informations sur votre façon d’opérer. Néanmoins, le premier exemple de programme donné génère une PWM de 62,5 kHz sur la sortie 3 du module Uno, preuve qu’on peut donc obtenir une PWM supérieure à 10 kHz.

      Sachant que le secret d’utilisation des timers est une bonne maitrise des registres de contrôle, il est important que je puisse constater que vous n’avez pas oublié de bien les régler.

      Le mieux serait de m’envoyer l’extrait de votre programme qui initialise les registres (la fonction setup par exemple). Voici mon mail :

      christian.bezanger@gmail.com

      Cordialement.

      Christian

      Répondre

  • Les Timers (IV) 19 juin 2017 16:47, par Maxime

    Bonjour,

    Je suis loin d’etre un spécialiste sur la programmation arduino. Je me suis procuré un arduino Uni afin de controler un moteur à l’aide de la fonction PWM. Malheureusement Mon ESC fonctionne sur une plage de fréquence située entre 8 et 16 kHZ. Seulement les diviseurs 8, 161 32 ect ne me permettent au maximum que d’obtenir des fréquence de 7.8 kHz. Avez vous une idée me permettant d’obtenir une fréquence pour mon PWM entre les valeurs qui m’intéresse.
    En vous remerciant d’avance,

    Maxime GIGLEUX

    Répondre

    • Les Timers (IV) 19 juin 2017 18:19, par Jean-Luc

      Bonsoir.

      Si vous parlez d’ESC, c’est qu’il s’agit d’un contrôleur de moteur pour radiocommande. Je pense que la plage de fréquences que vous citez concerne la PWM générée par l’ESC, pas la façon dont on le commande. Ce type de dispositif se commande comme un servomoteur. Il faudrait donc que vous alliez voir plutôt du côté de la bibliothèque Servo.

      Mais je peux me tromper.

      Répondre

  • Les Timers (IV) 20 juin 2017 14:30, par Maxime

    Bonjour,
    Merci pour votre réponse.
    ALors je ne suis pas certain. En faite l’ECS me permet de commander mon moteur bruschless. C’est à dire que lui va me faire le lien entre ma PWM et mon moteur afin qu’il puisse grâce aux capteurs ect déterminer la position du rotor par rapport au stator et ainsi alimenter le bon bobinage.
    Seulement voila la PWM doit être dans un certain intervalle de fréquence ( a savoir que la fréquence restera fixée bien sur) et si j’en crois les caractéristiques cet intervalle serait entre 8 et 16 Khz. et donc en utilisant la méthode de la division par 8 je suis a 7.8 Khz et donc je ne suis pas dans l’intervalle encore.
    Il me faudrait 10 ou meme 15 kHz tant qu’il se trouve dans l’intervalle. N’étant pas le roi de la programmation je voulais utiliser la bibliothèque "Frequency" proposée par Arduino mais cela ne devrait pas suffir. Alors je suis un peu bloqué.

    Répondre

    • Les Timers (IV) 21 juin 2017 11:24, par Dominique

      Bonjour,

      J’ai aussi des moteurs brushless avec des ESC pour la radiocommande. Ils se pilotent comme des servos.
      Avez-vous utilisé la bibliothèque servo ?

      Répondre

      • Les Timers (IV) 21 juin 2017 21:52, par Maxime

        Bonjour,
        Désolé pour ce retard. Alors je vais vous mettre le code me permettant de générer la PWM

        void setup() {
        
        Serial.begin(9600);                       // initialisation de la connexion avec le PC valeur = analogRead(A0);            
        }
        
        void loop() 
        {
        int valeur = 0;
        valeur = analogRead(A0);                // on lit la valeur analogique stockée sur la broche 
        valeur = map(valeur,0,1023,0,255);                // établissement d'une échelle 
        analogWrite(3,valeur);                        // écrit la valeur analogique sous une forme PWM 
        Serial.println(valeur);                // on affiche la valeur sur l'afficheur PC
        
        }

        Voici

        Répondre

        • Les Timers (IV) 23 juin 2017 10:13, par Christian

          Bonjour,

          Je ne suis pas familiarisé avec l’emploi d’ESC comme on les utilise en radiocommande et je ne vois pas bien leur utilité en modélisme ferroviaire puisqu’on régule la vitesse des trains d’une autre manière (PWM amplifié ou DCC).
          J’ai tout de même trouvé ce lien qui m’en a dit un peu plus :
          http://arduino.blaisepascal.fr/inde...
          Peut-être qu’il vous sera utile.

          Comme mes collègues Jean-Luc et Dominique, je pense que l’ESC peut s’utiliser comme un servomoteur et dans ce cas, la réponse à votre problème pourrait se trouver dans la bibliothèque Servo d’Arduino.

          Le code que vous publiez me semble correct mais il va générer une PWM de fréquence 490 Hz seulement, ce qui est donc insuffisant selon vous. Si on se réfère à mon article, vous pouvez obtenir une PWM de fréquence plus forte, mais hélas non située dans l’intervalle qui vous intéresse. En effet, la fréquence que vous pouvez obtenir est de 7812,5 Hz en prenant un prescaler N = 8 et en vous inspirant du premier exemple. C’est très proche de la borne inférieure de l’intervalle mais pas dedans. Hélas, il n’y a pas d’autres possibilités selon les exemples que j’ai donnés ce qui prouve qu’on est toujours limité par les possibilités physiques d’un microcontrôleur. Si on avait pu prendre un N = 4, on aurait eu une fréquence double, mais ce n’est pas prévu par l’électronique du microcontrôleur.

          Une autre possibilité serait d’utiliser le timer en mode CTC au lieu des modes décrits dans cet article, mais cela vous oblige à étudier de très près la datasheet du composant Atmel ATmega328P, microcontrôleur qui équipe les modules UNO.

          J’espère que cette réponse vous permettra d’avancer un peu dans votre projet. Bien cordialement.

          Répondre

          • Les Timers (IV) 29 juin 2017 11:08, par Martin

            Pour créer une PWM de fréquence comprise dans votre intervalle, en plus de jouer sur le prescale , vous pouvez également ajuster la valeur TOP ou BOTTOM. Ceci vous permettra dans le mode CTC de réduire la largeur pendant laquelle le timer compte et donc sur le signal de sortie vous pourrez augmenter la fréquence

            Répondre

            • Les Timers (IV) 29 juin 2017 21:01, par Maxime

              Tout d’abord merci pour votre réponse. Les choses sont encore un peu flous pour moi. J’ai bien sur l’article très bien fait sur le CTC. Mais dans celui ci, il n’est pas précisé comment faire varier la valeur de TOP ou de Bottom de comptage du timer. Ai je bien compris. La, il compte de 0 à 255 et l’idée serait de le faire compter de 50 à 255 par exemple.
              Merci pour votre aide

              Répondre

        • Les Timers (IV) 2 mars 2019 11:43, par Amine

          Bonjour, svp, est ce que je peux enregistrer un fichier.wav en utilisant Arduino Uno et un simple microphone ky-038 ou max9814 ... ?? si oui , pouvez vous me donner vers un exemple. merci Monsieur.

          Répondre

          • Les Timers (IV) 2 mars 2019 11:52, par Christian

            Bonjour Amine,

            J’ai du mal à comprendre ce que cette question fait au milieu d’un article qui concerne les Timers et le mieux serait sans doute d’ouvrir un fil sur notre forum pour poser cette question dans l’espoir de trouver quelques personnes ayant l’expérience du problème.
            Pour ma part, je n’ai jamais essayé d’enregistrer un fichier son avec une carte Arduino car je n’en vois pas l’intérêt pour le modélisme ferroviaire (et ici, on ne fait que cela). Par contre, certains de nos articles expliquent comment lire (et non enregistrer) de tels fichiers sur une carte SD pour reproduire un environnement sonore sur un réseau.
            J’espère qu’il vous sera possible de trouver de l’aide grâce au forum.
            Bien cordialement.

            Christian

            Répondre

  • Les Timers (IV) 27 juin 2017 10:54, par Maxime

    Bonjour,

    Excusez moi pour le délai de réponse. Je vous remercie pour votre réponse complète, je vais essayer de regarder de plus pret au niveau des timers en essayant de ne faire aucune erreur car une mauvaise manipulation au niveau des fréquences de communication et plus rien.

    J’essaierai de vous tenir au courant de mes avancées afin qu’une réponse puisse être donnée de manière précise aux prochaines personnes rencontrant ce problème.

    Bien cordialement,

    Répondre

  • Les Timers (IV) 28 avril 2019 18:52, par florent

    Bonjour,
    je dois utiliser un timer pour contrôler 2 servomoteur branchées sur les pwm avec un joystick. Quel timer dois-je utiliser ?

    Répondre

    • Les Timers (IV) 30 avril 2019 11:30, par Christian

      Bonjour florent,

      N’importe quel timer peut être utilisé, donc pourquoi ne pas utiliser le timer2 et s’inspirer des exemples de programmes donnés dans cette série d’articles ? Cela devrait vous faciliter la tâche pour programmer.

      Pour plus d’aide, n’hésitez pas à ouvrir un fil sur le forum en décrivant bien votre projet (dont nous ne savons pas grand chose ici).

      Cordialement.

      Christian

      Répondre

  • Les Timers (IV) 19 décembre 2019 16:44, par Aurélien

    Bonjour, auriez vous des exemples d’intérêts très concrets du TC 1 ?
    Merci !

    Répondre

  • Les Timers (IV) 29 septembre 2020 21:13, par Laurent ROEKENS

    Bonsoir

    Voici un petit lien qui précise les différentes valeurs de bits (dont celle des prescaler pour ajuster nos fréquences) pour nos ARDUINO et dérivés

    https://arduinoinfo.mywikis.net/wik...

    Laurent

    Voir en ligne : Timers 0 1 et 2 et PWM pour ARDUINO : les differentes configurations

    Répondre

    • Les Timers (IV) 30 septembre 2020 12:24, par Christian

      Merci Laurent pour ce lien qui sera très utile à ceux qui veulent changer la fréquence de leur PWM via la fonction analogWrite().
      Je recommande tout de même de bien essayer de comprendre l’article car il y a plusieurs façons de générer de la PWM et il serait dommage de passer à côté. Et bien évidemment, la lecture de la datasheet du microcontrôleur est un complément indispensable dès qu’on veut se lancer dans un projet un peu particulier. Tout cela représente du travail, mais c’est payant.

      Répondre

  • Les Timers (IV) 4 décembre 2020 05:21, par nabil

    Bonjour, merci vos explications tres claire et completes
    Par contre je ne comprend pas bien un point essentiel : pour générer un signal pwm a largeur d’impulsion variable il faut apres chaque passage de seuil TCNTx > OCRx (et OCRx > TCNTx) renouveller la valeur de OCRx. Mais dans ce cas je ne vois pas l’utilité du mode PWM puisque tout cela peut tres bien etre effectué en mode CTC.

    Répondre

    • Les Timers (IV) 4 décembre 2020 19:11, par Christian

      Oui, vous pouvez le faire aussi en mode CTC mais dans ce cas, vous avez besoin d’une ISR (voyez les programmes donnés dans l’article 3) qui, en s’exécutant, peut perturber le déroulement de votre programme (au niveau du timing).
      Avec les modes de génération de PWM, il n’y a aucune ISR, simplement parce que le micro fait le travail grâce à sa partie matérielle (le bloc Waveform Generation).
      Il est toujours plus intéressant, pour accomplir une tâche, de la confier à une unité spécialisée, c’est-à-dire une partie du microcontrôleur qui ne fait que cette tâche. Pour la PWM, le micro ATmega328P a six canaux possibles, alors le conseil que je donne est de les utiliser tant qu’il ne s’agit que de générer de la PWM sur les broches prévues à cet effet.

      Répondre

Réagissez à « Les Timers (IV) »

Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.

Lien hypertexte

(Si votre message se réfère à un article publié sur le Web, ou à une page fournissant plus d’informations, vous pouvez indiquer ci-après le titre de la page et son adresse.)

Rubrique « Programmation »

Les derniers articles

Les articles les plus lus