Différences entre versions de « P2E-PWM-Output-FR »

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche
Ligne 113 : Ligne 113 :
 
== Truc et astuce ==
 
== Truc et astuce ==
 
=== Fixer la fréquence ===
 
=== Fixer la fréquence ===
Il est impératif de fixer la fréquence pour débuter la génération d'un signal PWM avec la méthode {{fname|PWM.freq( frequency )}}.<br />Sans cette information, aucun signal ne sera généré sur la sortie.
+
Il est impératif de fixer la fréquence pour débuter la génération d'un signal PWM avec la méthode {{fname|PWM.freq( frequency )}}. Cette méthode est pratique pour modifier la fréquence.<br />Sans cette information, aucun signal ne sera généré sur la sortie.
  
Il est possible de déterminer la durée de la période en effectuant le calcul periode(sec) = 1/frequence(hertz). Ainsi pour une fréquence de 500 Hertz, la période est de 1/500=0.002 sec, soit 2 millisecondes ou encore 2000000 nanosecondes (2e6 nanosecondes).
+
A noter qu'il est possible d'initialiser la fréquence et le cycle utile en précisant les paramètres {{fname|freq}} et {{fname|duty_u16}} durant la création d'une instance {{fname|pwm}}
 +
 
 +
pwm = PWM(pin, freq, duty_u16)
 +
 
 +
Il est possible de calculer la '''durée de la période''' en effectuant le calcul periode(sec) = 1/frequence(hertz). Ainsi pour une fréquence de 500 Hertz, la période est de 1/500=0.002 sec, soit 2 millisecondes ou encore 2000000 nanosecondes (2e6 nanosecondes).
  
 
=== Cycle utile ===
 
=== Cycle utile ===

Version du 2 novembre 2024 à 16:46

Introduction

Le signal PWM est un signal particulier permettant de moduler la puissance de sortie en activant/désactivant régulièrement la broche de sorte que cela permet de moduler la puissance moyenne de sortie.

Si les alternances allumé/éteint se produisent très rapidement alors ces alternances seront à peine notables (d'un point de vue humain). Il est courant d'utiliser une fréquence d'alternance de 50 Hertz à 500 Hertz ou plus. A 500 Hertz, le signal change 500 fois par secondes... ou disons qu'il se répète tous les 1/500ième de seconde (donc une période de 2 millisecondes).

Ensuite, l'utilisation d'un signal carré n'implique pas forcement un signal avec 50% d'état HAUT et 50% d'état BAS. Il est tout à fait possible d'envisager 10% d'état HAUT + 90% d'état BAS ou encore 70% d'état HAUT + 30% d'état BAS! Ce qui vient d'être décrit n'est rien d'autre que le cycle utile (Duty Cycle en anglais) et c'est ce qui permet de moduler la puissance de sortie.

L'image ci-dessous présente un signal PWM avec cycle utile de 25% (1/4 de la période) ainsi que la tension moyenne Vavg correspondante.

ENG-CANSAT-FEATHER-PICO-pwm-01.png

La tension moyenne (puissance moyenne) du signal PWM dépend du cycle utile: Vavg = 3.3V * Th / T ou encore Vavg = 3.3V * duty_percent / 100

ENG-CANSAT-FEATHER-PICO-pwm-02.png

Evidement, un cycle utile de 0% est équivalent à un signal BAS tandis qu'un cycle utile à 100% correspond à un signal HAUT.

Usages

les signaux PWM sont utilisés dans de très nombreux cas. Il est parfois nécessaire de passer l'intermédiaire d'un dispositif amplificateur pour contrôler des périphériques plus puissants:

  • Contrôle de luminosité (ex: LED)
  • Contrôle de vitesse (ex: d'un moteur, ventilateur, pompe)
  • Contrôle de servo-moteur (signal PWM particulier)
  • Production de son/beep
  • reproduction de contenu audio (faible qualité, procédé très technique complexe).

Cas pratique

La luminosité d'une LED dépend du courant qui la traverse. En modifiant la résistance, il est possible d'altérer sensiblement la luminosité de la LED mais impossible de contrôler la luminosité de 0 à 100%.

Par contre, en utilisant un signal PWM, il est possible d'altérer la luminosité d'une LED de 0 à 100% en modifiant le cycle utile de 0 à 100%. De la sorte, cette LED sera allumée d'une fraction du temps, plus ou moins longue, en fonction du pourcentage de cycle utile. La rémanence de l'oeil effectuera une sorte de moyenne du flux lumineux. En effet, avec une fréquence PWM de 500 Hz, l'oeil n'a absolument pas l'occasion de se rendre compte que, dans les faits, cette LED clignote!

L'exemple ci-dessous se propose de tester la génération d'un signal PWM pour contrôler la luminosité d'une LED.

Branchement simplifié

Dans cet exemple, nous allons brancher un potentiomètre sur l'entrée analogique A0 (GP26) pour contrôler la luminosité d'une LED branchée sur GP2 avec un signal PWM.

Si vous n'êtes pas encore familiarisé avec l'utilisation des entrées analogiques alors vous pouvez consulter le tutoriel sur les entrées analogiques.

P2E-PWM-LED.png

Code

Le code ci-dessous peut être saisi dans une session REPL ou dans Thonny IDE.

Cet exemple est également disponible dans le dépôt pwm-led.py .

 1 from machine import Pin, ADC, PWM
 2 import time
 3 
 4 # Désactive PowerSafe (lower ripple)
 5 Pin( 23, Pin.OUT, value=True )
 6 
 7 a0 = ADC( Pin( Pin.board.GP26 ) )
 8 led = PWM( Pin( Pin.board.GP2 ) )
 9 led.freq( 500 )
10 while True:
11     val = a0.read_u16()
12     led.duty_u16( val )
13     print( 'adc=duty_u16= %5i' % (val) )
14     time.sleep_ms( 100 )

Il ne reste plus qu'à tourner le potentiomètre pour modifier la luminosité de la LED.

Voici quelques explications:

  • Ligne 1: import de la classe PWM permettant de contrôler une broche en modulation de largeur d'impulsion.
  • Ligne 8: création de led, instance de la classe PWM permettant de contrôler la broche GP2 avec un signal PWM.
  • Ligne 9: Fixer la fréquence du signal PWM à 500 Hz (comme Arduino). Le signal se répète donc 500 fois par seconde.
  • Lignes 10 à 14: boucle infinie faisant l'acquisition de la valeur sur le convertisseur ADC puis fixant le cycle utile du signal PWM.
  • Ligne 11: acquisition de la valeur du convertisseur. Retourne un entier 16 bits entre 0 et 65535.
  • Ligne 12: fixe le cycle utile à partir d'un entier 16 bits (0..65535 => pour cycle utile de de 0 à 100%).

Un problème?

La luminosité de la LED ne varie pas lorsque le potentiomètre est tourné ?

  1. Est ce que la valeur affichée dans REPL varie lorsque le potentiomètre est tourné ?
    1. OUI: vérifier le raccordement entre le GP2 et la LED
    2. NON: vérifier le raccordement entre le GP26 et le potentiomètre
  2. La luminosité change par ac-coup ? Cela peut être provoqué par la pause de 1/10 de seconde à chaque tour de boucle. Diminuer le délai à 20 millisecondes augmente la réactivité du script.
  3. La LED scintille ?!?! cela peut être provoqué par un contact électrique imparfait... vérifier les divers branchement sur les connecteurs.

Le défi

Dessiner les composants et raccordements de l'exemple sur le breadboard.

Les informations des tutoriels sur l' entrée analogique et la sortie numérique seront utiles en cas de besoin.

Encore plus

Ce wiki contient d'autres exemples autour du signal PWM.

Buzzer

Tlogo-p2e-pwm.png

Créer du son et de la musique avec un signal PWM

Servo-Moteur

Tlogo-p2e-servo.png

Comment contrôler un Servo-moteur

 

Truc et astuce

Fixer la fréquence

Il est impératif de fixer la fréquence pour débuter la génération d'un signal PWM avec la méthode PWM.freq( frequency ). Cette méthode est pratique pour modifier la fréquence.
Sans cette information, aucun signal ne sera généré sur la sortie.

A noter qu'il est possible d'initialiser la fréquence et le cycle utile en précisant les paramètres freq et duty_u16 durant la création d'une instance pwm

pwm = PWM(pin, freq, duty_u16)

Il est possible de calculer la durée de la période en effectuant le calcul periode(sec) = 1/frequence(hertz). Ainsi pour une fréquence de 500 Hertz, la période est de 1/500=0.002 sec, soit 2 millisecondes ou encore 2000000 nanosecondes (2e6 nanosecondes).

Cycle utile

Le cycle utile peut être fixé à l'aide de la méthode PWM.duty_u16( valeur ) où la valeur varie de 0 à 65535 pour un cycle utile de 0% à 100%.

Le cycle utile peut également être fixé en nanosecondes à l'aide de la méthode PWM.duty_ns( temps_ns ) où la durée du cycle utile s'exprime en nanoseconde (de 0 à 1e9/freq ns).

Désactivé PWM

Il est parfois nécessaire d'interrompre le générateur PWM. Cela peut être obtenu en fixant le cycle utile à 0.

Il est aussi possible d'utiliser la méthode PWM.deinit() pour la désactivation et PWM.init(freq, duty_ns) pour une ultérieure réactivation (si cela était nécessaire).


Modèle:P2E-TRAILER