Come emettere una vera tensione analogica sul pin di uscita


12

Per quanto riguarda il mio programma, è un programma che esegue alcuni calcoli e quindi emette una tensione in base al risultato utilizzando la funzione analogWrite. Tuttavia, il mio problema è che avevo programmato sulla base di un'idea errata che la funzione analogWrite tramite PWM emettesse una tensione analogica, dove invece "simula" solo la tensione analogica.

Ecco le parti rilevanti del mio codice:

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

}

Per quanto riguarda i circuiti, il pin di uscita 11 viene collegato a una resistenza da 1 ohm e quindi a GND. (Dove ho misurato la tensione) Sto usando la scheda Arduino Uno.

AGGIORNAMENTO :

Come detto nei commenti di @DatHa, pwm non genera tensione. C'è un modo per generare tensione come detto, senza cambiare la scheda?


PS La scrittura analogica utilizza PWM e NON produce una tensione analogica.
Dat Ha,

@DatHa significa che non può essere fatto in questo modo? Esiste un'altra funzione per l'uscita della tensione analogica?
dal


@dpw Non penso che funzioni perché il mio programma deve connettersi a un carico elettronico tramite la sua porta di programmazione esterna e controllarlo usando 0-5V.
dal

PWM emette una tensione specifica, o sono un pirata nell'anno del nostro Lord 1734. Non puoi andare oltre un valore di 8 bit e c'è sempre qualche imprecisione nella lettura.
user400344,

Risposte:


11

Fondamentalmente hai tre opzioni:

  1. Passa a un Arduino Due che ha un DAC incorporato che emette una tensione reale.
  2. Aggiungi un chip DAC esterno (come l'MCP4821 / 2) per creare la tensione adatta a te
  3. Utilizzare un filtro passa-basso (rete RC) su un pin PWM.

Delle tre opzioni di solito utilizzo un MCP4822 poiché offre i migliori risultati e non costa quanto l'utilizzo di Due.


Grazie. L'opzione 2 suona davvero bene, ma a causa dei limiti di tempo, sono andata avanti con l'opzione 3 e ho ottenuto i risultati desiderati.
dal

1
o usa una scala R-2R come "DAC per poveri"
Andre Holzner,

1
@AndreHolzner Conto una scala R-2R uguale a un chip DAC ma con troppi fili per renderlo pratico sul tuo Arduino medio.
Majenko

@Majenko Volevo solo aggiungere che esistono "potenziometri digitali" o "digipot" che sono praticamente scale R-2R all'interno di un chip DIP-8. Sono più economici dei DAC. (Ad esempio X9C103)
Filip Franik,

1
@FilipFranik Tranne il fatto che non sono scale R-2R. Sono solo una catena di resistori con un FET collegato ad ogni connessione tra resistori. C'è solo R. Molte R tutte uguali. Sì, se lo scrivi con le due estremità del potenziometro su VCC e GND ottieni un tipo di DAC, ma subisce lo stesso tipo di problemi di impedenza di un vero potenziometro. Fornisce una coppia di resistenze, mentre un DAC fornisce una tensione.
Majenko

7

A 5 V, una resistenza da 1 ohm proverà ad affondare 1 A e supererà di gran lunga le specifiche di 40 mA. Utilizzare almeno una resistenza 5 / 0,040 = 125 ohm per proteggere il pin. E se si inserisce un condensatore tra resistenza e terra, il circuito RC del condensatore appianerà il PWM in una tensione analogica.

Prova la risposta @russell suggerita con un resistore 47K e un condensatore 1uF, otterrai una tensione analogica alla giunzione da utilizzare con il tuo carico elettronico.


2

Per quanto ne so, gli Arduinos hanno ADC (Convertitori da analogico a digitale) ma non hanno alcun DAC (Convertitori da digitale ad analogico). Quindi non è possibile emettere una tensione impostata da alcun pin in base a un valore digitale.


2
Gli Arduinos basati su ARM di solito hanno almeno un canale DAC.
KIIV,

0

NO .. Non c'è modo di ottenere una tensione analogica dall'Arduino. Il meglio che puoi fare è usare Arduino come convertitore di tensione buck in modalità lineare o boost utilizzando un regolatore di tensione, un induttore e il transistor mosfet. Potrebbe anche essere necessario utilizzare un Mega o Dulorme che fornisce una frequenza PWM diversa dallo standard 50o Hz.

Buona fortuna


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.