Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Arduino - Pengisi Daya Tenaga Surya PV MPPT

Komponen dan persediaan

Arduino Nano R3
× 1
Induktor 100 uH
peringkat saat ini harus sesuai dengan daya yang Anda butuhkan.
× 1
N-Channel MOSFET Daya
× 1
Adafruit LCD Standar - 16x2 Putih di Atas Biru
× 1

Alat dan mesin yang diperlukan

Besi solder (generik)

Aplikasi dan layanan online

Arduino IDE

Tentang proyek ini

Ada banyak pengontrol muatan yang tersedia di pasaran, tetapi pengontrol muatan murah biasa tidak efisien untuk digunakan dengan daya maksimum dari panel surya. Dan yang efisien sangat mahal.

Jadi saya memutuskan untuk membuat pengontrol muatan sendiri agar efisien dan cukup pintar untuk memahami kebutuhan baterai dan kondisi matahari. Dibutuhkan tindakan yang tepat untuk menarik daya maksimum yang tersedia dari matahari dan memasukkannya ke dalam baterai dengan sangat efisien.

Jika Anda menyukai upaya saya, silakan pilih tutorial ini.

Langkah 1:Apa itu MPPT dan Mengapa Kita Membutuhkannya?

Panel surya kami bodoh dan tidak cukup pintar untuk memahami kondisi baterai. Asumsikan kita memiliki panel surya 12v/100 watt dan akan memberikan output antara 18V-21V tergantung pada manufaktur, tetapi baterai diberi nilai tegangan nominal 12v. Pada kondisi pengisian penuh mereka akan menjadi 13.6v dan akan menjadi 11.0v pada debit penuh. Sekarang mari kita asumsikan baterai kita berada pada pengisian 13v, panel memberikan 18v, 5,5A pada efisiensi kerja 100% (tidak mungkin memiliki 100% tetapi mari kita asumsikan). Pengendali biasa memiliki pengatur tegangan PWM ckt yang menurunkan tegangan menjadi 13,6 tanpa penguatan arus. Ini hanya memberikan perlindungan terhadap pengisian berlebih dan arus bocor ke panel pada malam hari.

Untuk mengatasi masalah ini, saya telah menggunakan smps buck converter. Konverter jenis ini memiliki efisiensi di atas 90%. Bahkan 90% dianggap miskin.

Masalah kedua yang kami miliki adalah output panel surya yang tidak linier. Mereka perlu dioperasikan pada tegangan tertentu untuk memanen daya maksimum yang tersedia. Hasil mereka bervariasi sepanjang hari.

Untuk mengatasi masalah ini algoritma MPPT digunakan. MPPT (Maximum Power Point Tracking) seperti namanya, algoritme ini melacak daya maksimum yang tersedia dari panel dan memvariasikan parameter output untuk mempertahankan kondisi tersebut.

Jadi dengan menggunakan MPPT, panel kami akan menghasilkan daya maksimum yang tersedia dan konverter uang akan memasukkan muatan ini secara efisien ke dalam baterai.

Langkah 2:Bagaimana Cara Kerja MPPT?

Saya tidak akan membahas ini secara detail, jadi jika Anda ingin memahaminya, lihat tautan ini - Apa itu MPPT?

Dalam proyek ini saya telah melacak karakteristik input V-I dan output V-I, juga. Dengan mengalikan input V-I dan output V-I kita dapat memperoleh daya dalam watt.

Katakanlah kita memiliki 17 V 5 A, yaitu 17x5 =85 watt, setiap saat sepanjang hari. Pada saat yang sama output kami adalah 13 V 6A, yaitu 13x6 =78 Watt.

Sekarang MPPT akan menaikkan atau menurunkan tegangan output dengan membandingkan daya input/output sebelumnya.

Jika daya input sebelumnya tinggi dan tegangan output lebih rendah dari sekarang, maka tegangan output akan diturunkan lagi untuk kembali ke daya tinggi. Dan jika tegangan output tinggi, maka tegangan saat ini akan ditingkatkan ke level sebelumnya. Dengan demikian ia terus berosilasi di sekitar titik daya maksimum. Osilasi ini diminimalkan dengan algoritme MPPT yang efisien.

Langkah 3:Menerapkan MPPT di Arduino

Ini adalah otak pengisi daya ini. Di bawah ini adalah kode Arduino untuk mengatur output dan implementasi MPPT dalam satu blok kode.

// Iout =arus keluaran// Vout =tegangan keluaran// Vin =tegangan masukan// Pin =daya masukan, Pin_previous =daya masukan terakhir// Vout_last =tegangan keluaran terakhir, Vout_sense =tegangan keluaran saat inivoid mengatur (float Iout, float Vin, float Vout) {
if((Vout>Vout_max) || (Iout>Iout_max) || ((Pin>Pin_previous &&Vout_senseVout_last ))) { if(duty_cycle>0) { duty_cycle -=1; } analogWrite(buck_pin,duty_cycle); } else if ((VoutPin_previous &&Vout_sense>Vout_last) || (Pin duty_cycle+=1; } analogWrite(buck_pin,duty_cycle); } Pin_previous =Pin; Vin_last =Vin;Vout_last =Vout;}

Langkah 4:Konverter Uang

Saya telah menggunakan MOSFET N-channel untuk membuat konverter uang. Biasanya orang memilih mosfet saluran-P untuk peralihan sisi tinggi dan jika mereka memilih mosfet saluran-N untuk tujuan yang sama maka diperlukan IC driver atau boot strapping ckt.

Tapi saya memodifikasi ckt konverter buck untuk memiliki switching sisi rendah menggunakan MOSFET N-channel. Saya menggunakan N-channel karena ini adalah biaya rendah, peringkat daya tinggi dan disipasi daya yang lebih rendah. Proyek ini menggunakan mosfet level logika IRFz44n, sehingga dapat langsung di-drive oleh pin PWM Arduino.

Untuk arus beban yang lebih tinggi, seseorang harus menggunakan transistor untuk menerapkan 10V di gerbang untuk membuat MOSFET menjadi saturasi sepenuhnya dan meminimalkan disipasi daya. Saya telah melakukan hal yang sama.

Seperti yang Anda lihat di ckt di atas, saya telah menempatkan MOSFET pada tegangan -ve, sehingga menggunakan +12v dari panel sebagai ground. Konfigurasi ini memungkinkan saya untuk menggunakan MOSFET N-channel untuk konverter uang dengan komponen minimum.

Tetapi juga memiliki beberapa kekurangan. Karena Anda memiliki kedua sisi tegangan -Ve terpisah, Anda tidak memiliki landasan referensi yang sama lagi. Jadi mengukur voltase sangat rumit.

Saya telah menghubungkan Arduino di terminal input surya, menggunakan jalur -Ve sebagai ground untuk Arduino. Kita dapat dengan mudah mengukur tegangan input pada titik ini dengan menggunakan pembagi tegangan ckt sesuai kebutuhan kita. Tetapi kami tidak dapat mengukur tegangan keluaran dengan mudah karena kami tidak memiliki kesamaan.

Nah untuk melakukan ini ada triknya. Alih-alih mengukur tegangan melintasi kapasitor keluaran, saya telah mengukur tegangan antara dua garis -Ve. Menggunakan solar -Ve sebagai ground Arduino dan output -Ve sebagai sinyal/tegangan yang akan diukur. Nilai yang Anda peroleh dengan pengukuran ini harus dikurangi dari tegangan input yang diukur dan Anda akan mendapatkan tegangan output nyata di seluruh kapasitor output.

Vout_sense_temp=Vout_sense_temp*0.92+float(raw_vout)*volt_factor*0.08; //mengukur tegangan pada input gnd dan output gnd.
Vout_sense=Vin_sense-Vout_sense_temp-diode_volt; //mengubah perbedaan tegangan antara dua ground menjadi tegangan keluaran..

Untuk pengukuran arus, saya telah menggunakan modul penginderaan arus ACS-712. Mereka telah diberdayakan oleh Arduino dan terhubung ke input GND.

Timer internal dimodifikasi untuk mendapatkan PWM 62,5 Khz pada pin D6, yang digunakan untuk menggerakkan MOSFET. Dioda pemblokiran keluaran akan diperlukan untuk memberikan kebocoran terbalik dan perlindungan polaritas terbalik menggunakan dioda Schottky dengan peringkat arus yang diinginkan untuk tujuan ini. Nilai induktor tergantung pada frekuensi dan kebutuhan arus keluaran. Anda dapat menggunakan kalkulator pengonversi uang yang tersedia secara online atau menggunakan beban 100uH 5A-10A. Jangan pernah melebihi arus keluaran maksimum induktor sebesar 80% -90%.

Langkah 5:Sentuhan Terakhir

Anda juga dapat menambahkan fitur tambahan ke pengisi daya Anda. Milik saya memiliki LCD untuk menampilkan parameter dan 2 sakelar untuk mengambil input dari pengguna.

Saya akan segera memperbarui kode terakhir dan menyelesaikan diagram ckt.

Langkah 6:Diagram Sirkuit Aktual, BOM &Kode

PEMBARUAN:

Saya telah mengunggah kode, bom, dan sirkuit. Ini sedikit berbeda dari saya, karena lebih mudah membuatnya.

Solar_charger_tutorial_code.ino

Kode

  • Solar_charger_tutorial_code.ino
Solar_charger_tutorial_code.inoArduino
///////////////////////////////////////////////////////// //////////////////////////////////////////Syarat Penggunaan///// ////////////////////////////////////////////////////////////////// ////////////////////////////////PERANGKAT LUNAK INI DISEDIAKAN "SEBAGAIMANA ADANYA", TANPA JAMINAN APA PUN, TERSURAT ATAU//TERSIRAT, TERMASUK NAMUN TIDAK TERBATAS PADA JAMINAN DIPERDAGANGKAN,// KESESUAIAN UNTUK TUJUAN TERTENTU DAN TANPA PELANGGARAN. DALAM KEADAAN APAPUN // PENULIS ATAU PEMEGANG HAK CIPTA TIDAK BERTANGGUNG JAWAB ATAS KLAIM, KERUSAKAN ATAU TANGGUNG JAWAB LAINNYA, BAIK DALAM TINDAKAN KONTRAK, KERUGIAN ATAU LAINNYA, YANG TIMBUL DARI,// KELUAR DARI ATAU SEHUBUNGAN DENGAN PERANGKAT LUNAK PENGGUNAAN ATAU TRANSAKSI LAINNYA DI//PERANGKAT LUNAK./////////////////////////////////////////////////////// /////////////////////////////////////////////#termasuk #include #include #define vin_pin A1#define vout_pin A0#define iout_pin A2#define iin_pin A3#define lm35 A4#define fan 5#define buck_pin 6#define buck_pin 6 menu 3#menentukan tombol 2#menentukan led 13#menentukan charge_led A5#menentukan lampu 4uint8_t auto_mode=1;float Pin=0,Pout=0,Pin_previous=0;float efficiency=0.0;int raw_vin=0, raw_vout=0, raw_iout =0,raw_iin=0, raw_lm35=0;float Vout_boost=14.5,Vout_max=15.0, Iout_max=5.0, Vout_float=13.5, Iout_min=0.00,Vin_thresold=10.0;float Iout_sense,Iin_sense,Iin;float Vout_sense,Vin_last_float;float Vin_sense;uint8_t duty_cycle =0;float volt_factor =0,05376; //ubah nilai ini untuk mengkalibrasi pembacaan tegangan...String mode="";bool startup=true, lcd_stat=true,charge=true,mppt_init =true;unsigned int count=0;LiquidCrystal lcd(7, 8, 9, 10, 11, 12);void lcd_show(Data string,kolom int, baris int);void UI();void set_limits(int cmd,int temp);void mem_read();void mem_write();void mppt(); batalkan pengaturan() { wdt_disable(); watchdogSetup(); // letakkan kode setup Anda di sini, untuk dijalankan sekali:Serial.begin(115200);mem_read();pinMode(light,OUTPUT);pinMode(charge_led,OUTPUT);digitalWrite(charge_led,LOW);digitalWrite(light,HIGH);pinMode(led,OUTPUT);pinMode(kipas,OUTPUT);pinMode(menu,INPUT);pinMode(tombol,INPUT);digitalWrite(menu,TINGGI);digitalWrite(tombol,TINGGI);TCCR0B =TCCR0B &0b11111000 | 0x01; / set pwm pada Max... 62,5 KhzanalogWrite(buck_pin,0);lcd.begin(16,2);lcd_show("Solar Charger",0,0);delay(64000);wdt_reset();delay(64000);wdt_reset();lcd_show("Vi Vb Ib ",0,0);/////////////////for(int i=0;i<10;i++) { raw_iout +=analogRead(iout_pin)-513;raw_iin +=analogRead(iin_pin)-513;raw_vin +=analogRead(vin_pin);raw_vout +=analogRead(vout_pin);raw_lm35 +=analogRead(lm35);delay(2); } raw_iout=keluar_mentah/10; raw_iin=mentah_iin/10; raw_vout=mentah_vout/10; mentah_vin=mentah_vin/10; Iout_sense=float(raw_iout)*5/1023/0.066; Iin_sense=float(raw_iin)*5/1023/0.066; Vout_sense_temp=float(raw_vout)*volt_factor; Vin_sense=float(raw_vin)*volt_factor; // heat_sink_temp =raw_lm35*0.48; // 0.0049*1000/10 // heat_sink_temp =heat_sink_temp-273.15; //batalkan komentar jika menggunakan LM235}//////////void watchdogSetup(void){cli(); // nonaktifkan semua interruptswdt_reset(); // reset timer WDT// Masuk ke mode Konfigurasi Watchdog:WDTCSR |=(1<Vout_max) || (Iout>Iout_max) || ((Pin>Pin_previous &&Vin_senseVin_last))) { if(duty_cycle>0) { duty_cycle-=1; } analogWrite(buck_pin,duty_cycle); } else if((VoutPin_previous &&Vin_sense>Vin_last) || (PinIout_min+1){ charge =true; } ///////////// if((Vout>Vout_max) &&(Iout 80.0){ duty_cycle=0; analogWrite(buck_pin,duty_cycle); Serial.println("Pematian Karena Panas"); lcd_show("Terlalu Panas Gagal ",0,1); wdt_reset(); for(int i=0;i<10;i++){ digitalWrite(led,HIGH); digitalWrite(charge_led,LOW); penundaan (4000); digitalWrite(charge_led,HIGH); digitalWrite(dipimpin,RENDAH); penundaan (4000); } wdt_reset(); } else { biaya =benar; digitalWrite(charge_led,HIGH); mengatur(Iout_sense, Vin_sense, Vout_sense); digitalWrite(dipimpin,RENDAH); }}void soft_start() { for(int i=0;i<20;i++) { mengatur(Iout_sense, Vin_sense, Vout_sense);Serial.print("Vin=");Serial.println(Vin_sense);Serial.print ("Vout=");Serial.println(Vout_sense);Serial.print("Iout=");Serial.println(Iout_sense);Serial.print("Duty cycle=");Serial.println(duty_cycle);Serial .print("MODE Pengisi Daya :");Serial.println(mode);Serial.println("Mulai Lunak Diaktifkan"); penundaan (32000); } mulai =salah; mppt_init =false;}void lcd_show(Data string,kolom int, baris int) { lcd.setCursor(kolom,baris); if(data.length()>0) { for(int i=0;i 45.0){ digitalWrite(fan,HIGH);}else if(heat_sink_temp<37.0){ digitalWrite(fan,LOW);}count++;}

Skema


Proses manufaktur

  1. Bulldozer
  2. Sel Surya
  3. Akuisisi Data Real-Time Panel Surya Menggunakan Arduino
  4. Arduino Spybot
  5. FlickMote
  6. TV Buatan Sendiri B-Gone
  7. Jam Master
  8. Temukan Saya
  9. Solar Tracker V2.0
  10. Tenaga angin