Comment sortir une vraie tension analogique à la broche de sortie


12

En ce qui concerne mon programme, il s'agit d'un programme qui effectue certains calculs puis émet une tension basée sur le résultat à l'aide de la fonction analogWrite. Cependant, mon problème est que j'avais fait ma programmation sur la base d'une idée fausse selon laquelle la fonction analogWrite via PWM produit une tension analogique, alors qu'en fait, elle "simule" uniquement la tension analogique.

Voici les parties pertinentes de mon code:

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 ce qui concerne les circuits, la broche de sortie 11 est connectée à une résistance de 1 ohm, puis à GND. (Où j'ai mesuré la tension) J'utilise la carte Arduino Uno.

MISE À JOUR :

Comme indiqué dans les commentaires de @DatHa, pwm ne produit pas de tension. Existe-t-il un moyen de sortir la tension comme indiqué, sans changer la carte?


L'écriture analogique PS utilise PWM et ne produit PAS de tension analogique.
Dat Ha

@DatHa cela signifie-t-il que cela ne peut pas être fait de cette façon? Existe-t-il une autre fonction pour produire une tension analogique?
bytk

Voir la réponse de @Russell
dhimaspw

@dpw Je ne pense pas que cela fonctionne car mon programme doit se connecter à une charge électronique via son port de programmation externe et le contrôler en utilisant 0-5V.
bytk

PWM produit une tension spécifique, ou je suis un pirate de l'année de notre Seigneur 1734. Vous ne pouvez pas dépasser une valeur de 8 bits, et il y a toujours une inexactitude dans sa lecture.
user400344

Réponses:


11

Vous avez essentiellement trois options:

  1. Basculez vers un Arduino Due doté d'un DAC intégré qui produit une tension réelle.
  2. Ajoutez une puce DAC externe (comme la MCP4821 / 2) pour créer la tension pour vous
  3. Utilisez un filtre passe-bas (réseau RC) sur une broche PWM.

Des trois options, j'utilise généralement un MCP4822 car il donne les meilleurs résultats et ne coûte pas autant que l'utilisation d'un Due.


Je vous remercie. L'option 2 sonne vraiment bien, mais en raison de contraintes de temps, j'ai opté pour l'option 3 et obtenu les résultats que je voulais.
bytk

1
ou utiliser une échelle R-2R comme «DAC du pauvre»
Andre Holzner

1
@AndreHolzner Je compte une échelle R-2R identique à une puce DAC mais avec trop de fils pour la rendre pratique sur votre Arduino moyen.
Majenko

@Majenko Je voulais juste ajouter qu'il existe des "potentiomètres numériques" ou des "digipots" qui sont à peu près des échelles R-2R à l'intérieur d'une puce DIP-8. Ils sont moins chers que les DAC. (Par exemple X9C103)
Filip Franik

1
@FilipFranik Sauf qu'il ne s'agit pas d'échelles R-2R. Ce n'est qu'une chaîne de résistances avec un FET connecté à chaque connexion entre les résistances. Il n'y a que R. Beaucoup de R tout de même. Oui, si vous l'écrivez avec les deux extrémités du potentiomètre sur VCC et GND, vous obtenez une sorte de DAC, mais il souffre du même genre de problèmes d'impédance qu'un vrai potentiomètre. Il fournit une paire de résistances, tandis qu'un DAC fournit une tension.
Majenko

7

À 5 V, une résistance de 1 ohm tentera de descendre de 1 A et dépassera de loin les spécifications de 40 mA. Veuillez utiliser au moins une résistance 5 / 0,040 = 125 ohms pour protéger votre broche. Et si vous mettez un condensateur entre votre résistance et la masse, le circuit RC du condensateur lissera le PWM en une tension analogique.

Veuillez essayer la réponse @russell suggérée avec une résistance 47K et un condensateur 1uF, vous obtiendrez une tension analogique à la jonction à utiliser avec votre charge électronique.


2

Autant que je sache, les Arduinos ont des ADC (convertisseurs analogiques-numériques) mais n'ont pas de DAC (convertisseurs numériques-analogiques). Vous ne pouvez donc pas sortir une tension définie à partir de broches en fonction d'une valeur numérique.


2
Les Arduinos basés sur ARM ont généralement au moins un canal DAC.
KIIV

0

NON .. Il n'y a aucun moyen d'obtenir une tension analogique de l'Arduino. Le mieux que vous puissiez faire est d'utiliser Arduino comme convertisseur Buck Voltage en mode linéaire ou boost en utilisant un régulateur de tension, une inductance et le transistor mosfet. Vous devrez peut-être également utiliser un Mega ou un Dulorme qui fournissent une fréquence PWM autre que le 50o Hz standard.

Bonne chance


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.