亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

集成太阳能充电控制器、逆变器、移动电源、灯

组件和用品

Microchip Technology Atmega8
× 1
降压转换器
× 1
SparkFun LED - 3W 铝制 PCB(5 件装,暖白色
× 1
诺基亚 5110 显示器
× 1
SparkFun 散热器
× 1
SparkFun N 沟道 MOSFET
× 4
SparkFun P-Channel Mosfet
× 1
12 V 系统的太阳能电池板 40 瓦或更少
× 1
SparkFun 锂离子电池 - 18650 芯
× 1
DC-DC 0.9V-5V to USB Module 5V DC Boost升压电源
× 1
通用晶体管 NPN
× 1
12-0-12/220 中心抽头变压器
× 1
1N4007 – 高电压、高额定电流二极管
× 1
Male-Header 36 Position 1 Row- Long (0.1")
× 1
滑动开关
× 1
SparkFun 按钮开关 12mm
× 1
Arduino Proto Shield
× 1
Strip/Vero/Proto Board 8x11 cm
× 1
Arduino UNO
× 1
Arduino Nano R3
× 1
Arduino Mega 2560
× 1
低固件电压肖特基二极管 5822
× 1
电容 10 µF
× 1
电容 100 nF
× 1

必要的工具和机器

烙铁(通用)
钻机
热胶枪(通用)

应用和在线服务

Arduino IDE
AutoDesk 123D

关于这个项目

关于本项目

我有几个太阳能电池板、12 伏电池、变压器和其他一些东西,我放了一会儿大声喊着要好好利用它们。于是这个设备诞生了——在单板上完整的小型光伏解决方案。让我们先回顾一下哪个做什么,好吗?

  • 充电控制器是一种设备,可调节来自光伏太阳能电池板的直流存储/电池的充电以及负载对电池的放电,以延长电池寿命。
  • 逆变器是一种将直流电转换为交流电以运行交流负载的设备。
  • 移动电源通过 USB 端口为小工具/移动设备提供 5V 直流电源,用于便携式充电或离网充电。
  • 应急灯是一种超高亮的 LED 光源,可在停电、露营、黄昏后的户外活动时使用。

我制作的这个设备具有所有这些功能,最后两个功能由板载锂离子电池独立支持。使用太阳能电池板(高达 100 瓦)、12 伏铅酸电池和变压器 - 所有选项都可以使用。

Uno 上的原始版本

第一个版本是在 Uno Board 上开发的,具有最少的硬件和最少的选项。诺基亚显示器是直接安装的,并开发了一个 MOSFET 屏蔽来支持电池的充电/放电。没有菜单控制,没有逆变器,没有PWM充电和很酷的功能!只需打开/关闭充电并显示电池和面板电压水平。有工作但没有魅力!

原型板上的完整版本

然后我开发了这个具有以下功能的新功能:

  • 高达 100 瓦面板的 PWM 太阳能充电控制器
  • 方波迷你 60 瓦逆变器
  • 多达三个 12 伏直流负载控制
  • 初级直流负载支持自动开/关功能
  • 独立的USB移动电源
  • 降压调节器模块
  • 带有闪烁和亮度控制的紧急车载 LED 灯

2 个按钮/开关控制的滚动和基于用户控制的选择菜单,在诺基亚 5110 显示屏上显示选项和状态信息。很酷!背面采用热胶绝缘,可防止金属物体短路!

还有一些更方便的功能,例如显示背光的开/关开关,通过关闭内部电池来分离独立操作的降压。

使用用户按钮访问诺基亚 5110 显示屏上的菜单如下所示:

让我们学习一些技术性的东西!

充电控制器可以是开/关、PWM 或 MPPT 类型。 On/Off 是控制器的最简单形式(我的版本 1 - 上图),它不会在电池电压接近完全充电电压时限制充电电流。

随着电池充满,PWM逐渐降低充电电流。 PWM控制器具有以下优点:

  • 帮助恢复失去的电池容量和使电池脱硫
  • 提高电池接受更多电量的能力
  • 保持高达 95% 的高平均电池容量
  • 均衡漂移电池,使内部电池达到相同的电位
  • 减少电池发热和放气,从而防止电解液流失
  • 减缓老化并延长系统寿命

但是 PWM 无法从 PV 太阳能电池板获取大部分电能,因为它会拖曳太阳能电池板以接近电池电压运行。 MPPT 就是解决这个问题的方法,它基本上是一个 DC-DC 可调升降压转换器,与 PWM 控制器相比,它可以转换大部分太阳能。

逆变器可以是方波、修正正弦波和纯正弦波类型。方波逆变器设计非常简单,足够小的直流负载,如交流灯、CFL 灯、台扇、烙铁,但不推荐用于感应电机、精密设备/电源,因为谐波失真。

修正正弦波是一种由方波产生的延迟正弦波,优于普通方波逆变器。正弦波逆变器最适合所有类型的负载,但硬件设计复杂、软件算法难以操作且制作成本高。

降压稳压​​器是降压 DC-DC 转换器,这里我使用降压模块为 4.2 V 锂离子电池充电,该电池为控制器(Arduino + 显示器)、独立 USB 移动电源、板载 LED 灯供电。

现在 USB 移动电源基本上是 DC-DC 升压,可以将低于 5 的电压范围(例如 3.3 到 4.2 伏范围)从锂离子或锂聚合物电池转换为 5 伏,这是可以为移动设备充电的 USB 总线电压.

它还有一个降压转换器来为电池充电。在我的项目中,降压模块从面板获取一些汁液来为内部(板载)电池充电。

硬件的工作原理

在我们详细介绍之前,请检查设备周围所有连接的图像:

该系统具有用于不同目的的各种硬件。当然,大脑是在Arduino中编程的AVR Atmega8A微控制器(可以使用Atmega328P,稍作改动,下面讨论)。

用Arduino Optiboot8 bootloader烧一个新的Atmega8A,你可以买一个Bootloaded Arduino Mini/Atmega328来避免麻烦。

控制器、显示器、LED 灯和移动电源由板载锂离子电池供电。两个瞬时触摸按钮用于访问显示屏上的菜单,允许用户操作设备的不同功能。这些开关是通过并联连接的平滑电容器进行硬件去抖动的。

滑动开关允许根据需要打开/关闭设备。

太阳能充电功能由基于 2N2222 晶体管的驱动电路驱动的 P-MOSFET 执行,该驱动电路由微控制器通过 PWM 控制。 PWM 根据外部电池电压电平进行控制。来自太阳能电池板的电流通过 P-MOSFET 流向铅酸电池。当电池充满电时,MOSFET 从微控制器关闭。充电关闭后,电池电压开始逐渐下降,当达到13.6伏时,再次低占空比恢复充电,保持浮充。

12 伏直流负载通过 N-MOSFET 控制,通过微控制器控制其栅极引脚。

板载 LED 灯也通过 NMOS 驱动。该MOSFET的栅极采用PWM控制,用于调节LED亮度。

逆变器模块由 2 个 N-MOSFET 组成,它们交替打开/关闭以模拟交流电。外加中心抽头变压器,可实现方波交流供电。

下图解释了逆变器的动作:

通过允许电流以相反的方向流过升压变压器线圈的中心抽头,或者使用 MOSFET,可以在次级产生交流电压。发生这种情况是因为当顶部 MOSFET 开启而底部 MOSFET 关闭时,电流向上流动。但是当顶部 MOSFET 关闭而底部 MOSFET 开启时,电流向下流动。

两个 MOSFET 都必须以交流频率的两倍进行切换。看下一张图就明白了:

要产生 50 Hz 交流电,在 12-0-12V/220V 中心抽头变压器的低侧应用交流方波。 50 Hz 表示每个波的时间为 20 ms。

这就是为什么 20ms/2 =10 ms 或 100 次切换施加到变压器驱动 MOSFET(逆变器 MOSFET)的栅极信号。

警告!!! :交流电压对人体是致命的,可能会导致死亡/伤害!切勿赤手触摸变压器的高压侧!

如果不使用逆变器功能,2XDC 负载选项允许在逆变器端子上使用另外两个 12 伏直流负载。

软件的魔力

提供了两套代码,一套是单个Arduino Tab中的完整代码,另一套是根据不同功能的Tabbed Code。

我已将一组任务概括为一个功能。

例如:

Get_ADCVal() 将测量面板、内部电池和外部电池电压,取 20 个样本,对这些值取平均值并更新变量保持电压信息。

Context_Control() 将执行用户交互、操作控制、显示相关活动的信息更新。

Charging_Control() , Discharge_Control(), Load_Control() 是后台函数,作为系统的CLOSE LOOP,监控电池电压水平,控制自动加载功能,过充/深度放电保护控制等。

用户输入通过中断驱动的瞬时按下开关收集。当按下这些开关时,将执行与 INT0/INT1 相关的 ISR。两个可变变量 dp 和 ds 变化。另一个第三个变量 level 与 dp(显示指针 ->)和 ds(显示内容选择器)一起允许用户浏览菜单/子菜单并根据需要执行操作。

AVR 的 16 位 TImer1 配置为每 10 ms 产生一次定时器溢出中断,并在 Inverter 功能开启时翻转 PIN_INVP 和 PIN_INVN。

所有 Lcd_....() 函数都与显示控制有关。

Atmega8A vs Atmega328P (Uno)

该系统可以轻松升级以与 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  

在硬件部分,您需要使用 8.2K 电阻而不是 22 K 缩小面板,电池电压到ADC测量范围。

动作视频

我通常不会只阅读有关某个项目的文字,而是先看视频。如果您和我一样,请欣赏视频:

改进范围

我在 Atmega8A 中用完了 Flash Space。无法添加一些关键功能,例如:

  • 软件控制的过载/短路保护
  • 一些图形图标和徽标
  • 能量测量和记录
  • 备份时间的估计和警报
  • 笔记本电脑充电选项
  • 支持 6 伏系统
  • 蓝牙负载控制
  • 基于定时器的负载控制
  • 提供更多酷炫功能的 RTC 时钟
  • 物联网连接解决方​​案

如果你有制作这样的东西的计划,那么不要忘记添加其中的一些功能!

Atmega328P(Uno) 或 Arduino Mega 可能是包含所有这些选项的更好选择。

无论如何,它完成了工作,我很满意。

其他资源

  • 下载支持 Atmega8 开发板的 Arduino 1. 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 负载#define PIN_LAMP 10 LIGHT 白灯#define PIN_BATTPWM 11 // 驱动 PMOS 进行外部电池充电 #define PIN_BATTint_Sense A2#define PIN_SOLAR_Sense A0#define PIN_BATText_Sense A3#define ADC_VREF 2.695 // 内部参考电压,对于 Arduino Uno 约为 1.11V,也就是 Atmega32me,这是我的 Atmega32me!定义 ADCVDIV_R1 22 // 22 K 分压器下电阻器#define ADCVDIV_R2 175 // 175 K 分压器上电阻器//const uint8_tskuljoke[] PROGMEM ={2,};// PIN 2 &3 用作中断开关// 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 flasher=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();液晶清除(); LcdString("*ARDUBOY PV*"); LcdString("控制器,"); LcdString("交流逆变器,"); LcdString("移动电源,"); LcdString("灯的东西!!");延迟(3000);模拟参考(内部);最大ADC_电压=(ADC_VREF/ADCVDIV_R1)*(ADCVDIV_R1+ADCVDIV_R2); pinMode(PIN_LOAD,OUTPUT);数字写入(PIN_LOAD,低); pinMode(2, INPUT_PULLUP); attachInterrupt(0, SW1, FALLING);// 中断Swithc 1 pinMode(3, INPUT_PULLUP); attachInterrupt(1, SW2, FALLING);// Swithc 2 的中断 }void loop(void){ Get_ADCVal();Context_Control();Charging_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/PV1_Voltage*2PV0tage/PV1_020.0*20.0;BattInt_Voltage=K/20.0 ////////// 显示和控制 //////////////void Context_Control(void){ if(ds==0) {show_menu();} if(ds==1 &&dp ==0) {show_info(); delay(100);} //LcdClear();Get_ADCVal();}/////////////////////进入第一个子菜单////// //////////////////// if(ds==1 &&dp ==1) { level=1; dp=0; while(level==1) { int temp=ds;液晶清除(); show_load_ctrl();延迟(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;} } }////////////////////进入第二个子菜单////////// ///////////////////if(ds==1 &&dp ==2) { level=2; dp=0; while(level==2) { int temp=ds; show_inv_ctrl();延迟(250);液晶清除(); 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;} } } //////////////////////////////////// /////////////////////////////////进入第三个子菜单////////// //////////////////if(ds==1 &&dp ==3) { level=3; dp=0; while(level==3) { int temp=ds;液晶清除(); show_led_ctrl();延迟(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);}延迟(250);if(blinker==1){analogWrite(PIN_LAMP,127);}}////////////////////// /// 要在诺基亚 5110 显示器上显示的菜单文本 /////////////////void show_menu(void){LcdXY(0,dp);LcdString("->" );LcdXY(15,0);LcdString("系统信息");LcdXY(15,1);LcdString("直流负载+");LcdXY(15,2);LcdString("交流负载~");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);LcdString("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("Charging:ON ");}else{LcdString("Charging: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("必须连接");LcdString("12V DC 负载");}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) );LcdString("LED Blk" );LcdXY(15,3);LcdString("Return");LcdXY(0,4);LcdString("LED DISABLEs");LcdXY(0,5);LcdString("当INVR开启时");}// //////////// 中断 ISR //////////////void SW1(){dp++;if(dp>
3){dp=0;} }void SW2 (){ds^=1;} ISR(TIMER1_OVF_vect) { noInterrupts(); TCNT1 =45535; // TCNT1 =25535;循环^=1;如果(周期==0); { digitalWrite(PIN_INVP,HIGH);延迟微秒(1); // 死区 digitalWrite(PIN_INVN,LOW);延迟微秒(1); } if(cycle==1) { digitalWrite(PIN_INVP,LOW);延迟微秒(1); // 死区 digitalWrite(PIN_INVN,HIGH);延迟微秒(1); } 中断(); }////////////诺基亚5110函数//////////静态常量字节ASCII[][5] ={{0x00, 0x00, 0x00, 0x00, 0x00} / / 20,{0x00, 0x00, 0x5f, 0x00, 0x00} // 21 !,{0x00, 0x07, 0x00, 0x07, 0x00} // 22 ",{0x14, 0x7f, 0x7f, 0x14, 0x14, 0x14, 0x07, ,{0x24, 0x2a, 0x7f, 0x2a, 0x12} // 24 $,{0x23, 0x13, 0x08, 0x64, 0x62} // 25 %,{0x36, 0x49, 0x55, { 0x20} 0x00, 0x05, 0x03, 0x00, 0x00} // 27 ',{0x00, 0x1c, 0x22, 0x41, 0x00} // 28 (,{0x00, 0x41, 0x22, 0x01c), } 0x08, 0x3e, 0x08, 0x14} // 2a *,{0x08, 0x08, 0x3e, 0x08, 0x08} // 2b +,{0x00, 0x50, 0x30, 0x00, 0x00,, //{0x00, 0x00,} 0x08, 0x08, 0x08} // 2d -,{0x00, 0x60, 0x60, 0x00, 0x00} // 2e .,{0x20, 0x10, 0x08, 0x04, 0x02} // 5x, 0,{0x60, {0} 0x45, 0x3e} // 30 0,{0x00, 0x42, 0x7f, 0x40, 0x00} // 31 1,{0x42, 0x61, 0x51, 0x49, 0x46} // 32 2, {0x41, {0x42} 0x31} // 33 3,{0x18, 0x14, 0x12, 0x7f, 0x10} // 34 4,{0x27, 0x45, 0x45, 0x45, 0x39} // 35 5,{0x3c, 0x4a, 0x49 // 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, / 0x00x0 / 3a :,{0x00, 0x56, 0x36, 0x00, 0x00} // 3b;,{0x08, 0x14, 0x22, 0x41, 0x00} // 3c <,{0x14, 0x14, 0x14} // 0x14 =,{0x00, 0x41, 0x22, 0x14, 0x08} // 3e>,{0x02, 0x01, 0x51, 0x09, 0x06} // 3f ?,{0x32, 0x49, 0x79, } @4x3e {0x7e, 0x11, 0x11, 0x11, 0x7e} // 41 A,{0x7f, 0x49, 0x49, 0x49, 0x36} // 42 B,{0x3e, 0x41, 0x41, 0x2f, 0x42, { 0x42} // , 0x41, 0x41, 0x22, 0x1c} // 44 D,{0x7f, 0x49, 0x49, 0x49, 0x41} // 45 E,{0x7f, 0x09, 0x09, 0x09}, {0x49}, {0x61} , 0x49, 0x49, 0x7a} // 47 G,{0x7f, 0x08, 0x08, 0x08, 0x7f} // 48 H,{0x00, 0x41, 0x7f, 0x41, 0x00}, {0x7f, 0x08, 0x08, 0x08, 0x7f} // 420 I , 0x3f, 0x01} // 4a J,{0x7f, 0x08, 0x14, 0x22, 0x41} // 4b K,{0x7f, 0x40, 0x40, 0x40, 0x40} // 4c L,{0x0x,0x2f , 0x7f} // 4d M,{0x7f, 0x04, 0x08, 0x10, 0x7f} // 4e N,{0x3e, 0x41, 0x41, 0x41, 0x3e} // 4f O,{0x7f, 0x09, 0x09 } // 50 P,{0x3e, 0x41, 0x 51, 0x21, 0x5e} // 51 Q,{0x7f, 0x09, 0x19, 0x29, 0x46} // 52 R,{0x46, 0x49, 0x49, 0x49, 0x31} // 53 S,{0x7} 0x01, 0x01} // 54 T,{0x3f, 0x40, 0x40, 0x40, 0x3f} // 55 U,{0x1f, 0x20, 0x40, 0x20, 0x1f} // 56 V,{0x30,0x40, 0 0x3f} // 57 瓦,{0x63, 0x14, 0x08, 0x14, 0x63} // 58 X,{0x07, 0x08, 0x70, 0x08, 0x07} // 59 Y,{0x61, 0x54,x43, x 0 // 5a Z,{0x00, 0x7f, 0x41, 0x41, 0x00} // 5b [,{0x02, 0x04, 0x08, 0x10, 0x20} // 5c,{0x00, 0x41, 0x70}, 0x70}, 0x40} ],{0x04, 0x02, 0x01, 0x02, 0x04} // 5e ^,{0x40, 0x40, 0x40, 0x40, 0x40} // 5f _,{0x00, 0x01, 0x04, }0x02, } 0x04, 0 {0x20, 0x54, 0x54, 0x54, 0x78} // 61 a,{0x7f, 0x48, 0x44, 0x44, 0x38} // 62 b,{0x38, 0x44, 0x44, 0x404, {0x38, {0x38} , 0x44, 0x44, 0x48, 0x7f} // 64 d,{0x38, 0x54, 0x54, 0x54, 0x18} // 65 e,{0x08, 0x7e, 0x09, 0x01, {0x01}, 0x02} , 0x52, 0x52, 0x3e} // 67 g,{0x7f, 0x08, 0x04, 0x04, 0x78} // 68 h,{0x00, 0x44, 0x7d, 0x40, 0x00}, {0x7f, 0x08, 0x04, 0x04, 0x78} // 40x,{0x04, 0x78} , 0x3d, 0x00} // 6a j,{0 x7f, 0x10, 0x28, 0x44, 0x00} // 6b k,{0x00, 0x41, 0x7f, 0x40, 0x00} // 6c l,{0x7c, 0x04, 0x18, 0x04, //x7, {0x7f, 0x7f 0x08, 0x04, 0x04, 0x78} // 6e n,{0x38, 0x44, 0x44, 0x44, 0x38} // 6f o,{0x7c, 0x14, 0x14, 0x14, 0x04, {0x08,} 0x14, 0x18, 0x7c} // 71 q,{0x7c, 0x08, 0x04, 0x04, 0x08} // 72 r,{0x48, 0x54, 0x54, 0x54, 0x20}, {0x04, 0x08, // 73,4s 0x40, 0x20} // 74 t,{0x3c, 0x40, 0x40, 0x20, 0x7c} // 75 u,{0x1c, 0x20, 0x40, 0x20, 0x1c} // 76 v,{0x30c,{0x30c} 0x3c} // 77 w,{0x44, 0x28, 0x10, 0x28, 0x44} // 78 x,{0x0c, 0x50, 0x50, 0x50, 0x3c} // 79 y,{0x44, 0x44}, 0x44}, 0x44 // 7a z,{0x00, 0x08, 0x36, 0x41, 0x00} // 7b {,{0x00, 0x00, 0x7f, 0x00, 0x00} // 7c |,{0x00, 0x41, 0x30}, // 0x30}, // 7d },{0x10, 0x08, 0x08, 0x10, 0x08} // 7e ,{0x78, 0x46, 0x41, 0x46, 0x78} // 7f };void LcdCharacter(char character){ LcdWrite(LCD_0); 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 Level 14.3 Charging off, 13.5 or below Charging on, 10.8 Load off, 12.5 Load on // 防止下一个条件夜间 % 夜间 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 时,不充电!如果 (BattExt_Voltage> 14.3 ) {analogWrite(PIN_BATTPWM,0); 当 cdc 为 2 且低于 13.5 v 时充电恢复cdc_level =3; } }else {analogWrite(PIN_BATTPWM,0);cdc_level =3;}}//欠压Lockoutvoid Discharge_Control (void){if (BattExt_Voltage <=10.8) { cdc_level =0; {digitalWrite(PIN_LOAD,LOW);} Timer1_DeInit(); }}///////////// 定时器2函数////////////// 这部分代码写成AVR风格void Timer1_Init(void) { noInterrupts(); // 禁用所有中断 pinMode(PIN_INVP,OUTPUT); pinMode(PIN_INVN,OUTPUT); TCCR1A =0; TCCR1B =0; /* ========================================50 Hz AC 表示 20 ms 波由来自 PIN_INVP 和 PIN_INVN 引脚的 2, 10 ms 脉冲形成,因此该引脚应以 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. Arduino 供电的水壶
  11. 太阳能追踪器 V2.0
  12. 了解太阳能