Как вывести истинное аналоговое напряжение на выходной контакт
Что касается моей программы, это программа, которая выполняет некоторые вычисления, а затем выводит напряжение на основе результата с помощью функции AnalogWrite. Однако моя проблема заключается в том, что я программировал, основываясь на неправильном представлении о том, что функция AnalogWrite через ШИМ действительно выводит аналоговое напряжение, хотя на самом деле вместо этого оно только «имитирует» аналоговое напряжение.
Вот соответствующие части моего кода:
int pwmOutput = 11;
int pwm = 0;
void compareNewOldVoltageYes(void)
{
if(pv_Vnew > pv_Vold && pwm != 255)
{
++pwm; // увеличение значения
}
else if(pwm != 0)
{
--pwm; //уменьшение
}
}
void compareNewOldVoltageNo(void)
{
if(pv_Vnew > pv_Vold && pwm != 0)
{
--pwm;
}
else if(pwm != 255)
{
++pwm;
}
}
void loop()
{
reading();
PowerCalculation();
if(pv_NewP > pv_OldP)
{
compareNewOldVoltageYes();
}
else
{
compareNewOldVoltageNo();
}
analogWrite(pwmOutput, pwm); //аналоговая запись
float displayPWMvolt = pwm * 0.0196;
Serial.print("Output Voltage: ");
Serial.print(displayPWMvolt);
Serial.println(" V");
pv_OldP = pv_NewP;
Serial.print("Previous Power: ");
Serial.print(pv_OldP);
Serial.println(" W");
}
Что касается схемы, выходной контакт 11 подключается к резистору 1 Ом, а затем к GND. (где я измерил напряжение) Я использую плату Arduino Uno.
ОБНОВЛЕНИЕ:
Как сказано в комментариях @DatHa, ШИМ не выдает выходное напряжение. Есть ли способ получить указанное выходное напряжение без замены платы?
@bytk, 👍13
Обсуждение6 ответов
Лучший ответ:
В основном у вас есть три варианта:
- Переключитесь на Arduino Due со встроенным ЦАП, который выдает реальное напряжение.
- Добавьте внешний чип ЦАП (например, MCP4821/2), чтобы создать напряжение для вас.
- Используйте фильтр нижних частот (RC-сеть) на выводе ШИМ.
Из трех вариантов я обычно использую MCP4822, так как он дает наилучшие результаты и стоит не так дорого, как использование Due.
Спасибо. Вариант 2 звучит очень хорошо, но из-за нехватки времени я выбрал вариант 3 и получил желаемые результаты., @bytk
или используйте [лестницу R-2R] (https://en.wikipedia.org/wiki/Resistor_ladder) в качестве "ЦАП для бедняков", @Andre Holzner
@AndreHolzner Я считаю, что лестница R-2R такая же, как микросхема ЦАП, но со слишком большим количеством проводов, чтобы ее можно было использовать на обычном Arduino., @Majenko
@Majenko Я просто хотел добавить, что существуют «цифровые потенциометры» или «дигипоты», которые в значительной степени представляют собой лестницы R-2R внутри микросхемы DIP-8. Они дешевле ЦАПов. (например, X9C103), @Filip Franik
@FilipFranik За исключением того, что это не лестницы R-2R. Это просто цепочка резисторов с полевым транзистором, подключенным к каждому соединению между резисторами. Есть только R. Много R все равно. Да, если вы запишете его с двумя концами потенциометра на VCC и GND, вы получите что-то вроде ЦАП, но он страдает теми же проблемами импеданса, что и настоящий потенциометр. Он обеспечивает пару сопротивлений, тогда как ЦАП обеспечивает напряжение., @Majenko
Насколько мне известно, в платах Arduino есть АЦП (аналого-цифровые преобразователи), но нет ЦАП (цифро-аналоговых преобразователей). Таким образом, вы не можете вывести заданное напряжение с любых контактов на основе цифрового значения.
Ардуино на базе ARM обычно имеют по крайней мере один канал ЦАП., @KIIV
При напряжении 5 В резистор сопротивлением 1 Ом будет потреблять 1 А, что значительно превысит допустимые 40 мА. Пожалуйста, используйте резистор не менее 5/0,040=125 Ом для защиты контакта. И если вы поместите конденсатор между вашим резистором и землей, RC-цепь конденсатора сгладит ШИМ в аналоговое напряжение.
Попробуйте предложенный ответ @russell с резистором 47K и конденсатором 1uF, вы получите аналоговое напряжение на переходе для использования с электронной нагрузкой .
НЕТ.. Невозможно получить аналоговое напряжение от Arduino. Лучшее, что вы можете сделать, это использовать Arduino в качестве преобразователя понижающего напряжения в линейном или повышающем режиме с использованием регулятора напряжения, катушки индуктивности и MOSFET-транзистора. Вам также может понадобиться использовать Mega или Dulorme, которые обеспечивают частоту ШИМ, отличную от стандартных 50 Гц.
Удачи
Прямого пути нет.
Помимо @Majenko
Альтернативный способ: вы можете использовать H-мост, такой как L293d, для обеспечения непрерывного уровня. Многие самодельные инверторные схемы используют эту технику.
http://www.instructables.com/id/ Как сделать инвертор с помощью ARDUINO/?ALLSTEPS
Мне было интересно, даст ли это более стабильный результат.
Вам нужно добавить R параллельно C1, чтобы разрядить C1., @MatsK
- Не могу контролировать скорость двигателей постоянного тока с помощью analogWrite()
- Диапазон выходного напряжения от 0 до 5 В
- L298N издает звуковые сигналы и дает сбой при получении определенных значений AnalogWrite
- Запись нескольких входов в последовательный порт с использованием цикла while
- Arduino включение/затухание 5 светодиодов, схема действия
- Как одновременно управлять ШИМ и цифровыми контактами через Ethernet в Arduino
- Какова частота PWM-выхода на Arduino
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
PS Аналоговая запись использует ШИМ и НЕ производит аналогового напряжения., @Dat Ha
@DatHa значит ли это, что так нельзя? Есть ли другая функция для вывода аналогового напряжения?, @bytk
См. ответ @Russell на http://arduinoprosto.ru/q/10041/can-i-connect-a-pwm-pin-on-one-arduino-to-an-analog-input-on-another., @dhimaspw
@dpw Я не думаю, что это работает, поскольку моя программа должна подключаться к электронной нагрузке через внешний порт программирования и управлять ею с помощью 0–5 В., @bytk
ШИМ выдает конкретное напряжение, или я пират в год господа нашего 1734. Выше 8-битного значения не пройти, и всегда есть какая-то неточность в его считывании., @user400344