Как прочитать значение PIN PWM-выхода?

Как получить значение вывода ШИМ, которое находится в выводе pinMode?

Как получить цифровое значение ВЫХОДНОГО PIN-кода:

#define pin 3

void setup()
{
  pinMode(pin, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
    delay(1000);
    digitalWrite(pin, HIGH);
    Serial.println(bitRead(PORTD,pin));
    delay(1000);
    digitalWrite(pin, LOW);
    Serial.println(bitRead(PORTD,pin));
}

В целях тестирования я хочу получить значение выходного контакта ШИМ.

Неправильный эскиз:

#define pin 3

void setup()
{
  pinMode(pin, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
    delay(1000);
    analogWrite(pin, 100);
    Serial.println(pulseIn(pin, HIGH)); // значение выходного контакта ШИМ
}

Этот эскиз создан только для примера. Я не знаю значения ШИМ, поскольку значение ШИМ будет генерироваться динамически. Не могли бы вы объяснить, как получить значение выходного контакта ШИМ?

, 👍0

Обсуждение

Вы не можете. Для него не существует какой-то одной «ценности», она постоянно меняется. Вы можете усреднить его через фильтр нижних частот и передать обратно через аналоговый вывод. Или вы можете подключить его к входному контакту и измерить ширину и частоту импульса, но вы не сможете сделать это на самом контакте. Не с обычными инструментами Arduino. Кроме того, вы уже знаете цену. Это «100», поскольку вы именно это и установили. Чего вы *на самом деле* пытаетесь достичь?, @Majenko

Кстати: первый скетч считывает значение из регистра POTD, а не значение на фактическом выводе. Например, он может быть закорочен, и регистр PIND прочитает его правильно. Можно прочитать фактическое значение (читая PIND), но, как писал Маженко, оно меняется, поэтому вам придется читать его с постоянной скоростью или измерять минимальное и максимальное время. Забавно, импульсный вход действительно должен работать, поскольку он должен использовать внутренний PIND., @KIIV

Возможно, вы сможете получить значение обратно, прочитав соответствующие регистры сравнения вывода используемого таймера (я думаю, что это используется для генерации, хотя я не проверял)., @chrisl

сохранить значение в переменной. это правильный путь. но если ваша задача состоит в том, чтобы прочитать сгенерированный ШИМ на аналоговом выводе, тогда https://arduinoprosto.ru/q/55698/read-analog-port-set-as-output/55700#55700, @Juraj


2 ответа


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

1

В соответствии с реализацией исходного кода функции analogWrite (Объяснение исходного кода аналоговой записи Arduino).

Вы можете использовать регистр OCRnx для чтения значения ШИМ.

,

Это будет OCR2B для контакта 3., @Gerben


1

Я хочу получить значение выходного контакта ШИМ.

Пин будет иметь значение 0 или 1.

analogWrite(pin, 100);

В 100/256 (39%) случаях оно будет равно 1, а в остальное время — 0.


Почему вы хотите это сделать?

,

Потому что я ищу решение этого вопроса без создания новой переменной для хранения значения ШИМ., @Kvartu

Как упоминалось в другом ответе, вы можете опросить регистр таймера, чтобы узнать, какое значение туда поместил AnalogWrite, но зачем вообще делать эту непонятную вещь (которая будет меняться для каждого выходного контакта), если вы можете сохранить значение в одном байте в переменной? Кроме того, это не «значение выходного контакта», а *рабочий цикл* выхода ШИМ., @Nick Gammon