Як вивести справжню аналогову напругу на вихідному штифті


12

Що стосується моєї програми, це програма, яка робить деякі обчислення, а потім виводить напругу на основі результату за допомогою функції analogWrite. Однак моя проблема полягає в тому, що я зробив своє програмування на основі помилкового уявлення, що функція 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 Ом, а потім до GND. (Де я вимірював напругу) я використовую плату Arduino Uno.

ОНОВЛЕННЯ :

Як сказано в коментарі @DatHa, pwm не видає напруги. Чи існує спосіб, як сказано, без напруги, не змінюючи плату?


PS Аналоговий запис використовує ШІМ, і він НЕ виробляє аналогової напруги.
Дат Ха

@DatHa це означає, що це неможливо зробити так? Чи є інша функція для виведення аналогової напруги?
bytk

Дивіться відповідь @Russell на arduino.stackexchange.com/questions/10041/…
dhimaspw

@dpw Я не думаю, що це працює, оскільки моя програма повинна підключатися до електронного навантаження через його зовнішній порт програмування та керувати ним за допомогою 0-5V.
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. Вони є просто ланцюгом резисторів з FET, підключеними до кожного з'єднання між резисторами. Є тільки R. Багато Rs все одно. Так, якщо ви записуєте його двома кінцями потенціометра до VCC та GND, ви отримуєте такий собі ЦАП, але він страждає тим же видом проблем з імпедансом, що і справжній потенціометр. Він забезпечує пару опорів, тоді як ЦАП забезпечує напругу.
Majenko

7

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

Будь ласка, спробуйте відповідь, запропоновану @russell, з резистором 47K і конденсатором 1uF, ви отримаєте аналогову напругу на стику для використання з вашим електронним навантаженням.


2

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


2
Arduinos на основі ARM зазвичай має щонайменше один канал ЦАП.
КИЇВ

0

НЕТ .. Немає можливості отримати аналогову напругу від Arduino. Найкраще, що ви можете зробити, це використовувати Arduino в якості перетворювача напруги Бака в лінійному або підсилювальному режимах, використовуючи регулятор напруги, індуктор і транзистор MOSFET. Також вам може знадобитися використовувати Мега або Дулорме, які забезпечують частоту ШІМ, відмінну від стандартної 50о Гц.

Найкраща удача


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.