Можно ли измерить аналоговый выход?

Я использую ШИМ для управления яркостью светодиода с помощью MOSFET, используя analogWrite(pwmPin,val), а val – это 12-битное значение.

pwmPin определяется как- pinMode(pwmPin, OUTPUT);

Поскольку val изменяется во времени из-за внешней молнии, я хочу измерить значение ШИМ для последующего использования в коде. Использование analogRead(pwnPin) привело к изменению значений в диапазоне 7–14.

Есть ли способ измерить значение ШИМ, определенное как выход?

Обновление 1:

Сохранение значения val не спасет проблему, которую я ищу, поскольку код достигает фазы deepSeleep, которая val может быть сохранено, но мне нужно фактическое указание его значения и действительно ли оно включено.

, 👍0

Обсуждение

Почему бы не сохранить val и не рассчитать, что вам нужно в зависимости от этого? Это кажется лучше, чем измерять что-то, что вы уже знаете (или знали), как это есть/было в переменной val., @Michel Keijzers

@MichelKeijzers - см. EDIT1 в моем вопросе, @Guy . D

@Guy.D «Я хочу фактическое указание его значения». Когда вы измеряете результат, вы фактически пишете код только для проверки своего кода. В большинстве случаев это действительно не имеет смысла. Если ваш код написан правильно, вы можете быть уверены, что вывод будет делать то, что вы хотите. Любое событие, которое может изменить это (например, какой-либо аппаратный сбой), с большой вероятностью также повлияет на ваш тестовый код, которому вы также не можете доверять. Зачем вам вообще нужна эта индикация? Если для безопасности, то вам следует подумать о сценариях, которые вы хотите охватить, а затем создать для этой цели отдельное устройство., @chrisl

Тот факт, что вы спите, не имеет значения. Если вы сохраните в переменной значение, которое вы использовали для analogWrite(), оно останется там, когда вы проснетесь., @Edgar Bonet

Аналоговое чтение не с аналоговых контактов, а аналоговая запись с цифровых контактов? И разве у аналоговых и цифровых контактов нет собственных номеров (цифровой 0 — это другой контакт, чем аналоговый 0)?, @user253751

Извините, но я не слежу...., @Guy . D

вы можете использовать RC-фильтр для выборки среднего напряжения., @dandavis


1 ответ


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

6

Во-первых, зачем вам нужно измерять значение ШИМ. Вы уже это знаете; он сохраняется в переменной val. Почему бы просто не использовать эту переменную для дальнейшего использования в коде?

Во-вторых: выполнение аналогового чтения на том же контакте, что и выход ШИМ, не сработает. Внутри есть 2 различных аппаратных периферийных устройства, которые отвечают за эти функции: АЦП отвечает за измерение аналоговых напряжений, а один из таймеров отвечает за генерацию выходного сигнала ШИМ. Только один из них может подключиться к пину в любой момент времени. Таким образом, вы не измеряете сигнал ШИМ, когда выполняете analogRead(pwmPin). Эта функция устанавливает вывод для измерения аналогового напряжения (означает, что он подключается к АЦП и настраивает АЦП) и, таким образом, отключает оборудование таймера.

В-третьих: выполнение analogRead() непосредственно для ШИМ-сигнала не сработает. ШИМ по-прежнему является цифровым сигналом, поэтому измерение его аналогового напряжения даст только значения от 0 до 1023. Этот сигнал преобразуется в реальное аналоговое напряжение через фильтр нижних частот, либо электрически, либо механически (здесь я имею в виду, что механические элементы часто не могут следовать относительно быстрый ШИМ-сигнал (например, двигатель или динамик), эффективно использующий фильтр нижних частот).

Как тогда измерить ШИМ-сигнал? Во-первых, вам определенно нужно использовать другой контакт, а не выходной контакт ШИМ. Тогда у вас есть 2 способа измерения текущего значения ШИМ:

  1. Вы можете подключить выход ШИМ к фильтру нижних частот (комбинация резистора и конденсатора; вы можете найти это в Google и получить очень подробные описания), а выход фильтра нижних частот - к аналоговому входу Ардуино. Затем вы можете использовать analogRead() для измерения текущего значения.

  2. Вы можете напрямую измерить ШИМ-сигнал, то есть измерить фактическую ширину импульса сигнала. Есть несколько способов сделать это, одним из которых является функция pulseIn(), которая ожидает завершения импульса и возвращает длину импульса.

,