В чем разница между analogWrite и digitalWrite?

Как говорится в названии. В чем разница между ними?

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

, 👍9

Обсуждение

Я не хочу быть грубым, но что сбивало с толку в этой документации? arduino.cc или входит в состав IDE?, @linhartr22


8 ответов


Лучший ответ:

18

digitalWrite установит указанный вывод в одно из двух состояний - ВЫСОКОЕ/НИЗКОЕ, которые равны 5 В (3,3 В на некоторых платах) и заземлению соответственно.

Аналоговая запись может варьироваться в зависимости от типа используемого вывода.

Если применить к ШИМ - выводу-он установит вывод на периодический высокий/низкий сигнал, где процент затраченного высокого сигнала пропорционален записанному значению. например -

    analogWrite(PWMpin,255)

Будет ВЫСОКИМ в 100% случаев, в то время как

    analogWrite(PWMpin,127)

Будет ВЫСОКИМ в 50% случаев и НИЗКИМ в 50% случаев

При применении аналоговой записи к контакту ЦАП (доступно на некоторых платах, таких как DUE или MEGA) analogWrite фактически приведет к тому, что указанный вывод выведет уровень напряжения, соответствующий указанному аналоговому значению

Например, на должном, с максимальным напряжением 3,3 В и аналоговым разрешением по умолчанию 8 бит -[0:255]

    analogWrite(DACpin,255)

Приведет к тому, что указанный вывод выведет 3,3 В, и-

    analogWrite(DACpin,127)

Приведет к тому, что указанный вывод выведет 1,35 В

,

Нет, на Мега нет ЦАП., @Edgar Bonet

вы правы, ответ отредактирован, чтобы отразить это., @TanyaV

Здорово. Я взял на себя смелость сделать редактирование более кратким., @Edgar Bonet

Я считаю, что существует определение или константа "maxanalog", чтобы обеспечить лучшую совместимость с другими платформами. esp8266 имеет аналоговую запись, которая может варьироваться от 0 до 1024. *Я выцарапал несколько волосков, пытаясь понять, почему мой светодиодный контроллер RGB не был бы таким ярким с тем же кодом, думал, что это связано с разницей в мощности или напряжении, но я использовал МОП-транзистор с подходящим коэффициентом усиления (усиления?). Он был просто включен в течение (1024/256) времени., @Paul


3

digitalWrite устанавливает контакт на высокое или низкое значение, которое остается точно таким же, пока digitalWrite снова не вызовет этот контакт.

analogWrite устанавливает на вывод значение колебаний, которое имеет длительность импульса, основанную на рабочем цикле, указанном в качестве второго параметра.

Итак:

digitalWrite (5, HIGH);    // Вывод 5 переходит на высокую
analogWrite (6, 127);      // Вывод 6 регулярно колеблется между 0В и 5В (или 3,3В) при частоте около 250 Гц.
,

7

digitalWrite устанавливает выходной вывод на НИЗКИЙ или ВЫСОКИЙ (где эти напряжения зависят от Vcc процессора. Для Uno или Mega это будет 0 В или 5 В (или близко к нему).

Вот скриншот digitalWrite (LOW):

digitalWrite (LOW)

То есть выходной вывод находится на 0В.


Теперь для digitalWrite (HIGH):

Выходное напряжение составляет 5 В.

digitalWrite (HIGH)


analogWrite действительно следовало бы назвать pwmWrite, поскольку он настраивает процессорные таймеры для вывода ШИМ (широтно-импульсная модуляция).

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

analogWrite (1)

Вы можете видеть, что уровень напряжения большую часть времени составляет 0 В, а на короткие промежутки времени достигает 5 В. Вы также видите, что частота составляет 490 Гц, и это то, что на справочной странице для analogWrite говорится, что это будет.


Масштабирование:

analogWrite (1) - масштабирование

Выход высок в течение 8 мкс, что составляет ровно 1/256 из 2048 мкс, что является периодом таймера. Таким образом, у нас есть рабочий цикл 1/256 (0,39%).


Давайте попробуем analogWrite(127) - на полпути от 0 до 255:

analogWrite (127)

Теперь вы можете видеть, что выход ВЫСОК ровно в половине случаев, а в остальное время НИЗКИЙ.


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

analogWrite (254)

Это противоположность analogWrite (1). Выход всегда ВЫСОК, за исключением короткого периода. Масштабирование:

analogWrite (254) - масштабирование

Теперь выход выключен в течение 8 мкс - по сравнению с предыдущим изображением, где он был включен в течение 8 мкс.


analogWrite (0) совпадает с digitalWrite (LOW).

analogWrite (255) совпадает с digitalWrite (HIGH).

Это доказано соответствующим кодом в wiring_analog.c:

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

Резюме

analogWrite в основном настраивает аппаратные таймеры для вывода ШИМ. Как только вы это сделаете, оборудование таймера выведет запрошенный рабочий цикл (от 0 до 255), где 0 всегда выключено, 255 всегда включено, а некоторое значение между ними дает вам ШИМ (импульсный выход).


Для получения дополнительной информации о таймерах см. моя страница о таймерах.

,

2

analogWrite(): Записывает аналоговое значение (ШИМ-волну) на вывод. Может использоваться для освещения светодиода с различной яркостью или для привода двигателя на различных скоростях. После вызова analogWrite() вывод будет генерировать устойчивую квадратную волну указанного рабочего цикла до следующего вызова analogWrite() (или вызова digitalRead() или digitalWrite() на том же выводе). Частота ШИМ - сигнала на большинстве контактов составляет примерно 490 Гц. На платах Uno и аналогичных платах контакты 5 и 6 имеют частоту приблизительно 980 Гц. Контакты 3 и 11 на Леонардо также работают на частоте 980 Гц.

Для получения более подробной информации посетите: https://www.arduino.cc/en/Reference/analogWrite

analogRead(): Считывает значение с указанного аналогового вывода. Плата Arduino содержит 6 каналов (8 каналов на Mini и Nano, 16 на Mega), 10-битный аналого - цифровой преобразователь. Это означает, что он будет отображать входные напряжения от 0 до 5 вольт в целочисленные значения от 0 до 1023. Это дает разрешение между показаниями: 5 вольт / 1024 единицы или 0,0049 вольт (4,9 мВ) на единицу. Диапазон ввода и разрешение можно изменить с помощью analogReference().

Для получения более подробной информации посетите: https://www.arduino.cc/en/Reference/analogRead

,

9

analogWrite(): Метод analogWrite() устанавливает значение выходного вывода ШИМ. analogWrite() находится в масштабе от 0 до 255, так что analogWrite(255) запрашивает 100% - ный рабочий цикл (всегда включен), а analogWrite(127) - 50% - ный рабочий цикл (в половине случаев).

Рабочий цикл ШИМ

Синтаксис: analogWrite(pin, val)

Где,

pin: номер вывода ШИМ.

val: int значение рабочего цикла от 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: Метод digitalWrite() устанавливает значение цифрового PIN как ВЫСОКОЕ или НИЗКОЕ. Здесь 5 В (или 3,3 В на платах 3,3 В) для ВЫСОКИХ, 0 В (земля) для низких.

Синтаксис: digitalWrite(pin, val)

Где,

pin: номер контакта

val: ВЫСОКИЙ или НИЗКИЙ

Пример кода:

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
}
,

0

Итак, в чем разница между analogWrite(X, 255) и digitalWrite(X, HIGH)? Вероятно, ничего, за исключением того, что, возможно, процессору придется сделать некоторые дополнительные вещи, чтобы понять, что ему не нужно использовать ШИМ, а также стиль.

,

2

digitalWrite установите указанный контакт в одно из двух состояний- ВЫСОКОЕ/НИЗКОЕ

Где ВЫСОКИЙ = 5 В и НИЗКИЙ = 0 В

analogWrite Установите значение ШИМ-вывода ШИМ-вывода

(В Arduino UNO ШИМ-контакты 3, 5, 6, 9, 10, 11)

Он установит вывод на периодический сигнал высокого/низкого уровня.

analogWrite(PWMpin,255)

Будет ВЫСОКИМ в 100% случаев, в то время как

analogWrite(PWMpin,127)

Будет ВЫСОКИМ в 50% случаев и НИЗКИМ в 50% случаев

,

0

Другое тонкое различие между analogWrite(pin, 255) и digitalWrite(pin, HIGH) заключается в том, что digitalWrite требует, чтобы вы установили пин для вывода с помощью pinMode. analogWrite устанавливает пин для вывода при каждом вызове, что делает его медленнее и может разрушить код, который использует тот же пин в качестве альтернативы входу и выходу, и полагается на то, что запись на входной пин с помощью digitalWrite не переключает его на выход.

,