Bitweises Schreiben in analoge PIN
Ich fange gerade an, bitweise Operanden zu lernen, und hier ist meine Frage. Um dies zu tun:
pinMode (13, OUTPUT);
digitalWrite (13, HIGH);
bitweise kann ich so machen:
DDRB |= B00100000; //set PIN13 as OUTPUT
PORTB |= B00100000; //set PIN13 HIGH
aber wie kann ich das machen:
analogWrite(9, 200);
Ich weiß, wie man DEC-Nummern in BIN konvertiert, aber wie man diese Nummer an PWM-PIN sendet? Ich kann kein gutes Beispiel im Web finden. Danke!
Antworten
Beachten Sie, dass Sie nicht angegeben haben, welches Arduino Sie verwenden. Ich gehe hier von einem Atmega328p-basierten Arduino (Uno, Nano, Mini) aus, obwohl das Prinzip mit jedem AVR-Mikrocontroller funktioniert, der über diese Hardware verfügt.
Mit analogWrite()
are werden keine Daten bitweise aus einem Pin gesendet. Es konfiguriert den Hardware-Timer zum Einstellen dieses Pins auf eine bestimmte Frequenz und mit einem bestimmten Arbeitszyklus. So analogWrite()
Wirkstoffe , ein ganz anderes Stück Hardware im Inneren des Mikrocontrollers.
Um dies ohne die Arduino-Funktion zu tun analogWrite()
, müssen Sie zunächst entscheiden, welchen Weg Sie einschlagen möchten:
- Sie können einen Interrupt über den Hardware-Timer erzeugen und dann den gewünschten Pin per Software im ISR setzen (wodurch Sie den Pin frei wählen können, aber auch etwas Jitter in das Signal einbringen).
- oder Sie können den Hardware-Timer selbst den Pin umschalten lassen, für den keine Software zum Ausführen erforderlich ist (das heißt, Sie können nur einen der 2 Pins verwenden, die dem entsprechenden Timer zugeordnet sind, aber Sie erhalten ein viel stabileres Signal )
Es gibt viele Tutorials im Internet, wie das geht. Eine Suche nach "arduino timer register pwm" brachte mir einige vielversprechende Ergebnisse, zum Beispiel dieses , in dem erklärt wird, wie man PWM mit den Timer1-Registern und einer frei wählbaren Frequenz erhält. (Dies ist eine dreiteilige Serie, ein Teil für jeden Timer. Teil 1 für Timer 0 ist hier , obwohl Sie Timer 0 so lassen möchten, wie er ist, damit er wie gewohnt funktioniert delay()
und millis()
trotzdem funktioniert.) Es gibt auch viele solche Fragen auf dieser Seite, zum Beispiel diese .
Eine weitere sehr wichtige Quelle für alles, was mit Hardware zu tun hat, ist das Datenblatt des entsprechenden Mikrocontrollers. Für den Uno, Nano oder Mini ist dies der Atmega328p. Dieses Datenblatt finden Sie auf der Mikrochip-Website hier (oder wenn Sie nach dem Namen des Mikrocontrollers googeln).