MicroPython: PWM en basse fréquence

Bonjour à tous,

Le signal PWM permet de réaliser de nombreuses choses très utiles comme contrôler la vitesse d'un moteur continu, la luminosité d'une LED, créer des notes de musiques, commander contrôler des périphériques qui reçoivent une consigne PWM. Bref un incontournable de la programmation/apprentissage microcontrôleur.

Fréquence PWM

Le signal PWM est généré sur une fréquence porteuse de 500 Hz (standard Arduino). Il est bien entendu possible d'avoir une fréquence plus faible mais la tendance est généralement à avoir une fréquence supérieure.

Ce qu'il y a de bien, avec le signal PWM, c'est qu'il est autonome! On le configure et le signal est généré en tâche de fond.

Sur cette fréquence de base, il est possible de définir un cycle utile de 0 à 100% (de 0 a 255 sur Arduino, de 0 a 65535 sur Pyboard).

 

Avec une fréquence de 500 Hz, l'impulsion se répète 500 fois par seconde (donc toutes les 2 ms).

PWM standard non applicable!

Il existe cependant des situations où l'on voudrait faire du PWM (parce que c'est facile, c'est autonome) mais que l'on ne peut pas envisager à cause de la fréquence PWM.

Voici, par exemple, le projet Plancha-CMS dont la chauffe est commandée par un relais statique (SSR). 

La plancha-cms

Compte tenu de l'inertie thermique de la semelle, un cycle de chauffe divisé en période de 1 à 2 secondes est donc parfait.

Et il n'est pas question d'utiliser une fréquence PWM de 500 Hz pour commander un relais SSR (ou n'importe quel autre relais, ou contacteur).

L'idéal serait d'utiliser une fréquence PWM de 0.5 Hertz (donc une période de 2 sec) mais rare sont les microcontrôleurs capable de descendre aussi bas en fréquence.

Pas de PWM à 0.5 Hz! Quelle solution?

Hé bien, il y a principalement trois solutions:

1) Contrôler la mise en marche/arrêt du relais SSR dans le programme principale. 

2) Utiliser le multi-threading (si possible) pour avoir un thread pour générer un pseudo PWM pour le cycle de chauffe.

3) Utiliser un Timer périodique pour générer un pseudo PWM pour le cycle de chauffe.  

Pro/Cons

Option1: Le script principal ne peut absolument pas planter... au risque de laisser l'élément de chauffe sous tension sans s'en rendre compte... ce qui serait dangereux.

Option 2: Le support multi-thread n'est pas possible sur tous les microcontrôleurs (ex: possible sur l'ESP32, Pico).  

Option 3: Le support des Timerq périodiques est disponible sur tous les microcontrôleurs. Ce qui permet d'avoir un code facilement "portable" d'un microcontrôleurs à l'autre. Certains disposent de plusieurs Timers (comme Pyboard), d'autres comme le Pico dispose d'un seul Timer.

C'est l'option 3 qui a été retenue pour le développement de "Low Frequency PWM".

Bibliothèque lfpwm

La bibliothèque lfpwm.py (Low Frequency PWM) et la classe LowFreqPWM permettent de descendre très bas en fréquence sans pour autant faire une croix sur les bienfaits d'un signal PWM autonome.

L'exemple suivant créer un signal PWM autonome d'une période de 2.5 sec (freq = 0.4 Hertz).
Le cycle utile est fixé à 50%, soit la moitié de la valeur maximal supportée par ma méthode duty_u16() .

from lfpwm import LowFreqPWM
from machine import Pin

# LED utilisateur sur Pico
led = Pin( 25 )

# definition pwm
pwm = LowFreqPWM( pin=led, period=2.5 ) # 2.5s

pwm.duty_u16( 65535 / 2 ) # 50% de cycle utile
# pwm.duty_u16( 0 )     # Eteindre
# pwm.duty_u16( 65535 ) # Allumé
# pwm.deinit() # Desactiver le timer

Comme la génération du signal est totalement autonome, le script principal pourra continuer d'acquérir la température et d'exécuter un nouveau cycle de régulation PID pendant que le Timer continue de s'occuper du signal PWM.


La bibliothèque lfpwm prend aussi en charge la gestion du temps d'activation (ton_ms) et désactivation (toff_ms) du périphérique commandé (relais SSR)... parce que l'on peut pas activer/désactiver un périphérique trop vite.

Il y a donc quelques règles complémentaires de gestion du signal PWM et un exemple complémentaires test_ton.py a découvrir dans le dépôt.

Ressource

MCHobby investit du temps et de l'argent dans la réalisation de traduction et/ou documentation. C'est un travail long et fastidieux réalisé dans l'esprit Open-Source... donc gratuit et librement accessible. 

SI vous aimez nos traductions et documentations ALORS aidez nous à en produire plus en achetant vos produits chez MCHobby.

Aucun commentaire