Cómo emitir un voltaje analógico verdadero en el pin de salida

12

Con respecto a mi programa, es un programa que hace algunos cálculos y luego genera un voltaje basado en el resultado usando la función analogWrite. Sin embargo, mi problema es que había hecho mi programación en base a una idea errónea de que la función analogWrite a través de PWM genera una tensión analógica, donde en realidad solo "simula" la tensión analógica.

Aquí están las partes relevantes de mi código:

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

}

En cuanto a los circuitos, el pin de salida 11 se está conectando a una resistencia de 1 ohm y luego a GND. (Donde medí el voltaje) Estoy usando la placa Arduino Uno.

ACTUALIZACIÓN :

Como se dijo en los comentarios de @DatHa, pwm no genera voltaje. ¿Hay alguna forma de salida de voltaje como se dijo, sin cambiar la placa?

bytk
fuente
La escritura analógica PS utiliza PWM y NO produce un voltaje analógico.
Dat Ha
@DatHa, ¿eso significa que no se puede hacer de esta manera? ¿Hay otra función para emitir voltaje analógico?
bytk
Vea la respuesta de @Russell
dhimaspw
@dpw No creo que funcione ya que mi programa tiene que conectarse a una carga electrónica a través de su puerto de programación externo y controlarlo usando 0-5V.
bytk
PWM emite un voltaje específico, o soy un pirata en el año de nuestro Lord 1734. No se puede superar un valor de 8 bits, y siempre hay alguna imprecisión al leerlo.
user400344

Respuestas:

11

Básicamente tienes tres opciones:

  1. Cambie a un Arduino Due que tiene un DAC incorporado que genera un voltaje real.
  2. Agregue un chip DAC externo (como el MCP4821 / 2) para crear el voltaje por usted
  3. Use un filtro de paso bajo (red RC) en un pin PWM.

De las tres opciones, usualmente uso un MCP4822 ya que brinda los mejores resultados y no cuesta tanto como usar un Due.

Majenko
fuente
Gracias. La opción 2 suena realmente bien, pero debido a limitaciones de tiempo, seguí adelante con la opción 3 y obtuve los resultados que quería.
bytk
1
o use una escalera R-2R como "DAC de un hombre pobre"
Andre Holzner
1
@AndreHolzner Cuento una escalera R-2R igual que un chip DAC pero con demasiados cables para que sea práctico en tu Arduino promedio.
Majenko
@Majenko Solo quería agregar que existen "potenciómetros digitales" o "digipots" que son más o menos escaleras R-2R dentro de un chip DIP-8. Son más baratos que los DAC. (Por ejemplo X9C103)
Filip Franik
1
@FilipFranik Excepto que no son escaleras R-2R. Son solo una cadena de resistencias con un FET conectado a cada conexión entre resistencias. Solo hay R. Muchas R son todas iguales. Sí, si lo escribe con los dos extremos del potenciómetro en VCC y GND, obtiene un tipo de DAC, pero sufre el mismo tipo de problemas de impedancia que un potenciómetro real. Proporciona un par de resistencias, mientras que un DAC proporciona un voltaje.
Majenko
7

A 5 V, una resistencia de 1 ohmio intentará hundir 1 A y superar con creces las especificaciones de 40 mA. Utilice al menos una resistencia de 5 / 0.040 = 125 ohmios para proteger su pin. Y si coloca un condensador entre su resistencia y tierra, el circuito RC del condensador suavizará el PWM en un voltaje analógico.

Intente la respuesta @russell sugerida con una resistencia de 47K y un capacitor de 1uF, obtendrá un voltaje analógico en la unión para usar con su carga electrónica.

Dave X
fuente
2

Hasta donde yo sé, los Arduinos tienen ADC (convertidores de analógico a digital) pero no tienen ningún DAC (convertidores de digital a analógico). Por lo tanto, no puede generar un voltaje establecido desde ningún pin basado en un valor digital.

Andre Courchesne
fuente
2
Los Arduinos basados ​​en ARM generalmente tienen al menos un canal DAC.
KIIV
0

NO. No hay forma de obtener un voltaje analógico del Arduino. Lo mejor que puede hacer es usar Arduino como un convertidor Buck Voltage en modo lineal o de refuerzo utilizando un regulador de voltaje, inductor y el transistor mosfet. También es posible que necesite usar un Mega o Dulorme que proporcione una frecuencia PWM distinta de la estándar de 50o Hz.

La mejor de las suertes

Jose Enrique Calderon
fuente