Was ist der Unterschied zwischen analogWrite und digitalWrite?

8

Wie der Titel schon sagt. Was ist der Unterschied zwischen den beiden?

analogWrite(pin,0-255) vs. digitalWrite(pin,LOW-HIGH)

pijemcolu
quelle
Ich will nicht unhöflich sein, aber was war daran verwirrend in der Dokumentation auf arduino.cc oder in der IDE enthalten?
Linhartr22

Antworten:

16

digitalWrite setzt den angegebenen Pin auf einen von zwei Zuständen - HIGH / LOW, was 5 V (3,3 V auf einigen Karten) bzw. Masse entspricht.

analogWrite kann je nach Art der verwendeten Ausgabe variieren.

Bei Anwendung auf einen PWM-Pin wird der Pin auf ein periodisches High / Low-Signal gesetzt, wobei der Prozentsatz des hoch ausgegebenen Signals proportional zum geschriebenen Wert ist. beispielsweise -

    analogWrite(PWMpin,255)

Wird 100% der Zeit HOCH sein, während

    analogWrite(PWMpin,127)

Wird in 50% der Fälle HOCH und in 50% der Fälle NIEDRIG sein

Wenn Sie analogWrite auf einen DAC-Pin anwenden (auf einigen Karten wie DUE oder MEGA verfügbar), bewirkt analogWrite, dass der angegebene Pin tatsächlich einen Spannungspegel ausgibt, der proportional zum angegebenen Analogwert ist

Zum Beispiel auf dem Due mit einer maximalen Spannung von 3,3 V und einer analogen Standardauflösung von 8 Bit - [0: 255]

    analogWrite(DACpin,255)

Bewirkt, dass der angegebene Pin 3,3 V ausgibt und-

    analogWrite(DACpin,127)

Bewirkt, dass der angegebene Pin 1,35 V ausgibt

TanyaV
quelle
2
Nein, es gibt keinen DAC auf dem Mega.
Edgar Bonet
Sie sind richtig, Antwort bearbeitet, um dies widerzuspiegeln.
TanyaV
Großartig. Ich habe mir erlaubt, die Bearbeitung präziser zu gestalten.
Edgar Bonet
Ich glaube, es gibt eine "Maxanalog" -Definition oder -Konstante, um eine bessere Kompatibilität mit anderen Plattformen zu gewährleisten. Der esp8266 verfügt über ein Analogwrite, das von 0 bis 1024 reichen kann. * Ich habe einige Haare herausgekratzt, um herauszufinden, warum mein RGB-LED-Controller mit demselben Code nicht so hell ist, obwohl dies auf Leistungsunterschiede zurückzuführen ist Spannung, aber ich habe einen MOSFET mit geeignetem (Gain?) Faktor verwendet. Es war einfach für (1024/256) der Zeit.
Paul
6

analogWrite (): Die analogWrite () -Methode legt den Wert eines PWM-Ausgangspins fest. AnalogWrite () liegt auf einer Skala von 0 bis 255, sodass analogWrite (255) ein Tastverhältnis von 100% (immer eingeschaltet) und analogWrite (127) ein Tastverhältnis von 50% (in der Hälfte der Zeit) anfordert.

PWM-Arbeitszyklus

Syntax : analogWrite (Pin, Val)

Wo,

Pin: Die PWM-Ausgangs-Pin-Nummer.

val: int Wert des Arbeitszyklus zwischen 0 (immer aus) und 255 (immer ein)

Beispielcode:

int outLed = 10;  //LED connected to digital pin 10
int value = 0;    //variable to store the read value
int analogIN = 3; //input pin

void setup()
{
  pinMode(outLed, OUTPUT); // set the PWM pin as OUTPUT
}

void loop()
{
  value = analogRead(analogIN); // read the value of analogIN (values between from 0 to 1023)
  analogWrite(outLed, value/4); // sets the read value on outLed (values between from 0 to 255)
}

digitalWrite: Die Methode digitalWrite () setzt den Wert eines digitalen Pins auf HIGH oder LOW. Hier 5 V (oder 3,3 V auf 3,3 V-Karten) für HIGH, 0 V (Masse) für LOW.

Syntax: digitalWrite (Pin, Val)

Wo,

Pin: Die Pin-Nummer

val: HOCH oder NIEDRIG

Beispielcode:

int ledPin = 13;                // LED connected to digital pin 13

void setup()
{
  pinMode(ledPin, OUTPUT);      // sets the digital pin as output
}

void loop()
{
  digitalWrite(ledPin, HIGH);   // sets the LED on
  delay(1000);                  // waits for a second
  digitalWrite(ledPin, LOW);    // sets the LED off
  delay(1000);                  // waits for a second
}
Hasan
quelle
5

digitalWriteSetzt den Ausgangspin entweder auf LOW oder HIGH (wobei diese Spannungen von der V cc des Prozessors abhängen . Bei einem Uno oder Mega wären das 0 V oder 5 V (oder nahe daran).

Hier ist ein Screenshot von digitalWrite (LOW):

digitalWrite (LOW)

Das heißt, der Ausgangspin liegt bei 0V.


Jetzt zu digitalWrite (HIGH):

Die Ausgangsspannung beträgt 5V.

digitalWrite (HIGH)


analogWrite sollte eigentlich PWMwrite heißen, da es die Prozessor-Timer für die Ausgabe von PWM (Pulsweitenmodulation) konfiguriert.

Versuchen wir es mit analogWrite (1):

analogWrite (1)

Sie können sehen, dass der Spannungspegel die meiste Zeit 0 V beträgt und für kurze Zeit auf 5 V ansteigt. Sie sehen auch, dass die Frequenz 490 Hz beträgt, wie auf der Referenzseite für analogWrite angegeben .


Vergrößern:

analogWrite (1) - gezoomt

Die Ausgabe ist für 8 µs hoch, was genau 1/256 von 2048 µs entspricht, was der Periode des Timers entspricht. Wir haben also ein Tastverhältnis von 1/256 (0,39%).


Versuchen wir es mit analogWrite (127) - auf halbem Weg von 0 bis 255:

analogWrite (127)

Jetzt können Sie sehen, dass die Ausgabe genau die Hälfte der Zeit HOCH und den Rest der Zeit NIEDRIG ist.


Versuchen wir es mit analogWrite (254):

analogWrite (254)

Dies ist das Gegenteil von analogWrite (1). Der Ausgang ist bis auf einen kurzen Zeitraum immer HIGH. Vergrößern:

analogWrite (254) - gezoomt

Jetzt ist der Ausgang ausgeschaltet für 8 us - im Vergleich zu dem früheren Bild , wo es für 8 us war.


analogWrite (0)ist das gleiche wie digitalWrite (LOW).

analogWrite (255)ist das gleiche wie digitalWrite (HIGH).

Dies wird durch den entsprechenden Code in wiring_analog.c belegt:

if (val == 0)
{
    digitalWrite(pin, LOW);
}
else if (val == 255)
{
    digitalWrite(pin, HIGH);
}

Zusammenfassung

analogWriteGrundsätzlich werden die Hardware-Timer für die Ausgabe von PWM konfiguriert. Sobald Sie dies tun, gibt die Timer-Hardware das angeforderte Tastverhältnis (von 0 bis 255) aus, wobei 0 immer ausgeschaltet ist, 255 immer eingeschaltet ist und ein Wert dazwischen Ihnen PWM (gepulste Ausgabe) gibt.


Weitere Informationen zu den Timern finden Sie auf meiner Seite zu Timern .

Nick Gammon
quelle
3

digitalWrite setzt den Pin auf einen hohen oder niedrigen Wert, der genau auf diesem Wert bleibt, bis digitalWrite erneut für diesen Pin aufgerufen wird.

analogWrite setzt den Pin auf einen oszillierenden Wert, dessen Impulslänge auf dem als zweiten Parameter angegebenen Arbeitszyklus basiert.

Damit:

digitalWrite (5, HIGH);    // Pin 5 goes high
analogWrite (6, 127);      // Pin 6 oscillates regularly between 0v and 5v (or 3.3v) at about 250Hz.
Code Gorilla
quelle
2

analogWrite (): Schreibt einen analogen Wert (PWM-Welle) auf einen Pin. Kann verwendet werden, um eine LED mit unterschiedlichen Helligkeiten zu beleuchten oder einen Motor mit verschiedenen Geschwindigkeiten anzutreiben. Nach einem Anruf bei analogWrite()erzeugt der Pin eine stetige Rechteckwelle des angegebenen Arbeitszyklus bis zum nächsten Anruf bei analogWrite()(oder einem Anruf bei digitalRead()oderdigitalWrite() auf demselben Pin). Die Frequenz des PWM-Signals an den meisten Pins beträgt ungefähr 490 Hz. Auf der Uno-Karte und ähnlichen Karten haben die Pins 5 und 6 eine Frequenz von ungefähr 980 Hz. Die Pins 3 und 11 des Leonardo laufen ebenfalls mit 980 Hz.

Weitere Informationen finden Sie unter: https://www.arduino.cc/en/Reference/analogWrite

analogRead (): Liest den Wert vom angegebenen analogen Pin. Die Arduino-Karte enthält einen 10-Bit-Analog-Digital-Wandler mit 6 Kanälen (8 Kanäle beim Mini und Nano, 16 beim Mega). Dies bedeutet, dass Eingangsspannungen zwischen 0 und 5 Volt auf ganzzahlige Werte zwischen 0 und 1023 abgebildet werden. Dies ergibt eine Auflösung zwischen Messwerten von: 5 Volt / 1024 Einheiten oder 0,0049 Volt (4,9 mV) pro Einheit. Der Eingabebereich und die Auflösung können mit geändert werden analogReference().

Weitere Informationen finden Sie unter: https://www.arduino.cc/en/Reference/analogRead

Tanmay Yerunkar
quelle
1

digitalWrite setzt den angegebenen Pin auf einen von zwei Zuständen - HIGH / LOW

Wobei HIGH = 5 V und LOW = 0 V.

analogWrite Stellen Sie den PWM-Wert des PWM-Pins ein

(In Arduino UNO sind die PWM-Pins 3, 5, 6, 9, 10, 11)

Dadurch wird der Pin auf ein periodisches High / Low-Signal gesetzt.

analogWrite(PWMpin,255)

Wird 100% der Zeit HOCH sein, während

analogWrite(PWMpin,127)

Wird in 50% der Fälle HOCH und in 50% der Fälle NIEDRIG sein

Sam
quelle
0

Was ist der Unterschied zwischen analogWrite (X, 255) und digitalWrite (X, HIGH)? Wahrscheinlich nichts, außer vielleicht muss der Prozessor einige zusätzliche Dinge tun, um herauszufinden, dass er kein PWM und auch keinen Stil verwenden muss.

PaulMurrayCbr
quelle