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

統合されたソーラーChargeController、インバーター、PowerBank、ランプ

コンポーネントと消耗品

Microchip Technology Atmega8
× 1
バックコンバーター
× 1
SparkFun LED-3WアルミニウムPCB(5パック、ウォームホワイト
× 1
Nokia5110ディスプレイ
× 1
SparkFunヒートシンク
× 1
SparkFunNチャネルMOSFET
× 4
SparkFun P-Channel Mosfet
× 1
>
12Vシステム用のソーラーパネル40ワット以下
× 1
SparkFunリチウムイオンバッテリー-18650セル
× 1
DC-DC0.9V-5VからUSBモジュール5VDCブーストステップアップ電源
× 1
汎用トランジスタNPN
× 1
>
12-0-12 / 220センタータップ付き変圧器
× 1
1N4007 –高電圧、高電流定格ダイオード
× 1
男性-ヘッダー36位置1行-長さ(0.1 ")
× 1
スライドスイッチ
× 1
SparkFunプッシュボタンスイッチ12mm
× 1
Arduinoプロトシールド
× 1
ストリップ/ベロ/プロトボード8x11cm
× 1
Arduino UNO
× 1
Arduino Nano R3
× 1
Arduino Mega 2560
× 1
低FW電圧ショットキーダイオード5822
× 1
コンデンサ10µF
× 1
コンデンサ100nF
× 1

必要なツールとマシン

>
はんだごて(汎用)
ドリルモーター
ホットグルーガン(汎用)

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

>
Arduino IDE
AutoDesk 123D

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

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

私はいくつかのソーラーパネル、12ボルトのバッテリー、変圧器、そしてそれらをうまく利用するために声を出して叫んでいる間、さらにいくつかのものを置いています。したがって、このデバイスの誕生-単一のボード上の完全な小型PVソリューション。まず、どちらが何をするのかを確認しましょう。

  • 充電コントローラーは、太陽光発電ソーラーパネルからのDCストレージ/バッテリーの充電と、負荷によるバッテリーの放電を調整して、バッテリーの寿命を延ばすデバイスです。
  • インバーターは、AC負荷を操作するためにDC形式の電気をAC形式に変換するデバイスです。
  • Power Bankは、ポータブル充電またはオフグリッド充電用のガジェット/モバイルデバイスにUSBポートを介して5VDC電源を供給します。
  • 非常灯は、停電、キャンプ、夕暮れ後の野外活動中に使用できる非常に明るいLED光源です。

私が作ったこのデバイスはこれらすべての機能を備えており、最後の2つの機能はオンボードのリチウムイオン電池によって個別にサポートされています。ソーラーパネル(最大100ワット)、12ボルトの鉛蓄電池、変圧器を使用すると、すべてのオプションを利用できます。

Unoのプロトバージョン

最初のバージョンは、最小限のハードウェアと最小限のオプションを備えたUnoBoardで開発されました。 Nokiaディスプレイは直接取り付けられ、MOSFETシールドが開発されてバッテリーの充電/放電をサポートしました。メニューコントロール、インバーター、PWM充電、クールな機能はありません!充電をオン/オフし、バッテリーとパネルの電圧レベルを表示するだけです。仕事はしますが、魅力はありません!

<図>

Protoboardの本格的なバージョン

次に、次の機能を備えたこの新しいものを開発しました。

  • 最大100ワットのパネルのPWMソーラー充電コントローラー
  • 方形波ミニ60ワットインバーター
  • 最大3つの12ボルトDC負荷制御
  • プライマリDC負荷は自動オン/オフ機能をサポートします
  • 独立したUSBパワーバンク
  • バックレギュレータモジュール
  • 点滅と明るさの制御が可能なオンボードLEDランプの緊急事態

2ボタン/スイッチ制御のスクロールとユーザー制御用の選択ベースのメニュー。Nokia5110ディスプレイにオプションとステータス情報を表示します。とてもかっこいい!裏面は、金属物体に対する短絡保護のためにホットグルー絶縁されています!

ディスプレイのバックライト用のオン/オフスイッチのような便利な機能はいくつかあります。内部バッテリーからスイッチをオフにすることで、独立した操作のためにバックを分離します。

<図> <図> <図> <図>

ユーザーボタンを使用してNokia5110ディスプレイのメニューにアクセスする方法を次に示します。

技術的なことを学びましょう!

充電コントローラーは、オン/オフ、PWMまたはMPPTタイプにすることができます。オン/オフは、バッテリー電圧がフル充電電圧に近づいたときに充電電流を抑制しないコントローラーの最も単純な形式(私のバージョン1-上の写真)です。

一方、PWMは、バッテリーがいっぱいになると充電電流を徐々に減らします。 PWMコントローラーには次の利点があります。

  • 失われたバッテリー容量を回復し、バッテリーを脱硫酸化するのに役立ちます
  • より多くの充電を受け入れるバッテリーの能力を向上させます
  • 最大95%の高い平均バッテリー容量を維持します
  • ドリフトするバッテリーセルを均等化して、内部セルが同じポテンシャルを達成できるようにします
  • バッテリーの加熱とガス発生を減らし、電解質の損失を防ぎます
  • 老化を遅らせ、システムの寿命を延ばします

しかし、PWMはパネルを引きずってバッテリー電圧近くで動作するため、PVソーラーパネルからほとんどの電力を引き出すことができません。 MPPTは、基本的にDCからDCに調整可能な昇降圧コンバーターであるこの問題の解決策であり、PWMコントローラーと比較してほとんどの太陽光発電を変換できます。

インバーターは、方形波、修正正弦波、および純粋な正弦波タイプにすることができます。方形波インバーターは設計が非常にシンプルで、ACランプ、CFLランプ、テーブルファン、はんだごてなどの十分に小さいDC負荷がありますが、高調波歪みのため、誘導モーター、繊細な機器/電源にはお勧めしません。

修正正弦波は、方形波から生成される一種の遅延正弦波であり、単純な方形波インバーターよりも優れています。正弦波インバーターはすべてのタイプの負荷に最適ですが、ハードウェアの設計が複雑で、ソフトウェアアルゴリズムの操作が難しく、製造に費用がかかります。

降圧レギュレーターは降圧DC-DCコンバーターです。ここでは、降圧モジュールを使用して、コントローラー(Arduino +ディスプレイ)、独立したUSB電源バンク、オンボードLEDランプに電力を供給する4.2Vリチウムイオンバッテリーを充電しました。

<図>

現在、USBパワーバンクは基本的にDC-DCブーストであり、5未満の電圧範囲(3.3〜4.2ボルトの範囲など)をLi-ionまたはLiPoバッテリーからモバイルデバイスを充電できるUSBバス電圧である5ボルトに変換できます。

また、そのバッテリーを充電するためのバックコンバーターもあります。私のプロジェクトでは、バックモジュールがパネルからジュースを取り出して内部(オンボード)バッテリーを充電します。

ハードウェアの仕組み

詳細に入る前に、デバイスの周囲に接続されているすべての画像を確認してください。

<図>

システムには、さまざまな目的に対応するためのさまざまなハードウェアがあります。もちろん、脳はArduinoでプログラムされたAVR Atmega8Aマイクロコントローラー(Atmega328Pをマイナーな変更で使用できます。以下で説明します)です。

<図>

新鮮なAtmega8AはArduinoOptiboot8ブートローダーで焼かれます。面倒を避けるために、ブートロードされたArduino Mini / Atmega328を購入することができます。

コントローラー、ディスプレイ、LEDランプ、パワーバンクは、オンボードのリチウムイオンバッテリーから電力を供給されます。 2つの瞬間的なタッチボタンは、ディスプレイ上のメニューにアクセスするためのものであり、ユーザーがデバイスのさまざまな機能を操作できるようにします。スイッチは、並列に接続された平滑コンデンサを介してハードウェアでデバウンスされます。

スライドスイッチを使用すると、必要に応じてデバイスの電源を入れたり切ったりできます。

<図>

ソーラー充電機能は、マイクロコントローラからのPWMを介して制御される2N2222トランジスタベースの駆動回路によって駆動されるP-MOSFETによって実行されます。 PWMは、外部バッテリ電圧レベルに基づいて制御されます。ソーラーパネルからの電流は、P-MOSFETを通って鉛蓄電池に流れます。バッテリーが完全に充電されると、MOSFETはマイクロコントローラーからオフになります。充電をオフにした後、バッテリー電圧は徐々に低下し始め、13.6ボルトに達すると、フロート充電を維持するために低デューティサイクルで再び充電が再開されます。

12ボルトのDC負荷は、マイクロコントローラーからゲートピンを制御することにより、N-MOSFETを介して制御されます。

<図>

オンボードLEDランプもNMOSを介して駆動されます。このMOSFETのゲートは、LEDの輝度調整のためにPWM制御されています。

<図>

インバータブロックは、ACをシミュレートするために交互にオン/オフされる2つのN-MOSFETで構成されています。外部センタータップトランスを追加することにより、方形波AC電源を実現できます。

<図>

次の図は、インバータの動作を説明しています。

<図>

別の方法でMOSFETを使用して、昇圧トランスのコイルのセンタータップに電流を反対方向に流すことにより、2次側のAC電圧を生成できます。これは、上部のMOSFETがオンで下部のMOSFETがオフの場合、電流が上向きに流れるために発生します。ただし、トップMOSFETがオフで、ボトムMOSFETがオンの場合、電流は下向きに流れます。

両方のMOSFETは、ACの2倍の周波数でトグルする必要があります。次の写真をチェックして理解してください:

<図>

50 Hz ACを作成するために、交互の方形波が12-0-12V / 220Vセンタータップ付きトランスのローサイドに適用されます。 50 Hzは、各波の20ミリ秒の時間を意味します。

そのため、20ms / 2 =10msまたは100倍トランス駆動MOSFET(インバータMOSFET)に適用されるゲート信号を切り替えます。

<図> <図> <図>

<コード> 警告!!! :AC電圧は人体に致命的であり、死亡または傷害を引き起こす可能性があります。変圧器のHV側に素手で触れないでください!

インバーター機能を使用しない場合、2XDC負荷オプションにより、インバーター端子でさらに2つの12ボルトDC負荷を使用できます。

ソフトウェアの魔法

2セットのコードが提供されています。1つは単一のArduinoタブ内の完全なコードであり、もう1つは個別の機能に応じたタブ付きコードです。

タスクのグループを1つの機能に一般化しました。

例:

Get_ADCVal()は、パネル、内部バッテリー、および外部バッテリーの電圧を測定し、20個のサンプルを取得し、それらの値を平均して、可変保持電圧情報を更新します。

Context_Control()は、ユーザーインタラクション、アクションコントロール、ディスプレイ関連のアクティビティに関する情報の更新を行います。

Charging_Control()、Discharge_Control()、Load_Control()は、システムのCLOSE LOOPとして機能し、バッテリー電圧レベルを監視し、自動負荷機能を制御し、過充電/深放電保護制御などを行うバックグラウンド関数です。

ユーザー入力は、割り込み駆動の瞬間的なプレススイッチを介して収集されます。これらのスイッチを押すと、INT0 / INT1関連のISRが実行されます。 2つの揮発性変数 dpおよびds 変更します。もう1つの3番目の変数レベル dp(ディスプレイポインタ->)およびds(ディスプレイコンテンツセレクタ)とともに、ユーザーはメニュー/サブメニューを移動し、必要に応じてアクションを実行できます。

AVRの16ビットTImer1は、10ミリ秒ごとにタイマーオーバーフロー割り込みを生成するように構成されており、インバーター機能がオンのときにPIN_INVPとPIN_INVNを反転します。

すべてのLcd _....()関数は、ディスプレイ制御と関係があります。

Atmega8AとAtmega328P(宇野)

システムは、コードに次の変更を加えてAtmega328P / Unoで動作するように簡単にアップグレードできます。検索して置き換えます

  TIMSK with TIMSK1#define ADC_VREF 2.69 with #define ADC_VREF 1.11 #define ADCVDIV_R1 22 with #define ADCVDIV_R1 8.2  

ハードウェア部分では、 22Kではなく8.2Kの抵抗を使用する必要があります。 パネルを縮小するには、バッテリー電圧をADC測定範囲に合わせます。

アクションビデオ

私は通常、あるプロジェクトについての言葉だけを読むのではなく、最初にビデオに行きます。あなたが私のようなら、ビデオを楽しんでください:

改善の範囲

Atmega8Aのフラッシュスペースが足りなくなりました。 :

のようないくつかの重要な機能を追加できませんでした
  • ソフトウェア制御の過負荷/短絡保護
  • いくつかのグラフィックアイコンとロゴ
  • エネルギーとロギングの測定
  • バックアップ時間の見積もりとアラーム
  • ノートパソコンの充電オプション
  • 6ボルトシステムのサポート
  • Bluetooth負荷制御
  • タイマーベースの負荷制御
  • よりクールな機能のためのRTCクロック
  • IoT接続ソリューション

このようなものを作成する計画がある場合は、これらの機能のいくつかを追加することを忘れないでください!

Atmega328P(Uno)またはArduino Megaは、これらすべてのオプションを含めるためのより良い候補かもしれません。

とにかく、それは仕事をします、私はそれに満足しています。

追加リソース

  • Atmega8ボードをサポートするArduino1。0.6をダウンロード
  • Arduino.exeを開き、[ツール]> [ボード]> [Optiboot8]に移動します
  • この方法を使用してブートローダーを焼きます
  • コードのコンパイルとアップロード

コード

  • 単一のタブコード
  • 完全なコード
  • ブートローダー
シングルタブコード Arduino
 #define PIN_SCE 12#define PIN_RESET 13#define PIN_DC 8#define PIN_SDIN 7#define PIN_SCLK 6#define PIN_INVP 4#define PIN_INVN 5#define PIN_LOAD 9 // 12 v dc load#define PIN_LAMP 10 //白色LEDライト#define PIN_BATTPWM 11 // ExtBAtt充電用にPMOSを駆動#definePIN_BATTint_Sense A2#define PIN_SOLAR_Sense A0#define PIN_BATText_Sense A3#define ADC_VREF 2.695 //内部参照電圧、Arduino Uno別名Atmega328Pの場合は約1.11V、ここで私のAtmega8Aがこれを提供します!# define ADCVDIV_R1 22 // 22 K分圧器下部抵抗器#defineADCVDIV_R2 175 // 175K分圧器上部抵抗器// constuint8_tskulljoke [] PROGMEM ={2、}; // PIN 2&3 USED AS INTERRUPT SWITCH // PIN 0&1 AS PROGRAMMING // PIN RESET AS#define LCD_C LOW#define LCD_D HIGH#define LCD_X 84#define LCD_Y 48uint8_t x =0; uint8_t level =0; uint8_t brighter =0; boolean Load_Auto_Enable =0; float maxADC_Voltage =0.0; float BattInt_Voltage =0.0; float BattExt_Voltage =0.0; float PV_Voltage =0.0; volatile int y =0; volatile uint8_t dp =0; volatile uint8_t ds =0; volatile boolean cycle =0; uint8_t cdc_level =0; // int i; void setup(void){LcdInitialise(); LcdClear(); LcdString( "* ARDUBOY PV *"); LcdString( "CONTROLLER、"); LcdString( "AC INVERTER、"); LcdString( "POWER BANK、"); LcdString( "LAMP THING !!"); delay(3000); analogReference(INTERNAL); maxADC_Voltage =(ADC_VREF / ADCVDIV_R1)*(ADCVDIV_R1 + ADCVDIV_R2); pinMode(PIN_LOAD、OUTPUT); digitalWrite(PIN_LOAD、LOW); pinMode(2、INPUT_PULLUP); attachInterrupt(0、SW1、FALLING); // Swithc 1の割り込みpinMode(3、INPUT_PULLUP); attachInterrupt(1、SW2、FALLING); // Swithc2の割り込み} void loop(void){Get_ADCVal(); Context_Control(); Chargeg_Control(); Discharge_Control(); Load_Control(); LcdClear();;} // /////////// ADC /////////////// void Get_ADCVal(void){int I =0; int J =0; int K =0; for( x =0; x <20; x ++){I =I + analogRead(PIN_BATTint_Sense); J =J + analogRead(PIN_BATText_Sense); K =K + analogRead(PIN_SOLAR_Sense); } //平均電圧BattInt_Voltage =I / 20.0; BattExt_Voltage =J / 20.0; PV_Voltage =K / 20.0; BattInt_Voltage =maxADC_Voltage * BattInt_Voltage / 1023.0; BattExt_Voltage =maxADC_Voltage * BattExt_Voltage / 1023.0; PV_Vol //////////表示と制御////////////// void Context_Control(void){if(ds ==0){show_menu();} if(ds ==1 &&dp ==0){show_info(); delay(100);} // LcdClear(); Get_ADCVal();} /////////////////////// 1番目のサブメニューに入る////// ////////////////////// if(ds ==1 &&dp ==1){level =1; dp =0; while(level ==1){int temp =ds; LcdClear(); show_load_ctrl(); delay(250); if(dp ==0){if(ds!=temp){Load_Auto_Enable =0; digitalWrite(PIN_LOAD、LOW);}} if(dp ==1){if(ds!=temp){Load_Auto_Enable =0; digitalWrite(PIN_LOAD、HIGH);}} if(dp ==2){if(ds!=temp){Load_Auto_Enable =1;}} if(dp ==3){show_load_ctrl(); delay(250); level =0; dp =0; ds =0;}}}} ////////////////////// 2番目のサブメニューに入る/////////// /////////////////// if(ds ==1 &&dp ==2){level =2; dp =0; while(level ==2){int temp =ds; show_inv_ctrl(); delay(250); LcdClear(); if(dp ==0){if(ds!=temp){Timer1_Init();}} if(dp ==1){if(ds!=temp){Timer1_DeInit();}} if(dp ==2 ){if(ds!=temp){Timer1_DeInit(); digitalWrite(PIN_INVP、1); digitalWrite(PIN_INVN、1);}} if(dp ==3){show_inv_ctrl(); delay(250); level =0; dp =0; ds =0;}}}} ////////////////////////////////////// /////////////////// //////////////// 3番目のサブメニューに入る/////////// ////////////////// if(ds ==1 &&dp ==3){level =3; dp =0; while(level ==3){int temp =ds; LcdClear(); show_led_ctrl(); delay(250); if(dp ==0){blinker =0; if(ds!=temp){if(y <=255){y =y + 15; analogWrite(PIN_LAMP、y);}}} if(dp ==1 ){blinker =0; if(ds!=temp){if(y> =0){y =y-15; analogWrite(PIN_LAMP、y);}}} if(dp ==2){if(ds! =temp){blinker ^ =1; analogWrite(PIN_LAMP、127); delay(250); analogWrite(PIN_LAMP、0);}} if(dp ==3){show_led_ctrl(); delay(250); level =0; dp =0; ds =0;}}}} ////////////////////////////////////// /////////////////// // {show_inv_ctrl();} // {show_led_ctrl();} //} if(blinker ==1){analogWrite(PIN_LAMP、 0);} delay(250); if(blinker ==1){analogWrite(PIN_LAMP、127);}} //////////////////////// /// Nokia5110ディスプレイに表示されるメニューテキスト/////////////////// void show_menu(void){LcdXY(0、dp); LcdString( "->" ); LcdXY(15,0); LcdString( "Sys Info"); LcdXY(15,1); LcdString( "DC Load +"); LcdXY(15,2); LcdString( "AC Load〜"); LcdXY( 15,3); LcdString( "LEDランプ");} void show_info(void){LcdXY(0,0); LcdString( "Bat_I ="); LcdNumtoString(BattInt_Voltage); LcdString( "v"); LcdXY(0 、1); LcdString( "Bat_E ="); LcdNumtoString(BattExt_Voltage); LcdString( "v"); LcdXY(0,2); LcdS tring( "Sol_P ="); LcdNumtoString(PV_Voltage); LcdString( "v"); LcdXY(0,3); if(BattExt_Voltage> 8.0){LcdString( "Batt Conn OK");} else {LcdString( "Connect Batt ");} if(PV_Voltage> 10.5 &&cdc_level!=3 &&cdc_level!=0){LcdString(" Chargeing:ON ");} else {LcdString(" Chargeing:OFF ");} if(TCNT1> =45535 ){LcdString( "Inverter:ON");} else {LcdString( "Inverter:OFF");}} void show_load_ctrl(void){LcdXY(0、dp); LcdString( "->"); LcdXY(15、 0); LcdString( "Load Off"); LcdXY(15,1); LcdString( "Load On"); LcdXY(15,2); LcdString( "Load Auto"); LcdXY(15,3); LcdString( "Return"); LcdXY(0,4); LcdString( "Must Connect"); LcdString( "12V DC Load");} void show_inv_ctrl(void){LcdXY(0、dp); LcdString( "->"); LcdXY(15,0); LcdString( "AC Inv On"); LcdXY(15,1); LcdString( "AC Inv Off"); LcdXY(15,2); LcdString( "2XDC Load"); LcdXY( 15,3); LcdString( "Return"); LcdXY(0,4); LcdString( "2XDC Load、NO"); LcdXY(0,5); LcdString( "TRANSFORMER!");} void show_led_ctrl(void) {LcdXY(0、dp); LcdString( "->"); LcdXY(15,0); LcdString( "LED ++"); LcdXY(15,1); LcdString( "LED-"); LcdXY( 15,2); LcdStrin g( "LED Blk"); LcdXY(15,3); LcdString( "Return"); LcdXY(0,4); LcdString( "LED DISABLEs"); LcdXY(0,5); LcdString( "When INVR On ");} ////////////// ISRの割り込み////////////// void SW1(){dp ++; if(dp>
 3){dp =0;}} void SW2(){ds ^ =1;} ISR(TIMER1_OVF_vect){noInterrupts(); TCNT1 =45535; // TCNT1 =25535;サイクル^ =1; if(cycle ==0); {digitalWrite(PIN_INVP、HIGH); delayMicroseconds(1); //デッドバンドdigitalWrite(PIN_INVN、LOW); delayMicroseconds(1); } if(cycle ==1){digitalWrite(PIN_INVP、LOW); delayMicroseconds(1); //デッドバンドdigitalWrite(PIN_INVN、HIGH); delayMicroseconds(1); } Interrupts(); } ///////////// Nokia5110関数////////// static const byte ASCII [] [5] ={{0x00、0x00、0x00、0x00、0x00} / / 20、{0x00、0x00、0x5f、0x00、0x00} // 21!、{0x00、0x07、0x00、0x07、0x00} // 22 "、{0x14、0x7f、0x14、0x7f、0x14} // 23# 、{0x24、0x2a、0x7f、0x2a、0x12} // 24 $、{0x23、0x13、0x08、0x64、0x62} // 25%、{0x36、0x49、0x55、0x22、0x50} // 26&、{ 0x00、0x05、0x03、0x00、0x00} // 27 '、{0x00、0x1c、0x22、0x41、0x00} // 28(、{0x00、0x41、0x22、0x1c、0x00} // 29)、{0x14、 0x08、0x3e、0x08、0x14} // 2a *、{0x08、0x08、0x3e、0x08、0x08} // 2b +、{0x00、0x50、0x30、0x00、0x00} // 2c ,, {0x08、0x08、 0x08、0x08、0x08} // 2d-、{0x00、0x60、0x60、0x00、0x00} // 2e。、{0x20、0x10、0x08、0x04、0x02} // 2f /、{0x3e、0x51、0x49、 0x45、0x3e} // 30 0、{0x00、0x42、0x7f、0x40、0x00} // 31 1、{0x42、0x61、0x51、0x49、0x46} // 32 2、{0x21、0x41、0x45、0x4b、 0x31} // 33 3、{0x18、0x14、0x12、0x7f、0x10} // 34 4、{0x27、0x45、0x45、0x45、0x39} // 35 5、{0x3c、0x4a、0x49、0x49、0x30} // 36 6、{0x01、0x71、0x09、0x05、0x03 } // 37 7、{0x36、0x49、0x49、0x49、0x36} // 38 8、{0x06、0x49、0x49、0x29、0x1e} // 39 9、{0x00、0x36、0x36、0x00、0x00} / / 3a:、{0x00、0x56、0x36、0x00、0x00} // 3b;、{0x08、0x14、0x22、0x41、0x00} // 3c <、{0x14、0x14、0x14、0x14、0x14} // 3d =、{0x00、0x41、0x22、0x14、0x08} // 3e>、{0x02、0x01、0x51、0x09、0x06} // 3f?、{0x32、0x49、0x79、0x41、0x3e} // 40 @、 {0x7e、0x11、0x11、0x11、0x7e} // 41 A、{0x7f、0x49、0x49、0x49、0x36} // 42 B、{0x3e、0x41、0x41、0x41、0x22} // 43 C、{0x7f 、0x41、0x41、0x22、0x1c} // 44 D、{0x7f、0x49、0x49、0x49、0x41} // 45 E、{0x7f、0x09、0x09、0x09、0x01} // 46 F、{0x3e、0x41 、0x49、0x49、0x7a} // 47 G、{0x7f、0x08、0x08、0x08、0x7f} // 48 H、{0x00、0x41、0x7f、0x41、0x00} // 49 I、{0x20、0x40、0x41 、0x3f、0x01} // 4a J、{0x7f、0x08、0x14、0x22、0x41} // 4b K、{0x7f、0x40、0x40、0x40、0x40} // 4c L、{0x7f、0x02、0x0c、0x02 、0x7f} // 4d M、{0x7f、0x04、0x08、0x10、0x7f} // 4e N、{0x3e、0x41、0x41、0x41、0x3e} // 4f O、{0x7f、0x09、0x09、0x09、0x06 } // 50 P、{0x3e、0x41、0x 51、0x21、0x5e} // 51 Q、{0x7f、0x09、0x19、0x29、0x46} // 52 R、{0x46、0x49、0x49、0x49、0x31} // 53 S、{0x01、0x01、0x7f、 0x01、0x01} // 54 T、{0x3f、0x40、0x40、0x40、0x3f} // 55 U、{0x1f、0x20、0x40、0x20、0x1f} // 56 V、{0x3f、0x40、0x38、0x40、 0x3f} // 57 W、{0x63、0x14、0x08、0x14、0x63} // 58 X、{0x07、0x08、0x70、0x08、0x07} // 59 Y、{0x61、0x51、0x49、0x45、0x43} // 5a Z、{0x00、0x7f、0x41、0x41、0x00} // 5b [、{0x02、0x04、0x08、0x10、0x20} // 5c、{0x00、0x41、0x41、0x7f、0x00} // 5d ]、{0x04、0x02、0x01、0x02、0x04} // 5e ^、{0x40、0x40、0x40、0x40、0x40} // 5f _、{0x00、0x01、0x02、0x04、0x00} // 60 `、 {0x20、0x54、0x54、0x54、0x78} // 61 a、{0x7f、0x48、0x44、0x44、0x38} // 62 b、{0x38、0x44、0x44、0x44、0x20} // 63 c、{0x38 、0x44、0x44、0x48、0x7f} // 64 d、{0x38、0x54、0x54、0x54、0x18} // 65 e、{0x08、0x7e、0x09、0x01、0x02} // 66 f、{0x0c、0x52 、0x52、0x52、0x3e} // 67 g、{0x7f、0x08、0x04、0x04、0x78} // 68 h、{0x00、0x44、0x7d、0x40、0x00} // 69 i、{0x20、0x40、0x44 、0x3d、0x00} // 6a j、{0 x7f、0x10、0x28、0x44、0x00} // 6b k、{0x00、0x41、0x7f、0x40、0x00} // 6c l、{0x7c、0x04、0x18、0x04、0x78} // 6d m、{0x7c、 0x08、0x04、0x04、0x78} // 6e n、{0x38、0x44、0x44、0x44、0x38} // 6f o、{0x7c、0x14、0x14、0x14、0x08} // 70 p、{0x08、0x14、 0x14、0x18、0x7c} // 71 q、{0x7c、0x08、0x04、0x04、0x08} // 72 r、{0x48、0x54、0x54、0x54、0x20} // 73 s、{0x04、0x3f、0x44、 0x40、0x20} // 74 t、{0x3c、0x40、0x40、0x20、0x7c} // 75 u、{0x1c、0x20、0x40、0x20、0x1c} // 76 v、{0x3c、0x40、0x30、0x40、 0x3c} // 77 w、{0x44、0x28、0x10、0x28、0x44} // 78 x、{0x0c、0x50、0x50、0x50、0x3c} // 79 y、{0x44、0x64、0x54、0x4c、0x44} // 7a z、{0x00、0x08、0x36、0x41、0x00} // 7b {、{0x00、0x00、0x7f、0x00、0x00} // 7c |、{0x00、0x41、0x36、0x08、0x00} // 7d}、{0x10、0x08、0x08、0x10、0x08} // 7e、{0x78、0x46、0x41、0x46、0x78} // 7f}; void LcdCharacter(char character){LcdWrite(LCD_D、0x00); for(int index =0; index <5; index ++){LcdWrite(LCD_D、ASCII [character-0x20] [index]); } LcdWrite(LCD_D、0x00);} void LcdClear(void){for(int index =0; index  0){digitalWrite(PIN_LOAD、HIGH);} if(Load_Auto_Enable ==1 &&PV_Voltage> 10.5 || cdc_level ==0){digitalWrite(PIN_LOAD、LOW);}} void Charging_Control(void){// BattExt_Voltageレベル14.3充電オフ、13.5以下充電オン、10.8ロードオフ、12.5ロードオン//この次の条件が防止夜間の充電の試み%夜間PVは0ボルトです!if(PV_Voltage> 10.5 &&BattExt_Voltage> 8.0){if(BattExt_Voltage <=12.5){analogWrite(PIN_BATTPWM、255); cdc_level =0; } if(BattExt_Voltage> 12.5 &&BattExt_Voltage <=12.9){analogWrite(PIN_BATTPWM、200); cdc_level =1; } if(BattExt_Voltage> 12.9 &&BattExt_Voltage <=13.3){analogWrite(PIN_BATTPWM、160); cdc_level =1; } if(BattExt_Voltage> 13.3 &&BattExt_Voltage <=13.6){analogWrite(PIN_BATTPWM、120); cdc_level =2; } if(BattExt_Voltage> 13.6 &&BattExt_Voltage <=13.9 &&cdc_level ==2){analogWrite(PIN_BATTPWM、80); cdc_level =2; } if(BattExt_Voltage> 13.9 &&BattExt_Voltage <=14.3 &&cdc_level ==2){analogWrite(PIN_BATTPWM、40); cdc_level =2; } //過電圧ロックアウト、cdc_levelが3の場合、充電なし! cdcが2で、13.5 v未満の場合に充電が再開されますif(BattExt_Voltage> 14.3){analogWrite(PIN_BATTPWM、0); cdc_level =3; }} else {analogWrite(PIN_BATTPWM、0); cdc_level =3;}} ///低電圧LockoutvoidDischarge_Control(void){if(BattExt_Voltage <=10.8){cdc_level =0; {digitalWrite(PIN_LOAD、LOW);} Timer1_DeInit(); }} ///////////////タイマー2関数////////////////コードのこの部分はAVRスタイルで書かれていますvoidTimer1_Init(void) {noInterrupts(); //すべての割り込みを無効にしますpinMode(PIN_INVP、OUTPUT); pinMode(PIN_INVN、OUTPUT); TCCR1A =0; TCCR1B =0; / * ========================================50 HzACは20msの波を意味しますis formed by 2, 10 ms Pulses from PIN_INVP and PIN_INVN pins so both this pin should toggle at 100 Hz ! Now 100 Hz =.01 sec Arduino System Clock 16 MHz =16000000 cycle in 0,01 sec we have 160000 cycles using prescaler of 8 (CS11) makes timer count 160000/8 =20000 timer ticks Since the timer 2 is 16 bit Up Counter and it Overflows at 65635 value we need to start counting from 65535-20000 =from 45535 value upto 65535 thus TCNT1 starts at 45535 ..then tick tick tick ... 46000 .... 50000 .............. 65536 !!! Boom Timer Over Flow Interrupt and toggle the Inverter driving pins in ISR and start counting from 45535 Again !!! (This happens in the Background) ========================================*/ TCNT1 =45535; //TCNT1 =25535; TCCR1B |=(1 < 
Full CodeC/C++
Code Organized &Readable
No preview (download only).
BootloadersC/C++
プレビューなし(ダウンロードのみ)。

回路図


製造プロセス

  1. ソーラーインバーターとは何ですか?
  2. ハロゲンランプ
  3. 溶岩ランプ
  4. 太陽熱暖房システム
  5. 集積回路
  6. 太陽電池
  7. スマート信号機
  8. Arduinoゲームコントローラー
  9. クラウドコスチューム
  10. Solar Tracker V2.0
  11. 太陽エネルギーを理解する