PWM: émulation de broches analogiques avec votre carte Arduino

Signaux PWM

Avec les broches numériques et analogiques, que vous pouvez utiliser sur votre carte Arduino, vous pouvez recevoir ou envoyer des signaux électriques pour contrôler ou obtenir des données de vos projets électroniques. De plus, il existe d'autres signaux très intéressants dans ce type de plaque, et ce sont les MLI, qui peut émuler un signal analogique sans être réellement analogique. Autrement dit, ce sont des broches numériques qui peuvent agir de la même manière (pas de la même manière) qu'un signal analogique.

Ces types de signaux sont très pratiques lorsque vous souhaitez non seulement utiliser des signaux numériques HIGH et LOW, c'est-à-dire 1 ou 0, ON et OFF, mais que vous voulez aller plus loin et décrire signaux un peu plus complexes. Par exemple, il est possible de moduler la vitesse d'un docteur moteur, ou l'intensité lumineuse d'une lumière, pour un solénoïde, etc.

Système analogique vs numérique

Signal analogique vs numérique

Les circuits électroniques peuvent être divisés en deux grandes familles ou catégories: numérique et analogique. Quand on parle d'électronique numérique, on utilise des grandeurs avec des valeurs discrètes, c'est-à-dire un système binaire représenté par des signaux électriques de basse ou haute tension pour interpréter l'état de ces bits traités. En revanche, lorsqu'il s'agit d'un circuit analogique, des grandeurs avec des valeurs continues sont utilisées.

Dans les systèmes numériques peuvent être trouvés à son tour ceux de type combinatoire et ceux de type séquentiel. Autrement dit, les premiers sont ceux dans lesquels la sortie du système ne dépend que de l'état des entrées. Par contre, dans les séquences séquentielles, des éléments de mémoire sont inclus, et la sortie dépendra de l'état actuel des entrées et de l'état précédent stocké.

Dans le cas des analogues, il n'y a pas ces deux grands groupes ou variantes, car ici ce sont des signaux continus qui dépendront toujours de le signal système actuel. Par exemple, dans un haut-parleur, le signal qui lui est fourni dépendra du son que vous souhaitez reproduire. La même chose avec un microphone, qui générera un signal analogique en fonction du son qu'il reçoit. Vous l'avez sûrement aussi vu avec de nombreux autres capteurs que nous avons décrits dans ce blog et qui agissent avec des signaux analogiques (et par conséquent, une formule a dû être créée pour que plus tard les valeurs puissent être calculées ou conditionnées dans les croquis Arduino IDE. ) ...

Ces caractéristiques de l'un et de l'autre font que certains ont leur avantages et inconvénients, comme d'habitude dans presque tout. Par exemple, les numériques sont généralement moins chers, plus rapides, plus faciles à développer, les informations peuvent être stockées plus facilement, ils ont une plus grande précision, ils peuvent être programmés, ils ne sont pas aussi vulnérables aux effets du bruit, etc. Mais il est également vrai qu'avec les analogiques, vous pouvez utiliser des signaux plus complexes.

Par exemple, un capteur à effet Hall de type numérique ne peut détecter que la présence ou l'absence d'un champ magnétique proche. Au lieu de cela, un capteur analogique à effet Hall peut faire cela et également déterminer la densité dudit champ magnétique grâce à un signal analogique qu'il génère à sa sortie. Sachant comment bien interpréter ce signal de tension supérieure ou inférieure, vous pouvez facilement connaître cette ampleur. Vous avez d'autres exemples dans une multitude de grandeurs de la nature que vous pouvez mesurer quantitativement avec un système analogique, comme la température, le temps, la pression, la distance, le son, etc.

Signal analogique vs numérique

Cela étant dit, un Signal analogique Ce sera une tension ou un courant électrique qui varie avec le temps et en continu. S'il est représenté graphiquement, le signal analogique serait une onde sinusoïdale à fréquence unique.

Quant à la signal numérique, est une tension qui varie par étapes en fonction du temps. Autrement dit, s'il est représenté sur un graphique, ce sera un signal de pas qui ne varie pas continuellement, mais des changements par étapes ou par incréments discrets.

Il faut savoir qu'il existe des circuits pour passer d'un signal analogique à un signal numérique ou vice versa. Celles-ci convertisseurs ils sont connus sous le nom de DAC (convertisseur numérique-analogique) et ADC (convertisseur analogique-numérique). Et ils sont très courants dans de nombreux appareils que nous utilisons aujourd'hui, tels que la télévision, les ordinateurs, etc. Avec eux, vous pouvez convertir les signaux numériques utilisés par ces équipements à un niveau électronique pour fonctionner avec d'autres périphériques ou des pièces qui fonctionnent en analogique.

Par exemple, un haut-parleur ou un microphone avec des signaux analogiques qui fonctionne avec une carte son, ou des cartes graphiques numériques qui avaient la fameuse puce RAMDAC pour les ports de moniteur analogique ... En Arduino ce type de convertisseurs est également utilisé pour de multiples projets, comme nous le verrons ...

Qu'est-ce que PWM?

cycle de service graphique

Bien que PWM (Pulse-Width Modulation), ou modulation de largeur d'impulsion, a une base numérique, la forme de son signal ressemble à un signal analogique quelque peu «carré». Il permet au moyen d'impulsions numériques de faire varier le signal d'émuler un système analogique comme je l'ai déjà mentionné. En fait, si vous regardez le nom, il vous donne déjà des indices sur ce qu'il fait, à travers la largeur des impulsions numériques.

Ceci est bénéfique pour Arduino car il existe de nombreux automatismes ou composants électroniques que vous pouvez ajouter à vos projets et que ne sont pas capables de fournir un vrai signal analogique, mais ils utilisent ce PWM pour fonctionner. Ils ne peuvent pas non plus utiliser un signal analogique discrétisé, c'est-à-dire qui va à des sauts de tension pour ressembler à un signal numérique. Ce qu'ils peuvent faire, c'est utiliser une sortie numérique -Vcc ou Vcc de type numérique pour générer ce signal particulier ...

Par conséquent, PWM est une sorte de "truc" avec lequel Arduino et d'autres systèmes peuvent interagir avec ce type de signaux qui ils ne sont pas tout à fait analogiques ni numériques conventionnels. Pour ce faire, ils maintiennent une sortie numérique active pendant une durée déterminée ou désactivée, selon l'intérêt à tout moment. C'est loin de ce que serait une horloge numérique ou un signal de code binaire, dont les impulsions ont la même largeur.

Dans vos projets avec Arduino, vous pouvez vérifier ce type de signaux PWM dans lesquels une fréquence constante de déclenchements d'impulsions est maintenue dans le temps, mais la largeur de ces impulsions est variée. En fait, on l'appelle Duty Cycle lorsqu'un signal est maintenu à un niveau élevé par rapport au total du cycle. Par conséquent, le cycle de service est exprimé en%.

N'oubliez pas que dans un PWM vous ne travaillez pas comme dans un signal analogique, entre plusieurs valeurs de tension et il fluctue entre elles. Dans le cas de PWM, il s'agit d'un signal carré dans le style numérique et dont la valeur maximale est Vcc. Par exemple, si vous travaillez avec une alimentation 3V, vous pouvez donner des impulsions 3V ou 0V, mais pas 1V ou toute autre valeur intermédiaire comme cela se produirait dans un véritable analogique. Ce qui varierait dans ce cas, c'est la largeur d'impulsion, que nous pouvons garder 30% à cette valeur Vcc élevée, ou 60% pour lui donner plus de puissance, etc.

Mais soyez prudent, car si un appareil prend en charge une limite Vcc et est dépassé avec PWM, il peut être endommagé. Il faudrait donc toujours respecter les valeurs des fiches techniques fournies par les fabricants. De plus, dans certains appareils tels que les moteurs à courant continu, relais, électroaimants, etc., un retrait de tension après un cycle de service peut signifier que les charges inductives peuvent causer des dommages. C'est pourquoi le protecciones opportun.

PWM sur Arduino

Bus Arduino I2C

Maintenant que vous savez comment cela fonctionne, voyons le cas spécifique du PWM dans le monde Arduino ...

PWM: brochage sur Arduino

Sur les cartes Arduino, vous pouvez trouver plusieurs broches qui implémentent le PWM matériel. Vous pouvez les identifier sur le PCB lui-même car ils ont un symbole ~ (petite tête) avec la numérotation des broches. Cela pourrait aussi être fait par logiciel dans le code Arduino, mais cela surchargerait le microcontrôleur de travail, chose absurde quand cela peut être fait nativement et par matériel ...

  • Arduino UNO, Mini et Nano- Vous avez 6 sorties PWM 8 bits sur les broches 3, 5, 6, 9, 10 et 11, qui auront ce ~ juste devant le numéro.
  • Mega Arduino- Sur cette carte Arduino la plus puissante, vous disposez de 15 sorties PWM 8 bits. Ils se trouvent sur les broches 2 à 13 et 44 à 46.
  • Arduino Due: dans ce cas, il y a 13 sorties PWM 8 bits. Ils sont sur les broches 2 à 13, plus deux autres sorties analogiques discrétisées par DAC avec une résolution de 12 bits.

Lorsque vous parlez de résolution 8 bits ou 12 bits, etc., dans ce type de sorties PWM, vous faites référence à la marge de manœuvre dont vous disposez. Avec 8 bits ont 256 niveaux Entre lesquels vous pouvez varier, et les 12 bits vont jusqu'à 4096 niveaux.

Contrôle avec minuteries

Pour le contrôle PWM matériel, Arduino utilisera les minuteries pour cela. Chaque minuterie présente peut desservir 2 ou 3 sorties PWM. Un registre de comparaison pour chaque sortie complète ce système de sorte que lorsque le temps atteint la valeur du registre, l'état ou la valeur de la sortie est changé pour arrêter ces cycles de service. Bien qu'il y ait deux sorties contrôlées par la même minuterie, les deux peuvent avoir des cycles de service différents, bien qu'elles partagent la même fréquence.

Dans le cas des minuteries associées à chaque broche PWM, cela variera selon le type de carte Arduino que tu ais:

  • Arduino UNO, Mini et Nano:
    • Minuterie 0 - 5 et 6
    • Minuterie 1 - 9 et 10
    • Minuterie 2 - 3 et 11
  • Mega Arduino:
    • Minuterie 0 - 4 et 13
    • Minuterie 1 - 11 et 12
    • Minuterie 2 - 9 et 10
    • Timer3 - 2, 3 et 5
    • Timer4 - 6, 7 et 8
    • Timer5 - 44, 45 et 46

Le registre pré-calibré divisera le temps par un entier et le minuteur s'occupe du reste pour contrôler chacune des sorties PWM associées. La modification de la valeur de registre peut modifier la fréquence. le fréquences Ils seront également différents en fonction de la minuterie et de la plaque:

  • Arduino UNO, Mini et Nano:
    • Timer0: permet le préréglage de 1, 8, 64, 256 et 1024. La fréquence est de 62.5 kHz.
    • Timer1: avec des préréglages de 1, 8, 64, 256 et 1024. Avec une fréquence de 31.25 kHz.
    • Timer2: égal à Timer1, mais il ajoute également une pré-mise à l'échelle de 32 et 128 en plus des précédentes.
  • Mega Arduino:
    • Timer0, 1, 2: identique à ci-dessus.
    • Minuterie 3, 4 et 5: avec une fréquence de 31.25 kHz et pré-mise à l'échelle de 1, 8, 64, 256 et 1024.

Incompatibilités et conflits

La minuterie associé aux sorties n'est pas seulement pour cette fonction, est également utilisé par d'autres. Par conséquent, s'ils sont utilisés par une autre fonction, vous devez choisir entre l'une ou l'autre, vous ne pouvez pas utiliser les deux en même temps. Par exemple, voici quelques-unes des incompatibilités que vous pouvez trouver dans vos projets:

  • Bibliothèque servo: Lorsque vous utilisez des servomoteurs, il fait un usage intensif des minuteries, ce qui peut générer des conflits. Utilisez spécifiquement Timer1 pour UNO, Nano et Mini, c'est-à-dire que vous ne pouvez pas utiliser les broches 9 et 10 pendant que vous utilisez un croquis avec cette bibliothèque. Dans Mega cela dépendra du nombre de servos ...
  • SPI: Si la communication SPI est utilisée sur la carte Arduino, la broche 11 est utilisée pour la fonction MOSI. C'est pourquoi cette broche PWM ne peut pas être utilisée.
  • Tone: cette fonction utilise Timer2 pour fonctionner. Donc, s'il est utilisé, vous rendez les broches 3 et 11 (ou 9 et 10 pour Mega) inutiles.

Test pratique avec Arduino

Schéma Arduino PWM avec LED

Si vous voulez voir sur place comment fonctionne PWM sur Arduino, la meilleure chose à faire est de connecter les cordons de mesure d'un voltmètre ou multimètre (en fonction de mesurer la tension) entre la broche PWM que vous avez choisi d'utiliser et la broche de masse ou GND de la carte Arduino. De cette façon, sur l'écran de l'appareil de mesure, vous pourrez voir l'évolution de la tension avec une sortie numérique grâce à cette astuce PWM.

Vous pouvez remplacer le voltmètre / multimètre par une LED pour voir comment l'intensité de la lumière varie, avec un moteur à courant continu ou avec tout autre élément de votre choix. Je l'ai simplifié dans le schéma avec Fritzing avec une LED sans plus, mais sachez qu'elle peut aussi représenter les pointes d'un multimètre ...

Si vous utilisez une LED, rappelez-vous la résistance à la cathode et GND.

Pour le code source Pour contrôler le microcontrôleur de la carte Arduino pour que tout fonctionne, vous devez l'insérer dans Arduino IDE (dans ce cas, j'ai utilisé la broche 6 PWM de Arduino UNO):

const int analogOutPin = 6;
byte outputValue = 0;  
 
void setup()
{  
   Serial.begin(9600);        
   pinMode(ledPIN , OUTPUT); 
 
   bitSet(DDRB, 5);       // LED o voltímetro
   bitSet(PCICR, PCIE0);       
   bitSet(PCMSK0, PCINT3);     
}
 
void loop() 
{
   if (Serial.available()>0)  
   {
      if(outputValue >= '0' && outputValue <= '9')
      {
         outputValue = Serial.read();   // Leemos la opción
         outputValue -= '0';      // Restamos '0' para convertir a un número
         outputValue *= 25;      // Multiplicamos x25 para pasar a una escala 0 a 250
         analogWrite(ledPIN , outputValue);
      }
   }
}  
 
ISR(PCINT0_vect)
{
   if(bitRead(PINB, 3))
   { 
      bitSet(PORTB, 5);   // LED on 
   }
   else
   { 
      bitClear(PORTB, 5); // LED off  
   } 
} 
Je vous conseille de jouer avec les valeurs et de voir les résultats sur la lumière ou le voltmètre. Le programme peut recevoir des valeurs de 0 à 9 afin que vous puissiez voir comment tout varie. Pour plus d'informations, je vous conseille le cours arduino que nous avons en téléchargement gratuit ...

Un commentaire, laissez le vôtre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont marqués avec *

*

*

  1. Responsable des données: Miguel Ángel Gatón
  2. Finalité des données: Contrôle du SPAM, gestion des commentaires.
  3. Légitimation: votre consentement
  4. Communication des données: Les données ne seront pas communiquées à des tiers sauf obligation légale.
  5. Stockage des données: base de données hébergée par Occentus Networks (EU)
  6. Droits: à tout moment, vous pouvez limiter, récupérer et supprimer vos informations.

  1.   Jose dit

    Bonjour. Tout d'abord je tiens à vous remercier pour le temps consacré à cette explication pour la plus récente.
    Je voudrais vous poser une question. J'essaie d'exécuter le code sur un émulateur proteus 8 pour Arguino Mega. Je connecte un voltmètre à la broche 6, Proteus est connecté à un port série, mais je ne sais pas comment ou quoi faire varier pour que différentes tensions soient produites. J'ai dû faire des ajustements mineurs au code pour le faire compiler. Je vous remercie beaucoup pour votre aide