LOCODUINO

Les Timers (IV)

La génération des PWM

. Par : Christian

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 (…)

Retourner à l'article

Vous répondez à :

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.

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

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

Rubrique Programmation

Les derniers articles

Les articles les plus lus