Как вывести истинное аналоговое напряжение на выходной контакт

Что касается моей программы, это программа, которая выполняет некоторые вычисления, а затем выводит напряжение на основе результата с помощью функции 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, ШИМ не выдает выходное напряжение. Есть ли способ получить указанное выходное напряжение без замены платы?

, 👍13

Обсуждение

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


6 ответов


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

13

В основном у вас есть три варианта:

  1. Переключитесь на Arduino Due со встроенным ЦАП, который выдает реальное напряжение.
  2. Добавьте внешний чип ЦАП (например, MCP4821/2), чтобы создать напряжение для вас.
  3. Используйте фильтр нижних частот (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


2

Насколько мне известно, в платах Arduino есть АЦП (аналого-цифровые преобразователи), но нет ЦАП (цифро-аналоговых преобразователей). Таким образом, вы не можете вывести заданное напряжение с любых контактов на основе цифрового значения.

,

Ардуино на базе ARM обычно имеют по крайней мере один канал ЦАП., @KIIV


7

При напряжении 5 В резистор сопротивлением 1 Ом будет потреблять 1 А, что значительно превысит допустимые 40 мА. Пожалуйста, используйте резистор не менее 5/0,040=125 Ом для защиты контакта. И если вы поместите конденсатор между вашим резистором и землей, RC-цепь конденсатора сгладит ШИМ в аналоговое напряжение.

Попробуйте предложенный ответ @russell с резистором 47K и конденсатором 1uF, вы получите аналоговое напряжение на переходе для использования с электронной нагрузкой .

,

0

НЕТ.. Невозможно получить аналоговое напряжение от Arduino. Лучшее, что вы можете сделать, это использовать Arduino в качестве преобразователя понижающего напряжения в линейном или повышающем режиме с использованием регулятора напряжения, катушки индуктивности и MOSFET-транзистора. Вам также может понадобиться использовать Mega или Dulorme, которые обеспечивают частоту ШИМ, отличную от стандартных 50 Гц.

Удачи

,

1

Прямого пути нет.

Помимо @Majenko

Альтернативный способ: вы можете использовать H-мост, такой как L293d, для обеспечения непрерывного уровня. Многие самодельные инверторные схемы используют эту технику.

http://www.instructables.com/id/ Как сделать инвертор с помощью ARDUINO/?ALLSTEPS

,

0

Мне было интересно, даст ли это более стабильный результат.

PWN представлен RC. Зарядка конденсатора, выборка производится другим аналоговым входом. Когда на выводе PWN становится низкий уровень, медленно разрядка цоколя.Может, нужен большой резистор параллельно цоколю для медленного разряда?

,

Вам нужно добавить R параллельно C1, чтобы разрядить C1., @MatsK