Cara mengeluarkan tegangan analog yang benar pada pin keluaran

12

Mengenai program saya, ini adalah program yang melakukan beberapa perhitungan dan kemudian mengeluarkan tegangan berdasarkan hasil menggunakan fungsi analogWrite. Namun masalah saya adalah bahwa saya telah melakukan pemrograman berdasarkan kesalahpahaman bahwa fungsi analogWrite melalui PWM memang menghasilkan tegangan analog, di mana sebenarnya itu hanya "mensimulasikan" tegangan analog sebagai gantinya.

Berikut adalah bagian yang relevan dari kode saya:

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

}

Sedangkan untuk sirkuit, pin keluaran 11 dihubungkan ke resistor 1 ohm dan kemudian ke GND. (Di mana saya mengukur tegangan) Saya menggunakan papan Arduino Uno.

PEMBARUAN :

Seperti yang dikatakan dalam komentar oleh @DATHa, PWM tidak menghasilkan tegangan. Apakah ada cara untuk menghasilkan tegangan seperti yang dikatakan, tanpa mengganti papan?

bytk
sumber
PS Analog write menggunakan PWM dan TIDAK menghasilkan tegangan analog.
Dat Ha
@DaHa apakah itu berarti itu tidak dapat dilakukan dengan cara ini? Apakah ada fungsi lain untuk menghasilkan tegangan analog?
bytk
Lihat jawaban @Russell di arduino.stackexchange.com/questions/10041/…
dhimaspw
@ dpw Saya tidak berpikir itu berfungsi karena program saya harus terhubung ke beban elektronik melalui port pemrograman eksternal dan mengendalikannya menggunakan 0-5V.
bytk
PWM mengeluarkan tegangan tertentu, atau saya bajak laut di tahun Lord 1734 kami. Anda tidak bisa melampaui nilai 8-bit, dan selalu ada beberapa ketidaktepatan dalam membacanya.
user400344

Jawaban:

11

Anda pada dasarnya memiliki tiga opsi:

  1. Beralih ke Arduino Due yang memiliki DAC bawaan yang menghasilkan tegangan nyata.
  2. Tambahkan chip DAC eksternal (seperti MCP4821 / 2) untuk membuat voltase untuk Anda
  3. Gunakan filter low-pass (jaringan RC) pada pin PWM.

Dari ketiga opsi tersebut saya biasanya menggunakan MCP4822 karena memberikan hasil terbaik dan tidak memerlukan biaya sebanyak menggunakan Due.

Majenko
sumber
Terima kasih. Opsi 2 terdengar sangat bagus, tetapi karena kendala waktu, saya melanjutkan dengan Opsi 3 dan mendapatkan hasil yang saya inginkan.
bytk
1
atau gunakan tangga R-2R sebagai "DAC orang miskin"
Andre Holzner
1
@AndreHolzner Saya menghitung tangga R-2R sama dengan chip DAC tetapi dengan kabel terlalu banyak untuk membuatnya praktis pada Arduino rata-rata.
Majenko
@ Majenko Saya hanya ingin menambahkan bahwa ada "potensiometer digital" atau "digipots" yang cukup banyak tangga R-2R di dalam chip DIP-8. Mereka lebih murah daripada DAC. (Misalnya X9C103)
Filipi Franik
1
@FilipFranik Kecuali mereka bukan tangga R-2R. Mereka hanya rangkaian resistor dengan FET yang terhubung ke setiap koneksi antara resistor. Hanya ada R. Banyak Rs semua sama. Ya, jika Anda menuliskannya dengan dua ujung potensiometer ke VCC dan GND, Anda mendapatkan semacam DAC, tetapi mengalami masalah impedansi yang sama dengan potensiometer yang sebenarnya. Ini memberikan sepasang resistensi, sedangkan DAC memberikan tegangan.
Majenko
7

Pada 5V, resistor 1 ohm akan mencoba untuk tenggelam 1A dan jauh melebihi spesifikasi 40mA. Silakan gunakan setidaknya 5 / 0,040 = 125 ohm resistor untuk melindungi pin Anda. Dan jika Anda meletakkan kapasitor di antara resistor dan arde, rangkaian RC kapasitor akan memuluskan PWM menjadi tegangan analog.

Silakan coba jawaban @russell yang disarankan dengan resistor 47K dan kapasitor 1uF, Anda akan mendapatkan tegangan analog di persimpangan untuk digunakan dengan beban elektronik Anda.

Dave X
sumber
2

Sejauh yang saya tahu Arduinos memiliki ADC (Pengonversi Analog ke Digital) tetapi tidak memiliki DAC (Pengonversi Digital ke Analog). Jadi Anda tidak bisa mengeluarkan voltase yang disetel dari pin apa pun berdasarkan nilai digital.

Andre Courchesne
sumber
2
Arduinos berbasis ARM biasanya memiliki setidaknya satu saluran DAC.
KIIV
0

TIDAK .. Tidak ada cara untuk mendapatkan tegangan analog dari Arduino. Yang terbaik yang dapat Anda lakukan adalah menggunakan Arduino sebagai konverter Buck Voltage dalam mode linear atau boost menggunakan regulator tegangan, induktor dan transistor MOSFET. Anda juga mungkin perlu menggunakan Mega atau Dulorme yang menyediakan frekuensi PWM selain 50o Hz standar.

Keberuntungan terbaik

Jose Enrique Calderon
sumber