工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

Arduino-PVMPPTソーラー充電器

コンポーネントと消耗品

>
Arduino Nano R3
× 1
インダクター100uH
現在の定格は、必要な電力と一致している必要があります。
× 1
パワーMOSFETNチャネル
× 1
Adafruit標準LCD-16x2白地に青
× 1

必要なツールとマシン

>
はんだごて(汎用)

アプリとオンラインサービス

>
Arduino IDE

このプロジェクトについて

市場には多くの充電コントローラーがありますが、通常の安価な充電コントローラーは、ソーラーパネルからの最大電力で使用するには効率的ではありません。そして、効率的なものは非常にコストがかかります。

そこで私は、バッテリーのニーズと太陽の状態を理解するのに十分な効率とスマートさを備えた独自の充電コントローラーを作ることにしました。ソーラーから最大の利用可能な電力を引き出し、それを非常に効率的にバッテリー内に入れるために適切な行動を取ります。

私の努力が気に入ったら、このチュートリアルに投票してください。

ステップ1:MPPTとは何ですか、なぜそれが必要なのですか?

私たちのソーラーパネルは馬鹿げていて、バッテリーの状態を理解するのに十分なほど賢くはありません。 12v / 100ワットのソーラーパネルがあり、メーカーによっては18V〜21Vの出力が得られると仮定しますが、バッテリーの定格は公称電圧12vです。フル充電状態では13.6vになり、フル放電では11.0vになります。ここで、バッテリーが13vで充電され、パネルが100%の作業効率で18v、5.5Aを供給していると仮定します(100%にすることはできませんが、仮定しましょう)。通常のコントローラーにはPWM電圧レギュレーターcktがあり、電流を増やすことなく電圧を13.6に下げます。夜間の過充電やパネルへの漏れ電流に対する保護のみを提供します。

この問題に対処するために、私はsmpsバックコンバーターを使用しました。この種のコンバーターの効率は90%を超えています。 90%でさえ貧しいと見なされます。

私たちが抱えている2番目の問題は、ソーラーパネルの非線形出力です。利用可能な最大電力を得るには、特定の電圧で動作させる必要があります。それらの出力は1日を通して変化します。

この問題を解決するために、MPPTアルゴリズムが使用されます。 MPPT(Maximum Power Point Tracking)は、その名前が示すように、このアルゴリズムがパネルから利用可能な最大電力を追跡し、状態を維持するために出力パラメーターを変更します。

したがって、MPPTを使用することにより、パネルは利用可能な最大電力を生成し、バックコンバーターはこの充電を効率的にバッテリーに投入します。

ステップ2:MPPTはどのように機能しますか?

これについては詳しく説明しませんので、理解したい場合は、このリンクをご覧ください-MPPTとは何ですか?

このプロジェクトでは、入力V-I特性と出力V-Iも追跡しました。入力V-Iと出力V-Iを乗算することにより、ワット単位の電力を得ることができます。

1日のいつでも、17 V 5 A、つまり17x5 =85ワットがあるとします。同時に、出力は13 V 6A、つまり13x6 =78ワットです。

これで、MPPTは、以前の入出力電力と比較して、出力電圧をに増減します。

以前の入力電力が高く、出力電圧が現在よりも低い場合、出力電圧は再び下げられて高電力に戻ります。また、出力電圧が高い場合は、現在の電圧が以前のレベルまで上昇します。したがって、最大電力点の周りで振動し続けます。これらの振動は、効率的なMPPTアルゴリズムによって最小限に抑えられます。

ステップ3:ArduinoにMPPTを実装する

これがこの充電器の頭脳です。以下は、出力を調整し、単一のコードブロックでMPPTを実装するためのArduinoコードです。

  // Iout =出力電流// Vout =出力電圧// Vin =入力電圧// Pin =入力電力、Pin_previous =最後の入力電力// Vout_last =最後の出力電圧、Vout_sense =現在の出力電圧voidregulate (float Iout、float Vin、float Vout){
if((Vout> Vout_max)||(Iout> Iout_max)||((Pin> Pin_previous &&Vout_sense Vout_last ))){if(duty_cycle> 0){duty_cycle- =1; } analogWrite(buck_pin、duty_cycle); } else if((Vout Pin_previous &&Vout_sense> Vout_last)||(Pin Duty_cycle + =1; } analogWrite(buck_pin、duty_cycle); } Pin_previous =ピン; Vin_last =Vin; Vout_last =Vout;}

ステップ4:バックコンバーター

<図>

私はNチャンネルMOSFETを使ってバックコンバーターを作りました。通常、人々はハイサイドスイッチングにPチャネルMOSFETを選択します。同じ目的でNチャネルMOSFETを選択する場合は、ドライバICが必要になるか、ブートストラップcktが必要になります。

しかし、私はバックコンバーターcktを変更して、NチャネルMOSFETを使用したローサイドスイッチングを実現しました。 Nチャネルを使用しているのは、これらが低コスト、高電力定格、および低消費電力であるためです。このプロジェクトはIRFz44nロジックレベルMOSFETを使用しているため、ArduinoPWMピンで直接駆動できます。

より高い負荷電流の場合、トランジスタを使用してゲートに10Vを印加し、MOSFETを完全に飽和させ、消費電力を最小限に抑える必要があります。私も同じことをしました。

上記のcktでわかるように、MOSFETを-ve電圧に設定したため、パネルからの+ 12vをアースとして使用します。この構成により、最小限のコンポーネントでバックコンバータ用のNチャネルMOSFETを使用できます。

ただし、いくつかの欠点もあります。両側の-Ve電圧が分離されているため、共通の基準接地はもうありません。したがって、電圧の測定は非常に注意が必要です。

Arduinoのアースとして-Veラインを使用して、ソーラー入力端子でArduinoを接続しました。要件に応じて分圧器cktを使用することにより、この時点での入力電圧を簡単に測定できます。しかし、共通のアースがないため、出力電圧を簡単に測定することはできません。

これを行うには、トリックがあります。出力コンデンサの両端の電圧を測定する代わりに、2つの-Veライン間の電圧を測定しました。 Arduinoのグラウンドとしてsolar-Veを使用し、測定する信号/電圧として出力-Veを使用します。この測定で得られた値は、測定された入力電圧から差し引かれ、出力コンデンサの両端の実際の出力電圧が得られます。

  Vout_sense_temp =Vout_sense_temp * 0.92 + float(raw_vout)* volt_factor * 0.08; //入力gndと出力gndの電圧を測定します。
Vout_sense =Vin_sense-Vout_sense_temp-diode_volt; // 2つのグラウンド間の電圧差を出力電圧に変更します。

電流測定には、ACS-712電流検出モジュールを使用しました。これらはArduinoから電力を供給され、入力GNDに接続されています。

内部タイマーは、MOSFETを駆動するために使用されるピンD6で62.5 KhzPWMを得るように変更されます。逆リークおよび逆極性保護を提供するには、出力ブロッキングダイオードが必要になります。この目的には、必要な電流定格のショットキーダイオードを使用してください。インダクタの値は、周波数と出力電流の要件によって異なります。オンラインで利用可能なバックコンバータ計算機を使用するか、100uH5A-10A負荷を使用できます。インダクタの最大出力電流を80%〜90%超えないでください。

ステップ5:最後の仕上げ

充電器に機能を追加することもできます。鉱山には、パラメータを表示するLCDと、ユーザーからの入力を受け取る2つのスイッチがあります。

最終的なコードを更新し、ckt図をすぐに完成させます。

ステップ6:実際の回路図、BOM、コード

<図>

更新:

コード、BOM、回路をアップロードしました。これは簡単に作れるので、私のものとは少し異なります。

Solar_charger_tutorial_code.ino

コード

  • Solar_charger_tutorial_code.ino
Solar_charger_tutorial_code.ino Arduino
 /////////////////////////////////////////////// //////////////////////////////////////////利用規約///// ////////////////////////////////////////////////// //////////////////////////////////ソフトウェアは「現状有姿」で提供され、いかなる種類の保証もありません。または//商品性の保証を含むがこれに限定されない、//特定の目的および非侵害への適合性を含む。いかなる場合も、//著者または著作権所有者は、本ソフトウェアまたは本ソフトウェアの使用またはその他の取引//////////////////////////////////////// //////////////////////////////////////////////#include  #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メニュー3#defineボタン2#define led 13#define Charge_led A5#define light 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; //この値を変更して電圧測定値を調整します... Stringmode =""; 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(String data、int column、int row); void UI(); void set_limits(int cmd、int temp); void mem_read(); void mem_write(); void mppt(); void setup(){wdt_disable(); watchdogSetup(); //セットアップコードをここに配置して1回実行します:Serial.begin(115200); mem_read(); pinMode(light、OUTPUT); pinMode(charge_led、OUTPUT); digitalWrite(charge_led、LOW); digitalWrite(light、HIGH); pinMode(led、OUTPUT); pinMode(fan、OUTPUT); pinMode(menu、INPUT); pinMode(button、INPUT); digitalWrite(menu、HIGH); digitalWrite(button、HIGH); TCCR0B =TCCR0B&0b11111000 | 0x01; / pwmを最大に設定... 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 =raw_iout / 10; raw_iin =raw_iin / 10; raw_vout =raw_vout / 10; raw_vin =raw_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; // LM235を使用している場合はコメントを解除します} ////////// void watchdogSetup(void){cli(); //すべてのinterruptswdt_reset();を無効にします// WDTタイマーをリセットします//ウォッチドッグ設定モードに入ります:WDTCSR | =(1 < Vout_max)||(Iout> Iout_max)||((Pin> Pin_previous &&Vin_sense  Vin_last))){if(duty_cycle> 0){duty_cycle- =1; } analogWrite(buck_pin、duty_cycle); } else if((Vout  Pin_previous &&Vin_sense> Vin_last)||(Pin  Iout_min + 1){charge =true; } ///////////// if((Vout> Vout_max)&&(Iout 
 80.0){duty_cycle =0; analogWrite(buck_pin、duty_cycle); Serial.println( "オーバーヒートシャットダウン"); lcd_show( "過熱失敗"、0,1); wdt_reset(); for(int i =0; i <10; i ++){digitalWrite(led、HIGH); digitalWrite(charge_led、LOW); delay(4000); digitalWrite(charge_led、HIGH); digitalWrite(led、LOW); delay(4000); } wdt_reset(); } else {料金=true; digitalWrite(charge_led、HIGH);調整(Iout_sense、Vin_sense、Vout_sense); digitalWrite(led、LOW); }} void soft_start(){for(int i =0; i <20; i ++){regulate(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( "Charger MODE:"); Serial.println(mode); Serial.println( "Soft Start Activated"); delay(32000); } startup =false; mppt_init =false;} void lcd_show(String data、int column、int row){lcd.setCursor(column、row); 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 ++;} 

回路図


製造プロセス

  1. ブルドーザー
  2. 太陽電池
  3. Arduinoを使用したソーラーパネルのリアルタイムデータ取得
  4. Arduino Spybot
  5. FlickMote
  6. 自家製テレビB-Gone
  7. マスタークロック
  8. Find Me
  9. Arduino Power
  10. Solar Tracker V2.0
  11. 風力