Vad ' är skillnaden mellan analogWrite och digitalWrite?

Som titeln säger. Vad är skillnaden mellan de två?

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

Kommentarer

  • Jag ’ t menar att vara oförskämd men vad var förvirrande om detta i dokumentationen på arduino.cc eller ingår i IDE?

Svar

digitalWrite ställer in den angivna nålen till en av två tillstånd – HÖG / LÅG, vilken motsvarar 5v (3,3v på vissa kort) respektive jord.

analogWrite kan variera beroende på vilken typ av utgång som används.

Om den används på en PWM-stift – ställer den in stiftet till en periodisk hög / låg signal, där procentandelen av signalen som används högt är proportionell mot det skrivna värdet. till exempel –

 analogWrite(PWMpin,255) 

Kommer att vara HÖG 100% av tiden, medan

 analogWrite(PWMpin,127) 

kommer att vara HÖG 50% av tiden och LÅG 50% av tiden

När du använder analogWrite till en DAC-stift (tillgänglig på vissa brädor, som DUE eller MEGA ) anal ogWrite kommer faktiskt att orsaka att den angivna stiftet matar ut en spänningsnivå som är proportionell mot det angivna analoga värdet

Till exempel på Due, med maximal spänning på 3,3v och en standard analog upplösning på 8 bitar – [0: 255]

 analogWrite(DACpin,255) 

Gör att den angivna stiftet matar ut 3.3v, och-

 analogWrite(DACpin,127) 

Kommer att ge den angivna stiftet utmatning 1.35v

Kommentarer

  • Nej, det finns ingen DAC på Mega.
  • du har rätt, svaret har redigerats för att återspegla detta.
  • Bra. Jag tog mig friheten att göra redigeringen mer kortfattad.
  • Jag tror att det finns en ” maxanalog ” definierar eller konstant för att ge bättre kompatibilitet med andra plattformar. Esp8266 har en analog skrivare som kan sträcka sig från 0 till 1024. * Jag ’ har skrapat ut några hårstrån och försökt hitta varför min RGB-ledda kontroller inte ’ t vara lika ljus med samma kod, trodde att det berodde på skillnaden i effekt eller spänning, men jag använde en MOSFET med lämplig (förstärkning?) faktor. Det var helt enkelt på (1024/256) för tiden.

Svar

analogWrite (): Metoden analogWrite () ställer in värdet på en PWM-utgångsstift. AnalogWrite () är på en skala från 0 – 255, så att analogWrite (255) begär en 100% arbetscykel (alltid på) och analogWrite (127) är en 50% arbetscykel (på halva tiden).

PWM Duty Cycle

Syntax : analogWrite (pin, val)

Where,

pin: PWM output pin number.

val: int värde av arbetscykel mellan 0 (alltid av) till 255 (alltid på)

Exempel Kod:

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: Metoden digitalWrite () anger värdet på en digital stift som HÖG eller LÅG. Här, 5V (eller 3,3V på 3,3V-kort) för HÖG, 0V (jord) för LÅG.

Syntax: digitalWrite (pin, val)

Var,

pin: pin-numret

val: HIGH eller LOW

Exempelkod:

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 } 

Svar

digitalWrite ställer in utgångsstiftet till antingen LÅG eller HÖG (där dessa spänningar beror på V cc för processorn. För en Uno eller Mega som skulle vara 0V eller 5V (eller nära den).

Här är en skärmdump av digitalWrite (LOW):

digitalWrite (LOW)

Det vill säga utgångsstiftet är vid 0V.


Nu för digitalWrite (HIGH):

Utgångsspänningen är 5V.

digitalWrite (HIGH)


analogWrite borde verkligen ha fått namnet PWMwrite eftersom det conf iguerar processortimrarna för att mata ut PWM (pulsbreddsmodulation).

Låt oss försöka analogWrite (1):

analogWrite (1)

Du kan se att spänningsnivån är 0V för det mesta och går till 5V under korta perioder. Du ser också att frekvensen är 490 Hz vilket referenssidan för analogWrite säger att den kommer att vara.


Zooma in:

analogWrite (1) - zoomad

Utgången är hög för 8 µs, vilket är exakt 1/256 av 2048 µs vilket är timern. Så vi har en arbetscykel på 1/256 (0,39%).


Låt oss försöka analogWrite (127) – halvvägs från 0 till 255:

analogWrite (127)

Nu kan du se att utdata är HÖG exakt halva tiden och LÅG resten av tiden.


Låt oss försöka analogWrite (254):

analogWrite (254)

Detta är motsatsen till analogWrite (1). Utgången är HÖG hela tiden utom en kort period. Zooma in:

analogWrite (254) - zoomad

Nu är utdata av för 8 µs – jämfört med den tidigare bilden där den var på i 8 µs.


analogWrite (0) är samma som digitalWrite (LOW).

analogWrite (255) är samma som digitalWrite (HIGH).

Detta bevisas av den relevanta koden i wiring_analog.c:

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

Sammanfattning

analogWrite konfigurerar i grund och botten hårdvarutimrarna för att mata ut PWM. När du har gjort det matar timermaskinvaran ut den begärda arbetscykeln (från 0 till 255) där 0 alltid är av, 255 är alltid på och något värde däremellan ger dig PWM (pulsad utgång).


För mer information om timern, se min sida om timers .

Svar

digitalWrite sätter stiftet till ett högt eller lågt värde som förblir exakt det värdet tills digitalWrite uppmanas till det stiftet igen.

analogWrite ställer in stiftet så att det har ett oscillerande värde som har ett pulslängd baserad på arbetscykeln som anges som den andra parametern.

Så:

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

Svar

analogWrite (): Skriver ett analogt värde (PWM-våg) till en stift . Kan användas för att tända en lysdiod med varierande ljusstyrka eller köra en motor i olika hastigheter. Efter ett samtal till analogWrite() kommer stiftet att generera en stadig fyrkantig våg av den angivna arbetscykeln tills nästa samtal till analogWrite() (eller en ring till digitalRead() eller digitalWrite() på samma stift). PWM-signalens frekvens på de flesta stift är cirka 490 Hz. På Uno och liknande kort har stift 5 och 6 en frekvens på cirka 980 Hz. Pins 3 och 11 på Leonardo körs också vid 980 Hz.

För mer information besök: https://www.arduino.cc/en/Reference/analogWrite

analogRead (): Läser värdet från den angivna analoga stiftet. Arduino-kortet innehåller en 6-kanals (8 kanaler på Mini och Nano, 16 på Mega), 10-bitars analog till digital omvandlare. Det betyder att den kommer att kartlägga ingångsspänningar mellan 0 och 5 volt till helvärden mellan 0 och 1023. Detta ger en upplösning mellan avläsningarna på: 5 volt / 1024 enheter eller, 0,0049 volt (4,9 mV) per enhet. Ingångsområdet och upplösningen kan ändras med analogReference().

För mer information, besök: https://www.arduino.cc/en/Reference/analogRead

Svar

digitalWrite ställ in den angivna stiftet till en av två tillstånd – HIGH / LOW

Where, HIGH = 5 V and LOW = 0 V

analogWrite Ställ in PWM-värdet på PWM-stift

(I Arduino UNO är PWM-stiften 3, 5, 6, 9, 10, 11)

Det ställer in stiftet till en periodisk hög / låg signal.

analogWrite(PWMpin,255) 

Kommer att vara HÖG 100% av tiden, medan

analogWrite(PWMpin,127) 

Kommer att vara HÖG 50% av tiden och LÅG 50% av tiden

Svar

Så vad är skillnaden mellan analogWrite (X, 255) och digitalWrite (X, HIGH)? Förmodligen ingenting, förutom att processorn måste göra några extra saker för att räkna ut att den inte behöver använda PWM, och även stil.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *