Écriture au niveau du bit sur un code PIN analogique
Je commence tout juste à apprendre les opérandes binaires et voici ma question. Pour faire ça:
pinMode (13, OUTPUT);
digitalWrite (13, HIGH);
bitwise je peux faire comme ceci:
DDRB |= B00100000; //set PIN13 as OUTPUT
PORTB |= B00100000; //set PIN13 HIGH
mais comment je peux faire ceci:
analogWrite(9, 200);
Je sais comment convertir les numéros DEC en BIN, mais comment envoyer ce numéro au PIN PWM? Je ne trouve aucun bon exemple sur le web .. Merci!
Réponses
Notez que vous n'avez pas spécifié quel Arduino vous utilisez. Je suppose ici un Arduino basé sur Atmega328p (Uno, Nano, Mini), bien que le principe fonctionne avec tous les microcontrôleurs AVR dotés de ce matériel).
Avec analogWrite()
ils n'envoient pas de données bit par bit à partir d'une broche. Il configure la minuterie matérielle pour régler cette broche à une fréquence spécifique et avec un cycle de service spécifique. Donc analogWrite()
active un morceau de matériel totalement différent à l'intérieur du microcontrôleur.
Pour ce faire sans la fonction Arduino analogWrite()
, vous devez d'abord décider de la voie à suivre:
- Vous pouvez générer une interruption via la minuterie matérielle, puis définir la broche souhaitée par le logiciel à l'intérieur de l'ISR (ce qui vous donne le libre choix de la broche, mais introduit également une certaine gigue dans le signal)
- ou vous pouvez laisser la minuterie matérielle elle-même basculer la broche, ce qui n'implique aucun logiciel pour l'exécution (cela signifie que vous ne pouvez utiliser qu'une des 2 broches, qui sont associées à la minuterie correspondante, mais vous obtiendrez un signal beaucoup plus stable )
Il existe de nombreux didacticiels sur le Web expliquant comment procéder. Une recherche sur "arduino timer register pwm" m'a donné des résultats prometteurs, par exemple celui-ci , où ils expliquent comment obtenir PWM avec les registres Timer1 et une fréquence libre de choix. (C'est une série en 3 parties, une partie pour chaque minuterie. La partie 1 pour la minuterie 0 est ici , bien que vous souhaitiez peut-être garder la minuterie 0 telle quelle, de sorte que les fonctions delay()
et fonctionnent millis()
toujours normalement). Il y a aussi de nombreuses questions de ce type sur ce site, par exemple celle-ci .
Une autre source très importante pour tout ce qui concerne le matériel est la fiche technique du microcontrôleur correspondant. Pour l'Uno, Nano ou Mini c'est l'Atmega328p, dont la fiche technique peut être trouvée sur le site de la micropuce ici (ou lors de la recherche sur Google pour le nom du microcontrôleur)