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


12

Что касается моей программы, это программа, которая выполняет некоторые вычисления, а затем выводит напряжение на основе результата, используя функцию analogWrite. Однако моя проблема заключается в том, что я выполнил свое программирование, основываясь на неправильном представлении о том, что функция аналогового ввода через ШИМ выдает аналоговое напряжение, хотя на самом деле оно вместо этого только «имитирует» аналоговое напряжение.

Вот соответствующие части моего кода:

int pwmOutput = 11;
int pwm = 0;

void compareNewOldVoltageYes(void)
{
  if(pv_Vnew > pv_Vold && pwm != 255)
  {
    ++pwm;           //increasing value
  }
  else if(pwm != 0)
  {
    --pwm;           //decreasing
  }
}

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);           //analogWrite

   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 Ом, а затем к заземлению. (Где я измерил напряжение) Я использую плату Arduino Uno.

ОБНОВЛЕНИЕ :

Как сказано в комментариях @DatHa, ШИМ не выводит напряжение. Есть ли способ вывода напряжения как сказано, не меняя плату?


PS Аналоговая запись использует ШИМ, и она НЕ производит аналоговое напряжение.
Дата Ха

@ DatHa это означает, что это не может быть сделано таким образом? Есть ли другая функция для вывода аналогового напряжения?
Bytk


@dpw Я не думаю, что это работает, так как моя программа должна подключаться к электронной нагрузке через внешний порт программирования и управлять им, используя 0-5В.
Bytk

ШИМ выдает определенное напряжение, или я пират в год нашего Господа 1734. Вы не можете превысить 8-битное значение, и всегда есть некоторая неточность в его чтении.
user400344

Ответы:


11

У вас есть три варианта:

  1. Переключитесь на Arduino Due, который имеет встроенный ЦАП, который выводит реальное напряжение.
  2. Добавьте внешний чип ЦАП (например, MCP4821 / 2), чтобы создать напряжение для вас
  3. Используйте фильтр нижних частот (сеть RC) на выводе ШИМ.

Из трех вариантов я обычно использую MCP4822, поскольку он дает наилучшие результаты и стоит меньше, чем использование Due.


Спасибо. Вариант 2 звучит очень хорошо, но из-за нехватки времени я выбрал вариант 3 и получил желаемые результаты.
Bytk

1
или используйте лестницу R-2R как «ЦАП бедняка»
Андре Хольцнер,

1
@ AndreHolzner Я считаю R-2R таким же, как чип ЦАП, но со слишком большим количеством проводов, чтобы сделать его практичным для вашего среднего Arduino.
Majenko

@Majenko Я просто хотел добавить, что существуют «цифровые потенциометры» или «дигипоты», которые в значительной степени представляют собой R-2R-лестницы внутри чипа DIP-8. Они дешевле, чем ЦАП. (Например, X9C103)
Филип Франик,

1
@FilipFranik За исключением того, что они не R-2R лестницы. Это просто цепь резисторов с полевым транзистором, подключенным к каждому соединению между резисторами. Есть только R. Многие Rs все одинаковы. Да, если вы записываете его с двух концов потенциометра на VCC и GND, вы получаете тип ЦАП, но он испытывает те же проблемы с импедансом, что и настоящий потенциометр. Он обеспечивает пару сопротивлений, в то время как ЦАП обеспечивает напряжение.
Majenko

7

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

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


2

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


2
Arduinos на базе ARM обычно имеют по крайней мере один канал ЦАП.
КИЕВ

0

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

Удачи


0

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

В дополнение к @Majenko

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

http://www.instructables.com/id/How-to-Make-an-Inverter-Using-ARDUINO/?ALLSTEPS

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.