В чем разница между analogWrite и digitalWrite?
Как говорится в названии. В чем разница между ними?
analogWrite(pin,0-255)
vs digitalWrite(pin,LOW-HIGH)
@pijemcolu, 👍9
Обсуждение8 ответов
Лучший ответ:
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
digitalWrite устанавливает контакт на высокое или низкое значение, которое остается точно таким же, пока digitalWrite снова не вызовет этот контакт.
analogWrite устанавливает на вывод значение колебаний, которое имеет длительность импульса, основанную на рабочем цикле, указанном в качестве второго параметра.
Итак:
digitalWrite (5, HIGH); // Вывод 5 переходит на высокую
analogWrite (6, 127); // Вывод 6 регулярно колеблется между 0В и 5В (или 3,3В) при частоте около 250 Гц.
digitalWrite
устанавливает выходной вывод на НИЗКИЙ или ВЫСОКИЙ (где эти напряжения зависят от Vcc процессора. Для Uno или Mega это будет 0 В или 5 В (или близко к нему).
Вот скриншот digitalWrite (LOW):
То есть выходной вывод находится на 0В.
Теперь для digitalWrite (HIGH):
Выходное напряжение составляет 5 В.
analogWrite
действительно следовало бы назвать pwmWrite, поскольку он настраивает процессорные таймеры для вывода ШИМ (широтно-импульсная модуляция).
Давайте попробуем analogWrite(1):
Вы можете видеть, что уровень напряжения большую часть времени составляет 0 В, а на короткие промежутки времени достигает 5 В. Вы также видите, что частота составляет 490 Гц, и это то, что на справочной странице для analogWrite говорится, что это будет.
Масштабирование:
Выход высок в течение 8 мкс, что составляет ровно 1/256 из 2048 мкс, что является периодом таймера. Таким образом, у нас есть рабочий цикл 1/256 (0,39%).
Давайте попробуем analogWrite(127) - на полпути от 0 до 255:
Теперь вы можете видеть, что выход ВЫСОК ровно в половине случаев, а в остальное время НИЗКИЙ.
Давайте попробуем analogWrite(254):
Это противоположность analogWrite (1). Выход всегда ВЫСОК, за исключением короткого периода. Масштабирование:
Теперь выход выключен в течение 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 всегда включено, а некоторое значение между ними дает вам ШИМ (импульсный выход).
Для получения дополнительной информации о таймерах см. моя страница о таймерах.
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
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
}
Итак, в чем разница между analogWrite(X, 255) и digitalWrite(X, HIGH)? Вероятно, ничего, за исключением того, что, возможно, процессору придется сделать некоторые дополнительные вещи, чтобы понять, что ему не нужно использовать ШИМ, а также стиль.
digitalWrite установите указанный контакт в одно из двух состояний- ВЫСОКОЕ/НИЗКОЕ
Где ВЫСОКИЙ = 5 В и НИЗКИЙ = 0 В
analogWrite Установите значение ШИМ-вывода ШИМ-вывода
(В Arduino UNO ШИМ-контакты 3, 5, 6, 9, 10, 11)
Он установит вывод на периодический сигнал высокого/низкого уровня.
analogWrite(PWMpin,255)
Будет ВЫСОКИМ в 100% случаев, в то время как
analogWrite(PWMpin,127)
Будет ВЫСОКИМ в 50% случаев и НИЗКИМ в 50% случаев
Другое тонкое различие между analogWrite(pin, 255)
и digitalWrite(pin, HIGH)
заключается в том, что digitalWrite
требует, чтобы вы установили пин для вывода с помощью pinMode
. analogWrite
устанавливает пин для вывода при каждом вызове, что делает его медленнее и может разрушить код, который использует тот же пин в качестве альтернативы входу и выходу, и полагается на то, что запись на входной пин с помощью digitalWrite
не переключает его на выход.
- Есть ли способ воспроизводить звуки с Arduino без использования звукового экрана?
- Какова частота PWM-выхода на Arduino
- Как вывести истинное аналоговое напряжение на выходной контакт
- Отправка значения с одного Arduino на другой
- Что означает “LSB на градус в секунду” (LSB per degree per second)?
- Проблема с выходным контактом ШИМ (PWM)
- Пассивный зуммер работает с AnalogWrite(), но не с DigitalWrite(). Он также имеет постоянный статический шум.
- Как настроить ADC7 на Arduino Pro Mini в качестве цифрового выхода?
Я не хочу быть грубым, но что сбивало с толку в этой документации? arduino.cc или входит в состав IDE?, @linhartr22