Jak wyprowadzić prawdziwe napięcie analogowe na pin wyjściowy


12

Jeśli chodzi o mój program, jest to program, który wykonuje pewne obliczenia, a następnie wyprowadza napięcie na podstawie wyniku za pomocą funkcji analogWrite. Jednak moim problemem jest to, że wykonałem programowanie w oparciu o błędne przekonanie, że funkcja AnalogWrite przez PWM generuje napięcie analogowe, podczas gdy w rzeczywistości zamiast tego „symuluje” napięcie analogowe.

Oto odpowiednie części mojego kodu:

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");

}

Jeśli chodzi o zespół obwodów, styk wyjściowy 11 jest podłączony do rezystora 1 om, a następnie do GND. (Gdzie zmierzyłem napięcie) Używam płyty Arduino Uno.

AKTUALIZACJA :

Jak powiedziano w komentarzach @DatHa, PWM nie wytwarza napięcia wyjściowego. Czy istnieje sposób na napięcie wyjściowe, jak wspomniano, bez zmiany płyty?


PS Zapis analogowy wykorzystuje PWM i NIE wytwarza napięcia analogowego.
Dat Ha

@DatHa czy to oznacza, że ​​nie można tego zrobić w ten sposób? Czy jest jeszcze inna funkcja wyjściowego napięcia analogowego?
bytk


@dpw Nie sądzę, że to działa, ponieważ mój program musi podłączyć się do obciążenia elektronicznego za pośrednictwem zewnętrznego portu programowania i sterować nim za pomocą 0-5 V.
bytk

PWM wyprowadza określone napięcie, albo jestem piratem w roku naszego Pana 1734. Nie możesz przekroczyć wartości 8-bitowej i zawsze jest trochę niedokładności w jej odczytaniu.
user400344,

Odpowiedzi:


11

Zasadniczo masz trzy opcje:

  1. Przełącz na Arduino Due z wbudowanym przetwornikiem cyfrowo-analogowym, który generuje napięcie rzeczywiste.
  2. Dodaj zewnętrzny układ DAC (taki jak MCP4821 / 2), aby stworzyć dla Ciebie napięcie
  3. Użyj filtra dolnoprzepustowego (sieć RC) na pinie PWM.

Z trzech opcji zwykle korzystam z MCP4822, ponieważ daje najlepsze wyniki i nie kosztuje tyle, co korzystanie z Due.


Dziękuję Ci. Opcja 2 brzmi naprawdę dobrze, ale ze względu na ograniczenia czasowe wybrałem opcję 3 i uzyskałem pożądane wyniki.
bytk

1
lub użyj drabiny R-2R jako „przetwornika biedaka”
Andre Holzner

1
@AndreHolzner Liczę drabinę R-2R tak samo jak układ DAC, ale ze zbyt dużą liczbą przewodów, aby była praktyczna na przeciętnym Arduino.
Majenko

@Majenko Chciałem tylko dodać, że istnieją „potencjometry cyfrowe” lub „digipoty”, które są właściwie drabinkami R-2R w układzie DIP-8. Są tańsze niż przetworniki cyfrowo-analogowe. (Na przykład X9C103)
Filip Franik

1
@FilipFranik Tyle, że nie są to drabiny R-2R. To tylko łańcuch rezystorów z FET podłączonym do każdego połączenia między rezystorami. Jest tylko R. Wiele Rs jednakowo. Tak, jeśli napiszesz to z dwoma końcami potencjometru do VCC i GND, otrzymasz coś w rodzaju przetwornika cyfrowo-analogowego, ale cierpi on na takie same problemy impedancji, jakie robi prawdziwy potencjometr. Zapewnia parę rezystancji, podczas gdy przetwornik DAC zapewnia napięcie.
Majenko

7

Przy napięciu 5 V rezystor 1 Ω będzie próbował obniżyć 1 A i znacznie przekroczyć specyfikację 40 mA. Użyj rezystora co najmniej 5 / 0,040 = 125 omów, aby zabezpieczyć pin. A jeśli umieścisz kondensator między rezystorem a masą, obwód RC kondensatora wygładzi PWM do napięcia analogowego.

Wypróbuj sugerowaną odpowiedź @russell z rezystorem 47K i kondensatorem 1uF, otrzymasz napięcie analogowe na złączu do użycia z obciążeniem elektronicznym.


2

O ile wiem Arduinos mają ADC (przetworniki analogowo-cyfrowe), ale nie mają żadnych przetworników DAC (cyfrowo-analogowych). Nie można więc wyprowadzić ustawionego napięcia z żadnych styków na podstawie wartości cyfrowej.


2
Arduinos oparte na ARM zwykle mają co najmniej jeden kanał DAC.
KIIV

0

NIE .. Nie ma możliwości uzyskania analogowego napięcia z Arduino. Najlepsze, co możesz zrobić, to użyć Arduino jako konwertera napięcia Buck w trybie liniowym lub doładowania za pomocą regulatora napięcia, cewki indukcyjnej i tranzystora mosfet. Konieczne może być również użycie Mega lub Dulorme, które zapewniają częstotliwość PWM inną niż standardowa 50o Hz.

Powodzenia


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.