- Qu'est-ce que PWM (Pulse with Modulation)?
- PWM dans STM32
- Composants requis
- Détails de la broche de STM32
- Schéma de circuit et connexions
- Programmation STM32
Dans l'article précédent, nous avons vu la conversion ADC en utilisant STM32. Dans ce tutoriel, nous allons en apprendre davantage sur PWM (Pulse Width Modulation) dans STM32 et comment pouvons-nous contrôler la luminosité de la LED ou la vitesse du ventilateur CC à l'aide de la technique PWM.
Nous savons qu'il existe deux types de signal: analogique et numérique. Les signaux analogiques ont des tensions comme (3V, 1V… etc) et les signaux numériques ont (1 'et 0). Les sorties des capteurs sont des signaux analogiques et ces signaux analogiques sont convertis en numérique en utilisant ADC, car les microcontrôleurs ne comprennent que le numérique. Après avoir traité ces valeurs ADC, la sortie doit à nouveau être convertie en forme analogique pour piloter les périphériques analogiques. Pour cela, nous utilisons certaines méthodes comme les convertisseurs PWM, numérique-analogique (DAC), etc.
Qu'est-ce que PWM (Pulse with Modulation)?
PWM est un moyen de contrôler les appareils analogiques en utilisant une valeur numérique comme le contrôle de la vitesse du moteur, la luminosité d'une LED, etc. Nous savons que le moteur et la LED fonctionnent sur un signal analogique. Mais le PWM ne fournit pas de sortie analogique pure, PWM ressemble à un signal analogique fait par de courtes impulsions, qui est fourni par rapport cyclique.
Cycle de service du PWM
Le pourcentage de temps pendant lequel le signal PWM reste HAUT (temps d'activation) est appelé comme facteur de marche. Si le signal est toujours activé, il est en cycle de service de 100% et s'il est toujours désactivé, il est en cycle de service de 0%.
Cycle de service = temps d'activation / (temps d'activation + temps d'arrêt)
PWM dans STM32
STM32F103C8 a 15 broches PWM et 10 broches ADC. Il y a 7 minuteries et chaque sortie PWM est fournie par un canal connecté à 4 minuteries. Il a une résolution PWM de 16 bits (2 16), c'est-à-dire que les compteurs et les variables peuvent atteindre 65535. Avec une fréquence d'horloge de 72 MHz, une sortie PWM peut avoir une période maximale d'environ une milliseconde.
- Ainsi, la valeur de 65535 donne la PLEINE LUMINOSITÉ de la LED ET LA PLEINE VITESSE du ventilateur CC (cycle de service de 100%)
- De même, la valeur de 32767 donne la MOITIÉ DE LUMINOSITÉ de la LED ET LA DEMI-VITESSE du ventilateur CC (cycle de service de 50%)
- Et la valeur de 13107 donne (20%) LUMINOSITÉ ET (20%) VITESSE (20% de cycle de service)
Dans ce tutoriel, nous utilisons le potentiomètre et le STM32 pour faire varier la luminosité de la LED et la vitesse d'un ventilateur DC par technique PWM. Un écran LCD 16x2 est utilisé pour afficher la valeur ADC (0-4095) et la variable modifiée (valeur PWM) qui est sortie (0-65535).
Voici quelques exemples de PWM avec d'autres microcontrôleurs:
- Génération de PWM à l'aide du microcontrôleur PIC avec MPLAB et XC8
- Commande de servomoteur avec Raspberry Pi
- Gradateur LED basé sur Arduino utilisant PWM
- Modulation de largeur d'impulsion (PWM) à l'aide du MSP430G2
Vérifiez tous les projets liés au PWM ici.
Composants requis
- STM32F103C8
- Ventilateur DC
- CI pilote de moteur ULN2003
- LED (ROUGE)
- Écran LCD (16x2)
- Potentiomètre
- Planche à pain
- Batterie 9V
- Fils de cavalier
Ventilateur CC: Le ventilateur CC utilisé ici est un ventilateur BLDC d'un ancien PC.Il nécessite une alimentation externe, nous utilisons donc une batterie 9V CC.
CI pilote de moteur ULN2003: Il est utilisé pour entraîner le moteur dans une direction car le moteur est unidirectionnel et une alimentation externe est également nécessaire pour le ventilateur. En savoir plus sur le circuit de commande de moteur basé sur ULN2003 ici. Vous trouverez ci-dessous le diagramme d'image de l'ULN2003:
Les broches (IN1 à IN7) sont des broches d'entrée et (OUT 1 à OUT 7) sont des broches de sortie correspondantes. COM reçoit une tension de source positive requise pour les périphériques de sortie.
LED: une LED de couleur ROUGE est utilisée et émet une lumière ROUGE. Toutes les couleurs peuvent être utilisées.
Potentiomètres: Deux potentiomètres sont utilisés, l'un pour le diviseur de tension pour l'entrée analogique vers ADC et un autre pour contrôler la luminosité de la LED.
Détails de la broche de STM32
Comme nous pouvons le voir, les broches PWM sont indiquées au format wave (~), il y en a 15, les broches ADC sont représentées en vert, 10 broches ADC sont là qui sont utilisées pour les entrées analogiques.
Schéma de circuit et connexions
Les connexions du STM32 avec divers composants sont expliquées ci-dessous:
STM32 avec entrée analogique (ADC)
Le potentiomètre présent sur le côté gauche du circuit est utilisé comme régulateur de tension qui régule la tension de la broche 3.3V. La sortie du potentiomètre, c'est-à-dire la broche centrale du potentiomètre, est connectée à la broche ADC (PA4) du STM32.
STM32 avec LED
La broche de sortie STM32 PWM (PA9) est connectée à la broche positive de la LED via une résistance série et un condensateur.
LED avec résistance et condensateur
Une résistance en série et un condensateur en parallèle sont connectés avec une LED pour générer une onde analogique correcte à partir de la sortie PWM car la sortie analogique n'est pas pure à partir de lorsqu'elle est générée directement à partir de la broche PWM.
STM32 avec ULN2003 et ULN2003 avec ventilateur
La broche de sortie STM32 PWM (PA8) est connectée à la broche d'entrée (IN1) du CI ULN2003 et la broche de sortie correspondante (OUT1) de l'ULN2003 est connectée au fil négatif du VENTILATEUR CC.
La broche positive du ventilateur CC est connectée à la broche COM du CI ULN2003 et la batterie externe (9V DC) est également connectée à la même broche COM du CI ULN2003. La broche GND de l'ULN2003 est connectée à la broche GND de STM32 et le négatif de la batterie est connecté à la même broche GND.
STM32 avec LCD (16x2)
Broche LCD Non |
Nom de la broche LCD |
Nom de broche STM32 |
1 |
Sol (Gnd) |
Terre (G) |
2 |
VCC |
5V |
3 |
VEE |
Broche du centre du potentiomètre |
4 |
Inscription Sélectionner (RS) |
PB11 |
5 |
Lecture / écriture (RW) |
Terre (G) |
6 |
Activer (EN) |
PB10 |
sept |
Bit de données 0 (DB0) |
Pas de connexion (NC) |
8 |
Bit de données 1 (DB1) |
Pas de connexion (NC) |
9 |
Bit de données 2 (DB2) |
Pas de connexion (NC) |
dix |
Bit de données 3 (DB3) |
Pas de connexion (NC) |
11 |
Bit de données 4 (DB4) |
PB0 |
12 |
Bit de données 5 (DB5) |
PB1 |
13 |
Bit de données 6 (DB6) |
PC13 |
14 |
Bit de données 7 (DB7) |
PC14 |
15 |
LED positive |
5V |
16 |
LED négative |
Terre (G) |
Un potentiomètre sur le côté droit est utilisé pour contrôler le contraste de l'écran LCD. Le tableau ci-dessus montre la connexion entre LCD et STM32.
Programmation STM32
Comme le tutoriel précédent, nous avons programmé le STM32F103C8 avec Arduino IDE via le port USB sans utiliser le programmeur FTDI. Pour en savoir plus sur la programmation de STM32 avec Arduino IDE, suivez le lien. Nous pouvons procéder à la programmation comme dans Arduino. Le code complet est donné à la fin.
Dans ce codage, nous allons prendre une valeur analogique d'entrée de la broche ADC (PA4) qui est connectée à la broche centrale du potentiomètre gauche, puis convertir la valeur analogique (0-3,3 V) en format numérique ou entier (0-4095). Cette valeur numérique est également fournie en tant que sortie PWM pour contrôler la luminosité de la LED et la vitesse du ventilateur CC. Un écran LCD 16x2 est utilisé pour afficher l'ADC et la valeur mappée (valeur de sortie PWM).
Nous devons d'abord inclure le fichier d'en-tête LCD, déclarer les broches LCD et les initialiser en utilisant le code ci-dessous. En savoir plus sur l'interface LCD avec STM32 ici.
#comprendre
Ensuite, déclarez et définissez les noms de broches en utilisant la broche de STM32
const int analoginput = PA4; // Entrée du potentiomètre const int led = PA9; // Sortie LED const int fan = PA8; // sortie ventilateur
Maintenant, dans la configuration () , nous devons afficher certains messages et les effacer après quelques secondes et spécifier la broche INPUT et les broches de sortie PWM
lcd.begin (16,2); // Préparation de l'écran LCD lcd.clear (); // Efface l'écran LCD lcd.setCursor (0,0); // Définit le curseur sur row0 et column0 lcd.print ("CIRCUIT DIGEST"); // Affiche le résumé du circuit lcd.setCursor (0,1); // Définit le curseur sur column0 et row1 lcd.print ("PWM USING STM32"); // Affiche PWM en utilisant le délai STM32 (2000); // Temps de retard lcd.clear (); // Efface le pinMode LCD (entrée analogique, INPUT); // définit l'entrée analogique en mode pin comme INPUT pinMode (led, PWM); // définir le mode de la broche comme la sortie PWM pinMode (ventilateur, PWM); // définir le ventilateur en mode broche comme sortie PWM
La broche d'entrée analogique (PA4) est définie comme INPUT par pinMode (entrée analogique, INPUT), la broche LED est définie comme sortie PWM par pinMode (led, PWM) et la broche du ventilateur est définie comme sortie PWM par pinMode (ventilateur, PWM) . Ici, les broches de sortie PWM sont connectées à la LED (PA9) et au ventilateur (PA8).
Ensuite, dans la fonction void loop () , nous lisons le signal analogique de la broche ADC (PA4) et le stockons dans une variable entière qui convertit la tension analogique en valeurs entières numériques (0-4095) en utilisant le code ci-dessous int valueadc = analogRead (analoginput);
La chose importante à noter ici est que les broches PWM qui sont des canaux de STM32 ont une résolution de 16 bits (0-65535), nous devons donc mapper cela avec des valeurs analogiques en utilisant la fonction de carte comme ci-dessous
int result = map (valeureadc, 0, 4095, 0, 65535).
Si la cartographie n'est pas utilisée, nous n'obtiendrons pas la pleine vitesse du ventilateur ou la pleine luminosité de la LED en faisant varier le potentiomètre.
Ensuite, nous écrivons la sortie PWM sur la LED en utilisant pwmWrite (led, résultat) et la sortie PWM vers le ventilateur en utilisant les fonctions pwmWrite (ventilateur, résultat ).
Enfin, nous affichons la valeur d'entrée analogique (valeur ADC) et les valeurs de sortie (valeurs PWM) sur l'écran LCD en utilisant les commandes suivantes
lcd.setCursor (0,0); // Définit le curseur sur row0 et column0 lcd.print ("ADC value ="); // imprime les mots «» lcd.print (valueadc); // affiche valueadc lcd.setCursor (0,1); // Définit le curseur sur column0 et row1 lcd.print ("Output ="); // imprime les mots dans "" lcd.print (result); // affiche le résultat de la valeur
Le code complet avec une vidéo de démonstration est donné ci-dessous.