Como emitir uma tensão analógica verdadeira no pino de saída

12

Em relação ao meu programa, é um programa que faz alguns cálculos e, em seguida, gera uma tensão com base no resultado usando a função analogWrite. No entanto, meu problema é que eu havia feito minha programação com base no equívoco de que a função analogWrite via PWM produz uma tensão analógica, na verdade, apenas "simula" a tensão analógica.

Aqui estão as partes relevantes do meu 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");

}

Quanto ao circuito, o pino de saída 11 está sendo conectado a um resistor de 1 ohm e depois ao GND. (Onde medi a tensão) Estou usando a placa Arduino Uno.

ATUALIZAÇÃO :

Como dito nos comentários de @DatHa, o pwm não gera tensão. Existe uma maneira de emitir tensão como dito, sem alterar a placa?

bytk
fonte
A gravação analógica PS usa PWM e NÃO produz uma tensão analógica.
Dat Ha 28/11
@DatHa isso significa que não pode ser feito dessa maneira? Existe outra função para emitir tensão analógica?
Bytk
Veja a resposta do @Russell
dhimaspw
@dpw Eu não acho que funcione, pois meu programa precisa se conectar a uma carga eletrônica através de sua porta de programação externa e controlá-la usando 0-5V.
Bytk 28/11
O PWM gera uma voltagem específica, ou eu sou um pirata no ano de nosso Senhor 1734. Você não pode ir acima de um valor de 8 bits, e sempre há alguma imprecisão na leitura.
user400344

Respostas:

11

Você basicamente tem três opções:

  1. Alterne para um Arduino Due que possui um DAC embutido que gera uma tensão real.
  2. Adicione um chip DAC externo (como o MCP4821 / 2) para criar a voltagem para você
  3. Use um filtro passa-baixo (rede RC) em um pino PWM.

Das três opções, costumo usar um MCP4822, pois fornece os melhores resultados e não custa tanto quanto usar um Due.

Majenko
fonte
Obrigado. A opção 2 parece muito boa, mas, devido a restrições de tempo, fui adiante com a opção 3 e obtive os resultados desejados.
bytk
1
ou usar uma escada R-2R como "DAC pobre homem" um
Andre Holzner
1
@AndreHolzner Conto uma escada R-2R da mesma forma que um chip DAC, mas com muitos fios para torná-la prática no seu Arduino comum.
Majenko
@Majenko Eu só queria acrescentar que existem "potenciômetros digitais" ou "digipots" que são praticamente escadas R-2R dentro de um chip DIP-8. Eles são mais baratos que os DACs. (Por exemplo X9C103)
Filip Franik 28/03/19
1
@FilipFranik Exceto que não são escadas R-2R. Eles são apenas uma cadeia de resistores com um FET conectado a cada conexão entre resistores. Há apenas R. Muitos Rs são iguais. Sim, se você escrever as duas extremidades do potenciômetro para VCC e GND, obterá um DAC, mas ele sofrerá o mesmo tipo de problemas de impedância que um potenciômetro real. Ele fornece um par de resistências, enquanto um DAC fornece uma tensão.
Majenko
6

Em 5V, um resistor de 1 ohm tentará afundar 1A e exceder em muito as especificações de 40mA. Use pelo menos um resistor de 5 / 0,040 = 125 ohm para proteger seu pino. E se você colocar o capacitor entre o resistor e o terra, o circuito RC do capacitor suavizará o PWM em uma tensão analógica.

Por favor, tente a resposta sugerida @russell com um resistor de 47K e um capacitor de 1uF, você obterá uma tensão analógica na junção para usar com sua carga eletrônica.

Dave X
fonte
2

Até onde eu sei, os Arduinos têm ADC (conversores analógico para digital), mas não possuem nenhum DAC (conversores digital para analógico). Portanto, você não pode emitir uma tensão definida de nenhum pino com base em um valor digital.

Andre Courchesne
fonte
2
Os Arduinos baseados em ARM geralmente têm pelo menos um canal DAC.
KIIV 28/11
0

NÃO. Não há como obter uma tensão analógica no Arduino. O melhor que você pode fazer é usar o Arduino como um conversor de tensão Buck no modo linear ou de reforço usando um regulador de tensão, indutor e o transistor mosfet. Você também precisará usar um Mega ou Dulorme que forneça uma frequência PWM diferente da padrão de 50o Hz.

Boa sorte

Jose Enrique Calderon
fonte