У чому різниця між analogWrite і digitalWrite?

Як випливає з назви. У чому різниця між ними?

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

8

7 Відповіді

digitalWrite встановить вказаний контакт в один з двох станів - HIGH/LOW, які прирівнюються до 5v (3.3v на деяких платах) і відповідно до грунту.

analogWrite може змінюватися залежно від типу використовуваного виводу.

Якщо застосований штифт PWM - він встановить шпильку на періодичний сигнал високого/низького рівня, де відсоток витраченого сигналу високий пропорційний значенню, записаному. наприклад -

    analogWrite(PWMpin,255)

Буде високим 100% часу, поки

    analogWrite(PWMpin,127)

Буде високим 50% часу, і LOW 50% часу

При застосуванні analogWrite на контакт DAC (доступний на деяких платах, наприклад DUE або MEGA ) analogWrite фактично призведе до того, що вказаний висновок виводитиме рівень напруги, пропорційний до заданого аналогового значення

Наприклад, на Due, з максимальною напругою 3.3v і аналоговою роздільною здатністю за замовчуванням 8 біт - [0: 255]

    analogWrite(DACpin,255)

Викличе вказаний висновок 3.3v, а -

    analogWrite(DACpin,127)

Викличе вказаний висновок 1.35v

13
додано
Ви правильні, відповідь відредаговано, щоб відобразити це.
додано Автор christoff, джерело
Я вважаю, що "maxanalog" визначити або постійно, щоб забезпечити кращу сумісність з іншими платформами. У esp8266 є analogwrite, який може варіюватися від 0 до 1024. * Я подряпав деякі волосся, намагаючись знайти, чому мій RGB світлодіодний контролер не буде настільки яскравим з тим же кодом, думав, що це було через різницю в потужності напруги, але я використовував MOSFET з відповідним (посилення?) фактором. Це було просто (1024/256) того часу.
додано Автор dotnetengineer, джерело
Ні, на Мезі немає ЦАП.
додано Автор Sprogz, джерело
Великий. Я дозволив зробити редагування більш стислим.
додано Автор Sprogz, джерело

analogWrite(): The analogWrite() method sets the value of a PWM output pin. The analogWrite() is on a scale of 0 - 255, such that analogWrite(255) requests a 100% duty cycle (always on), and analogWrite(127) is a 50% duty cycle (on half the time).

PWM Duty Cycle

Syntax: analogWrite(pin, val)

Де,

PIN-код: вихідний номер ШІМ.

val: значення інтенсивності циклу від 0 (завжди вимкнено) до 255 (завжди включено)

Прикладний код:

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: The digitalWrite() method sets the value of a digital pin as HIGH or LOW. Here, 5V (or 3.3V on 3.3V boards) for HIGH, 0V (ground) for LOW.

Syntax: digitalWrite(pin, val)

Де,

pin: PIN-код

val: HIGH або LOW

Прикладний код:

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
}
6
додано

digitalWrite sets the output pin to either LOW or HIGH (where those voltages depend on the Vcc of the processor. For a Uno or Mega that would be 0V or 5V (or close to it).

Ось скріншот цифровогозапису (LOW):

digitalWrite (LOW)

Тобто, вихідний штифт знаходиться на 0В.


Тепер для функції digitalWrite (HIGH):

Вихідна напруга 5В.

digitalWrite (HIGH)


analogWrite really should have been named PWMwrite since it configures the processor timers to output PWM (pulse-width modulation).

Давайте спробуємо analogWrite (1):

analogWrite (1)

Ви можете бачити, що рівень напруги в більшості випадків дорівнює 0В, а для коротких періодів - 5V. Ви також бачите, що частота становить 490 Гц, про що говорить довідкова сторінка для analogWrite буде.


Збільшення масштабу:

analogWrite (1) - zoomed

Вихід є високим для 8 мкс, що рівно 1/256 з 2048 мкс, що є періодом таймера. Отже, ми маємо робочий цикл 1/256 (0,39%).


Давайте спробуємо analogWrite (127) - на півдорозі від 0 до 255:

analogWrite (127)

Тепер ви можете бачити, що вихідний сигнал становить ВІЛ точно вдвічі менше, а LOW - інший час.


Давайте спробуємо analogWrite (254):

analogWrite (254)

This is the opposite of analogWrite (1). The output is HIGH all the time except for a brief period. Збільшення масштабу:

analogWrite (254) - zoomed

Тепер висновок off за 8 мкс - порівняно з попереднім зображенням, де він був включений протягом 8 мкс.


analogWrite (0) is the same as digitalWrite (LOW).

analogWrite (255) is the same as digitalWrite (HIGH).

Це підтверджується відповідним кодом у wiring_analog.c:

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

Резюме

analogWrite basically configures the hardware timers to output PWM. Once you do that the timer hardware outputs the requested duty cycle (from 0 to 255) where 0 is always off, 255 is always on, and some value inbetween gives you PWM (pulsed output).


Докладніше про таймери див. мою сторінку про таймери .

5
додано

DigitalWrite встановлює шпильку на високе або низьке значення, яке залишається на тому самому значенні, доки знову не буде викликаний цифровий запис.

analogWrite встановлює штифт, який має коливальне значення, яке має довжину імпульсу, засновану на робочому циклі, вказаному як другий параметр.

Тому:

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

analogWrite(): Writes an analog value (PWM wave) to a pin. Can be used to light a LED at varying brightnesses or drive a motor at various speeds. After a call to analogWrite(), the pin will generate a steady square wave of the specified duty cycle until the next call to analogWrite() (or a call to digitalRead() or digitalWrite() on the same pin). The frequency of the PWM signal on most pins is approximately 490 Hz. On the Uno and similar boards, pins 5 and 6 have a frequency of approximately 980 Hz. Pins 3 and 11 on the Leonardo also run at 980 Hz.

For details visit: https://www.arduino.cc/en/Reference/analogWrite

analogRead(): Reads the value from the specified analog pin. The Arduino board contains a 6 channel (8 channels on the Mini and Nano, 16 on the Mega), 10-bit analog to digital converter. This means that it will map input voltages between 0 and 5 volts into integer values between 0 and 1023. This yields a resolution between readings of: 5 volts/1024 units or, .0049 volts (4.9 mV) per unit. The input range and resolution can be changed using analogReference().

For details visit: https://www.arduino.cc/en/Reference/analogRead

2
додано

digitalWrite set the specified pin to one of two states - HIGH/LOW

Де, HIGH = 5 V і LOW = 0 V

analogWrite Set the PWM value of PWM pin

(У Arduino UNO, PWM висновки 3, 5, 6, 9, 10, 11)

Вона встановить шпильку на періодичний сигнал високого/низького рівня.

analogWrite(PWMpin,255)

Буде високим 100% часу, поки

analogWrite(PWMpin,127)

Буде високим 50% часу, і LOW 50% часу

1
додано

Так яка ж різниця між analogWrite (X, 255) і digitalWrite (X, HIGH)? Напевно, нічого, крім, можливо, процесор повинен зробити деякі додаткові речі, щоб розробити, що не потрібно використовувати PWM, а також стиль.

0
додано