Запись аналоговых напряжений на аналоговых выводах Arduino
Можем ли мы записать аналоговое напряжение на аналоговые контакты A0
-A7
Arduino Nano (например)?
Как в:
pinMode(A3, OUTPUT);
analogWrite(A3, 200);
@Nishanth Rao, 👍3
4 ответа
analogWrite — это цифровые выводы ШИМ. Аналоговые выводы на Nano — это только чтение/ввод АЦП (или цифровой ввод/вывод, за исключением A6 и A7).
Нет. Функция analogWrite(pin, val)
зарезервирована для выводов ШИМ (D3
, D5
, D6
, D9
, D10
и D11
в Arduino Nano). Выводы, обозначенные на плате как «ANALOG IN», могут работать как аналоговый вход (для аналогово-цифрового преобразователя), цифровой вход или цифровой выход.
Стоит отметить, что Arduino Nano (и любая другая известная мне плата Arduino) на самом деле не имеет никакого «истинного» аналогового выходного порта. Когда вы используете analogWrite(pin, val)
, вы фактически говорите Arduino выводить сигнал ШИМ с рабочим циклом, указанным в val
(100% для val = 255
и 0% для val = 0
). Если вам действительно нужен настоящий аналоговый выход, вам следует рассмотреть возможность использования любой формы аналогового фильтра нижних частот на указанном выходном порту ШИМ. В зависимости от того, насколько чистым вы хотите получить свой сигнал, вы можете использовать один конденсатор или любой другой (немного более сложный) фильтр.
Если вы ничего не знаете о фильтрах, это может быть хорошей отправной точкой: ElectronicsTutorials - Пассивный фильтр нижних частот
Более подробную информацию о ШИМ в Arduino можно найти здесь: EAS 199 — Базовая широтно-импульсная модуляция
Все микроконтроллеры, включая Arduino, являются цифровыми и полагаются на специфическое аппаратное обеспечение схемы для взаимодействия с аналоговым миром. Два из них относятся к вашему вопросу:
- Аналогово-цифровые преобразователи (АЦП) измеряют аналоговое напряжение и выводят число, представляющее напряжение относительно диапазона измерения — например, от 0 до 1023 для 10-битного АЦП.
- Цифро-аналоговые преобразователи (ЦАП) выполняют обратный процесс, в котором цифровое число от микроконтроллера используется для вывода аналогового напряжения, например, между землей и напряжением питания.
Хотя АЦП и ЦАП преобразуют аналого-цифровые сигналы и наоборот, им нужны разные схемы. В случае плат Arduino и других микроконтроллеров аналоговый вход (чтение) и выход (запись) должны использовать разные контакты. Аналоговые входные контакты не могут использоваться как выходы, и наоборот.
Исключением является случай, когда вы хотите создать аналоговый выход через ШИМ (и сглаживающий конденсатор). В этом случае ответ — да, вы можете использовать контакты A0-A7. Однако вам понадобится бит-банг, и вы не сможете использовать аппаратное обеспечение таймера. Гораздо проще использовать контакты, предназначенные для ЦАП или analogwrite
, если это для вас вариант.
Вы можете создать свой собственный ШИМ на не-ШИМ-контактах, используя технику Blink Without Delay. Используйте таймер micros() и проверяйте его каждый проход через loop(), чтобы узнать, пришло ли время изменить состояние выхода.
Это создаст 50% рабочий цикл с частотой = 1/(2 x halfPeriod)
void loop(){
currentMicros = micros(); // захват текущего «времени»
elapsedMicros = currentMicros - previousMicros;
if (elapsedMicros >= halfPeriod){
previousMicros = previousMicros + halfPeriod; // установить «время» следующего перехода
}
}
все элементы, связанные со временем, имеют тип unsigned long
Затем отфильтруйте его с помощью RC-фильтра нижних частот (резистор и конденсатор), чтобы сгладить его и сделать более похожим на аналоговый уровень.
- Уменьшить яркость светодиода с помощью NPN-транзистора
- установка выходного аналогового/цифрового контакта на землю
- Помогите с простым постепенно более ярко светящим светодиодом
- Оператор IF для запуска, даже если требование больше не выполняется
- Можно ли использовать AnalogWrite() с использованием внешнего блока питания?
- avrdude ser_open() can't set com-state
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Какое максимальное энергопотребление Arduino Nano 3.0?