论坛首页 > 创客天地 > 第二届立创商城电子制作节 > 参赛作品《智能正负脉冲电动车6-...
查看:6246  |  回复:53
参赛作品《智能正负脉冲电动车6-64V铅酸蓄电池多功能充电器》
快乐电子
5
主题
188
回复
发表于Wed Jun 21 20:17:52 CST 2017   |  只看该作者 1# 电梯直达

【报名阶段需要填写的内容】 

 

1. 参赛者姓名(必填项):

刁扣林 

2. 单位或学校名称(必填项): 

江苏扬州大学水利学院电气技术专业 

3. 当前职务或职称(必填项): 

助理工程师 

4. 参赛作品的名字(必填项): 

智能正负脉冲电动车6-64V铅酸蓄电池多功能充电器 

5. 简要陈述您的idea和作品(必填项): 

 集正负脉冲、脉冲修复、智能定时、温度补偿、反接保护/极性自动切换、充满关闭输出(间歇浮充)、蜂鸣提醒、数码显示等功能于一身的电动车铅酸蓄电池三阶段充电器,是广大电动车用户一直追求的充电利器。能够做到6V12V16V18V24V36V48V60V64V通用的更是不可多得。一款真正能保护电池、延长电池寿命的智能充电器,无论对用户还是对环境保护都大有好处。

电池厂家之间,同一厂家不同批次之间,甚至同组电池之间都存在或多或少的差异,电池也受使用环境及气候变化、电池从新到旧容量衰减等因素影响,要真正动态保护电池,对充电器的智能程度要求较高,同时对设计者的经验积累、经验转化为技术应用的能力要求也较高。本充电器针对行业使用最广泛的3842+运放方案充电器存在的诸多不足而设计,基于STM8S005K6T6C控制(市场普通充电器一般只使用0.5-0.7元的简单MCU控制,为的是节约成本,但程序空间限制无法做出满足实际使用的智能充电器),内置强大的充电管理系统,为本人十多年研究铅酸蓄电池充电的经验总结和技术应用。

本充电器采用9.5cm孔距边灯电动车充电器外壳,12V 5012散热风扇,双灯柱--红绿双色充电指示灯和负脉冲指示灯。使用ACDC独立供电模块,保证了控制系统的稳定,避免因控制系统不稳定而导致充电异常的情况,同时提供蜂鸣提醒、实时数码显示等功能,每个阶段的开始和结束都有相应的灯光和蜂鸣提示,用户要了解充电器工作状态十分直观方便,数码显示功能除了显示实时充电电压电流以外,还有已充容量统计、充电进度估算、充电剩余时间估算等实用功能。特别为专业人士准备了修复功能,是电池修复的得力助手。充电器提供USB扩展接口,实现固件升级和外接显示设备等功能。

充电器可实现6-60V 5-20AH以内电池组的全自动充电管理,电压级别自动识别,无需手动设置,一机多用。动态电压、动态电流、动态定时智能处理,不论电池新旧老化衰减程度如何,针对电池在各个充电阶段可能出现的异常情况实时动态分析,确保100%智能转灯,大大降低充坏充鼓电池的机率,保证电池正常寿命。同时提供了丰富的设置选项,用户可以在6-64V 5-200AH之间逐级调节(目前此款可以做到60V4A充电电流也就是在250W左右的输出)。

充电器全程正脉冲充电,同时增加负脉冲模块,能够减少电池失水、降低电池之间的失衡。实时采集环境温度和充电器工作温度,真正带有温度补偿和充电器关键部件过热保护功能,南北四季通用。

针对广大用户担心充电器转绿灯后浮充涓流阶段会增加电池失水甚至过充的问题(其实浮充阶段不会导致过充,没有浮充阶段电池反而充不满),本充电器特别采用间歇浮充充电技术,当恒压阶段结束后,充电器主动关闭输出,待电池电压自然下降后,充电器会自动启动短暂间歇充电,既降低了电池失水,又确保了能充满,对减少电池之间失衡也有一定作用。

数码显示为三位数码管和一位按键组成的独立输入输出模块,带独立STM8S003F3P6 MCU控制,通过USB接口与充电器通信,用户通过按键和数码管可对充电器进行设置和查看相关参数,不使用数码显示时可拔掉,外观跟普通充电器一样,对于放在楼下充电的用户,可以减少充电器被惯偷盯上的情况发生。由于数码显示模块带独立MCU控制,通过显示模块有无输出、输出是否正常等亦可粗略判断充电器是否发生故障。

 

6. 拟用到的立创商城在售物料(必填项): 

STM8S005K6T6CSTM8S003F3P6LM358、三位数码管、7805CV、贴片开关、5V有源蜂鸣器、其他二极管、三极管、电阻电容等。 

7. 拟用到的非立创商城物料或其它补充(必填项): 

220VDC12V供电模块、9.5cm孔距双灯柱电动车充电器外壳、12V 5012散热风扇、电源线、散热片等 

【作品正式发表(报名成功后进入设计阶段)需要填写的内容】 

 

一、作品简介

例如,可以包括但不局限于以下内容: 

1.作品的整机外观图片或焊接组装好的PCBA图片; 

 板图截图如下,由主板和CPU板组合而成,目的是组合方便,可以适用于任何形式的开关电源组成的电动车充电器,实际也是一款全功能的数字电源,输出电压可以从0-100V或更高,电流0-6A可调。自动运行状态下目前仅适合充电电流3A以下60V以下的电池组

 

 

 

焊接好的PCB(立创贴片如下图)

  

 

 

 

成品图如下,视频中更多高清图片 可以看看

 

在这里赞一下立创的包装,不说,如下图

 

 

  

 

   

 

2.作品的研究背景、目的和功能、市场应用前景; 

技术领域

本智能充电器可应用于电动车、汽车、UPS、太阳能发电系统等常用的铅酸电池的充电及充电管理。


技术背景电动车铅酸电池充电器,是由使用集成电路3842或类似芯片控制的ACDC(alternating current direct current 交流转换为直流)电源,加控制系统组成,因为控制系统多数用运放调节,稍好一点的,也有用MCUMicro Control Unit意思为微处理控制单元)加一些逻辑控制。但市场上

大中型电动车充电器厂家基本上都是使用便宜的单片机作为控制单元,程序一般只有1-2K,价格在0.5-0.7元左右,根本无法满足铅酸电池控制的需求


目前市场上大多数

常规3842的方案,无辅助电源,控制部分的稳压电路复杂,主变压器一般有4个绕组,高压侧二个,低压侧二个,工艺复杂,生产调试麻烦,控制不容易稳定,可靠性大大降低。
3842
的电源一般要二组隔离(一组在高压侧,一组在低压侧)的辅助电源,一组为自身工作的辅助电源,另一组为输出闭环控制的辅助电源,随着充电器负载电压或电流的波动,二个辅助绕组电压变化比较大,导致3842的控制电压波动大(有时能超出30V),容易导致MOS开关管炸机,风机电压也过高容易损坏。
 
控制电压的不稳定性,容易导致输出失控,短路电流远大于输出最大电流,容易损坏MOS管和其他功率元件。
 
为了达到普通三段式的充电逻辑,用运放处理,如指示灯的控制,空载电压与有载最大电压的不同等等逻辑控制使用的外围电路均很多,增加的电路的复杂性。  充电器一般电压电流控制要求比较高,否则会充坏电池,所以生产过程中有好多电压电流的调试电阻,

要有专业技术工程才能完成,生产调试复杂,生产成本增加。


3.作品在创新性、趣味性、实用性甚至公益性方面,有哪些亮点可体现? 

 本智能充电器主要特点有: 

A、在于设计一个可靠稳定的辅助电源供给供电系统代替原有的由变压器辅助绕组产生的可变化的控制电源,让产品更可靠,用立创商城的DK112芯片,可达到10W输出(与变压器大小有关,目前本案例只能输出4-5W,因为使用的是EE13变压器)。
 B
、在于产品尽量全软件化,把MCU的功能用到极限(如PWM功能、定时功能、ADC模拟转换为数字功能、逻辑功能及外部中断功能等等),去掉原有充电器能用软件实现的所有功能模块,减少元器件用量,用最少的器件实现最多的功能,让产品硬件更可靠,也更便宜(当然保留原来好的地方,如大功率的廉价的3842方案的ACDC)。

电压电流实现全数字化可调节,所以说我们的充电器也是一个数字式恒压恒流电源。
 C
、在于引出控制芯片MCU的串口,让产品可以实现生产、销售、维护及升级的全程ERP管理,提高产品档次。

产品可以输出一个USB充电接口,如视频中USB引出线,可以接TTL-485…485-USB(隔离保护电脑),与电脑通讯监控,也可以接视频中的蓝牙模块,也可以给手机充电,因为是标准的5V输出,使用的也是立创商城的EUP3458VIR1芯片(参数如下英文描述),同时也可外扩展数码显示板,如下图

1.2A Output Current

0.3Ω Internal DMOS Output Switch

4.5V to 30V Input Operating Range 

Output Adjustable from 0.8V to 15V

Up to 92% Efficiency

1?A Shutdown Current

Fixed 1.2MHz Frequency

 

 


 D
、减少交流高压侧的上电打火,交流电源插头插入电网插座时不再打火,提高产品可靠性,同时提高产品效率,常规充电器采用热敏电阻NTC5D-11,工作时温度高,功率越大温度越高。电池输入也不打火,提高产品性能,如下图原理。高压大电解电容绕过一个12K1206的贴片电阻就可以直接对电解电容充电,充电电流只有峰值300V/12K=25mA,但最大瞬间功率只有7.5W(保险起见,可以多串二只电阻,因为上电到充电器工作至少有10秒的时间,10秒内这个高压电容基本上已经充电到300V左右了),但时间很短电容有电后功率直线下降

 


 E
、充电器不怕短路,一旦短路,充电器不工作,也不消耗交流电能量(或仅微小)。因为充电器有独立的辅助电源所以,不要担心输出短路,因为外部短路不影响内部控制电源,会恒流恒压自动控制


 F
、芯片控制辅助电源使用ACDC输出12V作为控制电源,不会因为电压波动而导致控制电压不稳定,这样MCU可以做自动识别6V直到60V,甚至更高电压的电池组的识别与充电,可以从0V开始充电,这是普通充电器无法做到的。 

 

二、系统构架图

用流程图或思维导图等形式,描述您的作品的组成构架,即方案图。 

  

 

三、硬件部分的描述 

1.附上原理图&PCB实物图的图片或者源文件(官方建议大家尽量用源文件上传),如果是图片,请确保图片是清晰可辨的; 

 

12V方案-主板 PCB板图.rar  

12V方案V2-CPU原始 PCB板图.rar 

12V方案-V2 总原理图.rar 

 电脑上位软件.rar 

 智能电动车充电器上位机软件安装包.rar 

智能充电器手机蓝牙App.rar  

 

http://pan.baidu.com/s/1nvyYPPB

手机App图片,因为App要有产品才能正常显示,否则无法进入显示状态,所以截图如上。因为上传很慢,只能外部网百度盘地址链接了


 

 

 

 

 

2.用文字把该作品的实现原理、系统的工作过程大致讲解一下。 

 实现原理:

a4个继电器组成的桥切换输出大电流极性切换功能,

无论用户的电动车是N+L-的正接充电接口,还是N-L+的反接充电接口,均能自动识别,通用性广。


b3个温度传感器,利用热敏电阻的温度变化曲线函数关系(对数),做成查表程序,来检测关键点温度进行各种控制

c、高压交流输入整流经过12K左右的大电阻进行充电,上电电流很小,所以插交流电时基本上没有火花,只有辅助电源的4.7uF400V电容的充电。再经过一个继电器切换到正常滤波状态下工作

d、直流输出经过4只继电器隔离,同时经过整流桥串一只1K的电阻检测电池有无,所以电池上电也没有火花,提高充电器寿命

e、所有继电器用12V供电,但启动完成后只用6V维持,这样可以提高继电器寿命(线圈发热小,也节约功耗)

f、变压器输出高低压二个绕组用继电器切换,可以让开关电源工作更稳定

gUSB输出,可以扩展外部数码显示、电脑串口控制、手机充电、手机蓝牙通讯、让产品更智能化,同时可以升级产品自身软件,因为没有哪一家公司能保证产品软件绝对没有问题,或绝对完善,有了这个USB,可以利用电脑串口通讯或手机蓝牙通讯对充电器进行产品升级,可以让我们的用户终身免费升级到最新状态,就像我们的微软公司对电脑系统升级一样,我们的充电器也有这个功能

h、内置FLASH存储器,可以记录产品终身的充电过程,让我们的产品管理更方便,用以通过USB接口导出内部所有的充电数据,进行电脑波形分析,充电分析,用户的电池分析,更进一步服务于用户,

通过电脑进行充电波形分析,充电状态分析,专业人士通过数据的分析即可评估电池的衰减及健康状况


i、内置蜂鸣器,可以进行各种提示(测试时去掉了,因为调试噪音暂时没加),产品默认也是无声,用户可以通过电脑控制软件或手机App软件进行开关和各种时长的调节。

蜂鸣器状态:各种状态下是否鸣叫可开亦可关,鸣叫多长可由用户设定。

持续鸣叫:电池级别设置错误(用户设置的电池电压级别与充电器检测到的实际电压级别不符)

一声短鸣:充电器开机自检、开始恒流充电、开始恒压电充、开始修复充电

一声长鸣:恒压段充电结束(可理解为充电已完成),进入间歇浮充阶段,


j、控制部分把CPU报有的引脚尽可能引出使用了,发挥芯片的最大功效,同时做成独立的CPU板(加ACDC辅助电源),这样这个控制板,可以使用所有充电器或电源模块中进行充电管理控制


k、多状态指示灯:

充电器待机/充满:绿灯常亮

恒流段充电:红灯常亮

修复充电:绿灯慢闪

电池识别错误:红灯快闪



L产品程序是我1992年毕业以来从事铅酸电池充电管理研究工作的经验总结是做了大量实验研究并投入了大量时间、心血和资金得出来的,所以不对外公开,不公开的原因也因为技术永无止境,充电研究仍在持续进行我们会不断更新软件,把最新的研究成果带给每个使用铅酸电池供电的电动车(也可能是电动汽车)的用户。一个好的产品软件并不是短时间能做出来的



我记得我看过一个微信:多少人,没熬过这3厘米?

说的就是:竹子用了4年时间才仅仅长了3cm,但第5年之后却以每天30cm的速度疯狂生长,仅用了6周的时间就长了15M,其实是在前面那4年竹子的根已经在土壤里延伸了数百平方米,我们做人做事件也是同样道理,要做好一个产品,有开发软件的本领只是多了一个解决问题的工具,真正要做的是更多的研究。所以我的充电器我会始终研究下去,不求完善,但求更好……

 

系统工作过程:

>>>上电初始化

>>>检测电池上电情况,判断电池极性,给出继电器桥动作

>>>根据充电器状态(分自动与手动)

>>>1、自动充电状态,根据电池的上电电压、进行试充电,判断电池的电压等级、电池的容量,

      >>>1.1给出适合的电压电流给电池充电(自动档只目前只区分6121624364860V容量20AH以下几种规格的电池)

      >>>1.2经过一定的时间确认电池的等级与容量,然后按标准给出充电电压与电流,进行市场上通用的三段式充电,如果识别错误也会智能断电,一切以电池的安全性为前提进行管理充电

      >>>1.3充电结束会保存所有的相关充电参数到外置FLASH芯片中。并关机给出绿灯常亮信号

>>>1.4自动充电,是充电的自动管理过程,与我们各种产品自动控制一样,是要经过大量试验经验获得,并不是我们能写单片机程序就能写出的程序,是一个实际动手与编程工具相结合的工作。所以这里我对我们搞技术的朋友说个道理,不要以为我会写程序,就很了不起,写程序只是我们的一个解决问题工具,要想写出好的适合产品的程序,是要经过大量试验,甚至一个团队的合作才能软件硬件结合写出产品的好程序。

>>>2、手动设定充电,会根据用户的电脑或手机App软件设定的参数

>>>2.1手动设定相对简单,只要按设定规格给出相应的参数充电就可以了

>>>2.2手动充电虽然简单,但要考虑到用户设定可能会错误,所以也要加入各种错误报警,同时充电过程中如果用户手动设定参数与实际负载电池不匹配,还是要启动智能保护,我上面说过了,软件的前提是以充电安全第一下进行充电管理,要保证用户设定错误也能正确充电好电池与保护

四、材料清单(BOM列表) 

列出您这个作品所用到的主要器件(关键器件即可),比如单片机&ARM芯片、专用集成芯片(ASIC)、传感器、功能模块等。 

如果所列出的芯片是来自我们立创商城上的,最好能写出该器件的商品编号或附上对应购买链接。 

  BOM.rar 

 

 

五、软件部分的描述(选填) 

如果您的作品涉及到软件,请列出作品对应的软件工作流程图,及关键部分的例程、源码(如果您想开源的话请上传全部源码)。 

工作流程,与上面工作过程类似,不再祥述

软件分3部分

 

电脑上位机软件,下面是通讯处理的关键部分,相当于软件流程

RdComNowInStr = Mid(RdComNowInStr, x4)

CmdLen = Val("&H" + Mid(RdComNowInStr, 5, 4))

If Len(RdComNowInStr) < (CmdLen + 6) * 2 Then

   Exit Sub

Else

   s = Mid(RdComNowInStr, 1, (CmdLen + 6) * 2)

   s1 = Chr_crc(Mid(RdComNowInStr, 1, (CmdLen + 4) * 2))

   s2 = Mid(RdComNowInStr, (CmdLen + 4) * 2 + 1, 4)

   If s1 = s2 Then 'CRC=OK

       s1 = Mid(RdComNowInStr, 9, (CmdLen) * 2)

       RdComNowInStr = Replace(RdComNowInStr, s, "")

       Delay_ms 3

       If 按键str <> "" Then

           SendStringToGz 按键str 'OK

           按键str = ""

       Else

           SendStringToGz  处理正常通讯OK代码的响应 'OK

       End If

       处理充电器主机所有数据Pro s1

       Pro更新所有数据到屏幕显示

   End If

  

End If

 

 

手机App软件,下面是定时0.1秒处理程序,可以看出系统工作流程处理情况

       public void run() {

           //要做的事情,这里再次调用此Runnable对象,以实现每1秒实现一次的定时器操作

           myHandler.postDelayed(this, 1 * 100);// 定时0.1S

           // 需要执行的代码

          

          

           JsC ++ ;

           T1000msC ++ ;

          

           GetSj();//获取手机日期与时间

          

           if(JsC > 100000)JsC = 20;//不能回到0,否则数据会没了

          

           if(JsC == 1){//上电0.25秒初始化 接收数据  仅执行一次

              AppNameStr="蓝牙充电器测试软件";

              CshAppDataStr();//初始化App数据和字符串  仅执行一次

           }

          

           if(JsC == 10){//上电1秒初始化蓝牙   仅执行一次

              //初始化产品数据

              LjLy();

           }

          

           if(GxWindowsFlag == 1){//更换显示模式处理

              GxWindowsFlag = 0 ;

              GetYfDisCsh();

              DisWz=1;

              ClKeyGxDis();

           }

           if(GxWindowsFlag == 2){//更换显示模式处理

              GxWindowsFlag = 0 ;

              GetZcDisCsh();

              ClKeyGxDis();

           }

          

           if(GxWindowsFlag == 3){//已经发送 增加用户显示项目命令,请等待产品回复

              for (int i = 0; i < 10; i++) {

                  YfDzDisWz[i] = YfDzDisWzUpBuf[i];

              }

              GxCaiDan();//更新菜单

              GxWindowsFlag = 0 ;

           }

          

           if(GxWindowsFlag == 4){//"删除订制"

              for (int i = 0; i < 10; i++) {

                  YfDzDisWz[i] = 0;

              }

              GxCaiDan();//更新菜单

              if(DisWz > DisPNum){

                  DisWz = 1 ;

                  ClKeyGxDis();

              }

              GxWindowsFlag = 0 ;

           }

          

          

          

          

           RecClPro();

          

           if(DisCaiDanOK == 0){

              GxCaiDan();//更新菜单

           }else{//显示菜单 已经确定,只有重新启动才能更新

              GxDisData();//更新对应显示项目的所有数据

              AutoJiaoSjCl();//自动校准时间命令处理

              AutoAhAppCl();//自动切换APP处理

           }//显示菜单 已经确定,只有重新启动才能更新

          

           KeyCaoSiClTiShiCl();//按键超时处理   提示处理

          

           //1秒处理一次接收到的数据

           if(T1000msC>=10){//1

              T1000msC = 0 ;

              Log.d("MainActivity", "1.0s");

             

              T2sC ++ ;

              if(T2sC >=2){

                  T2sC=0;//2s

                  if(NowWdC == 0){//循环显示

                     NowWdXhC ++ ;if(NowWdXhC > 2)NowWdXhC = 0 ;

                     ClStr_NowWd();

                  }//定格显示

                  if(CpWorkISetC == 0){//循环显示

                     CpWorkISetXhC ++ ;if(CpWorkISetXhC > 2)CpWorkISetXhC = 0 ;

                  }//定格显示

              }

             

             

              if(LySbFlag >=10){

                  if(LySbFlag==11){

                     LySbFlagC++;

                     if(LySbFlagC > 600)LySbFlagC = 620;

                  }

                  if(LySbFlag==12){//产品没来得及读取蓝牙参数,App自动下线让给产品通讯

                     LySbFlag12C++;

                     if(LySbFlag12C > 600){

                         MainActivity.this.finish();

                     }

                  }

              }

             

             

              if(JzSj10minFlag == 1){

                  JzSj10minC ++ ;

              }

             

              if(RecFlag == 1){

                  RecFlag = 0 ;

                  RecFlagDonTaiDisIC = 0 ;

              }else{

                  if(RecFlagDonTaiDisIC <1000)RecFlagDonTaiDisIC ++ ;

              }

             

             

             

              if(RecFlagAll ==1)

              {

                  if(RecFlagAllC < 20)RecFlagAllC ++ ;//通讯成功广告时间20秒自动结束

                  else{

                     if(DisWz == 0){

                         DisWz = 1 ;

                         ClKeyGxDis();

                         DisGG.setVisibility(View.GONE);

                         OpenCloseDis((byte)0x01);

                     }

                  }  

                 

                 

                  if(LySbFlagC>520){//蓝牙盗版,数据清除

                  

                   LyWarnFlagNow =100 ;

                   showToastL("产品没有注册,请联系开发人员" +

                          "\n刁扣林13921909367"+

                          "\n http://ljzncdq.taobao.com/");

                }

                                  

                  DisCpNameType.setText("产品名称:" + CPMC +"??\n         :"  + CPXH +"");

              }//if(RecFlagAll ==1)

             

 

           

            McBdC +=1;

              if(McBdC >=7)McBdC=1;

              if(RecFlagDonTaiDisIC < 10){

                  if(McBdC == 1)DataStr_IoDataMc = DataStr_IoData1;

                  if(McBdC == 2)DataStr_IoDataMc = DataStr_IoData2;

                  if(McBdC == 3)DataStr_IoDataMc = DataStr_IoData3;

                  if(McBdC == 4)DataStr_IoDataMc = DataStr_IoData11;

                  if(McBdC == 5)DataStr_IoDataMc = DataStr_IoData12;

                  if(McBdC == 6)DataStr_IoDataMc = DataStr_IoData13;

              }else{

                  DataStr_IoDataMc = "0.00V";

              }

           

              switch(DisWz){

              case 0://标题 广告显示

                  String GgS;

                  switch(AppName){               

                  case 0:

                     BT.setText("");  

                     if(HzDklQdDisFlag == 1){

                         GgS ="        \n"+

                                "\n"+

                                "\n"; 

                     }else{

                         GgS ="        软件启动中,请耐心等待!\n" +

                                "        正在自动进行蓝牙连接中......\n" +

                                "\n"+

                                "\n"+

                                "\n"+

                                "\n"+

                                "\n        " +

                                "\n        " +

                                "\n"+

                                "\n"+

                                "\n";

                         if(RecFlagAll == 1){

                            GgS += "\n        可以双击此屏快速进入产品参数显示页面!";

                         }else {

                            if(JsC >=2)GgS += "\n        双击此屏\n\n        可以进入手动连接蓝牙产品状态!";

                            else GgS += "\n";

                         }

                     }

                     break;

……………………………………………

 

 

 

单片机充电器控制软件,下面为主程序通讯控制流程,根据不同的命令处理不同的过程

        switch(UartCmd){

        default://定时1秒更新E2,防止干扰

                 if(Bit1mGxE2 != 0){

                      Bit1mGxE2 = 0 ;

                      RdE2Cs();

                 }

                 break;

 

        case UartCmd_Yf2VDcFlag://强制2V启动命令

                 Yf2VDcFlagWr = CmdData ;

                 E2WrByte(Yf2VDcAddr,CmdData);

                 KeyReSet();//

                 break;

        case UartCmd_YfDzDisFlag://App用户定制菜单保存

                 E2WrByte(YfDzDisFlagAddr,CmdData);

                 if(CmdData == 0)YfDzDisFlag=1; else YfDzDisFlag=CmdData;

                 KeyReSet();//

                 break;

        case UartCmd_LyZouCe:

               E2WrByte(LyZouCeAddr,1);

                 KeyReSet();//

                 break;

        case UartCmd_HandBELLAllow:

               BELLAllow = CmdData;

                 E2WrByte(BELLAllowAddr,BELLAllow);

                 KeyReSet();//

                 break;

        case UartCmd_HandFmcKg:

               FmcKg = CmdData;

                 E2WrByte(FmcKgAddr,FmcKg);

                 KeyReSet();//

                 break;

        case UartCmd_CdQdTz:

               if(ProFlag == ProFlagHL){//允许启动与停止

                       if(CmdData == 0)

                       {

                        CdQdTzFlag = CdFlag_Zt;     //暂停状态

                        CdQdTzFlagHandBuf = CdFlag_Zt;

                      }

                       else

                       {

                        ZaiQdFlag = 1 ; //再启动标志

                        CdQdTzFlag=CdFlag_Qd;

                        CdQdTzFlagHandBuf=CdFlag_Qd;

                       }

                       KeyReSet();// 

                  }else{

                      CmdData += 10 ;

                      KeyReSet();//  

                  } 

                 break;

        case UartCmd_XfQdTz:

               XfFlag3H2o = CmdData;   

                 KeyReSet();//  

                 break;

        case UartCmd_AHSetData:

                 AHSetData =   CmdData    ;

                 E2WrByte(AHSetDataAddr,CmdData);

                 E2WrByte(CpCutISetAddr,0);

                 E2WrByte(CpH2oISetAddr,0);

                 E2WrByte(CpWorkISetAddr,0);

                 E2WrByte(CpWorkTimeSetSaveAddr,0);     //清定时最大工作时间=0

                 if(CmdData == 0){

                      E2WrByte(CpVbNumAddr,0);

                 }else{

                      if(CpVbNumSet == 0){

                            E2WrByte(CpVbNumAddr,48);

                      }

                 }              

                 KeyReSetCsh();//

                 break;

        case UartCmd_SetVe:

               E2WrByte(CpVbNumAddr,CmdData);

                 E2WrByte(CpWorkISetAddr,0);

                 E2WrByte(CpCutISetAddr,0);

                 E2WrByte(CpH2oISetAddr,0);

                 E2WrByte(CpWorkTimeSetSaveAddr,0);     //清定时最大工作时间=0

                 if(CmdData == 0){

                      E2WrByte(AHSetDataAddr,0);

                 }else{

                      if(AHSetData == 0){

                            E2WrByte(AHSetDataAddr,12);

                      }

                 }   

                  KeyReSetCsh();// 

                 break;

        case UartCmd_SetIe:

               E2WrByte(CpWorkISetAddr,CmdData);

                  E2WrByte(CpWorkTimeSetSaveAddr,0);    //清定时最大工作时间=0

                  KeyReSetCsh();//

                 break;

        case UartCmd_SetTmax:

               E2WrByte(CpWorkTimeSetSaveAddr,CmdData);

                KeyReSetCsh();//

                 break;

        case UartCmd_SetIxf:

               E2WrByte(CpH2oISetAddr,CmdData);

                KeyReSetCsh();//

                 break;

        case UartCmd_SetIcut:

               E2WrByte(CpCutISetAddr,CmdData);

                KeyReSetCsh();//

                 break;

       

        case UartCmd_JiaoV:

               if(VJiaoZData == 0) mlx = 2670;

                  else    mlx = VJiaoZData;

                  mlx *=  CmdData;

                  mlx /=  VBData;

                  VJiaoZData = mlx;     //55.7V

                  E2WrByte(ADCVbJZAddr,VJiaoZData>>8);

                  E2WrByte(ADCVbJZAddr+1,VJiaoZData);

     

                  KeyReSet();//            

                 break;

        case UartCmd_JiaoI:

               if(IJiaoZData == 0) mlx = 100;       

                  else    mlx = IJiaoZData;

                  mlx *=  IoData;

                  mlx /=  CmdData;

                  mlx /=  10;

                  IJiaoZData = mlx;

                  if((IJiaoZData > 90) && (IJiaoZData < 130)){

                      //先暂停充电,防止干扰

                      CdQdTzFlag = CdFlag_Zt;  //暂停状态

                      CdQdTzFlagHandBuf = CdFlag_Zt;

                      AutoZtC = 0 ;

                      KeyReSet();//

                      SaveE2Flag = 10 ;

                           

                  }else{

                      CmdData = IJiaoZData ;

                      KeyReSet();//  

                  } 

                 break;

        case UartCmd_HandYzCd:

               if((ProFlag == ProFlagHL)&&(BitVbNumSbOK==3)){

                       YyCd1s = (CmdData>>8) ; YyCd1s *= 60 ;

                       YyCd1s += (uchar)CmdData ;YyCd1s *= 60 ;

                       if(Now1sUp >= YyCd1s)YyCd1s=0;

                       else KeyReSet();//

                  }

                 break;

        case UartCmd_SetLYR_XiaoSo://UartCmd_SetLYR:

               x =  CmdData ;

                 x &= 0xF000;//得到年份

                 x >>= 12 ;

                 E2WrByte(MarkYearAddr,x);

                 MarkYear = x ;

                 x =  CmdData ;

                 x &= 0x0fff;//得到年份

                 E2WrByte(MarkMonAddr,(CmdData>>8));

                 MarkMon = (CmdData>>8) ;

                 E2WrByte(MarkDayAddr,(uchar)CmdData);

                 MarkDay = (uchar)CmdData;

                 KeyReSet();//启动按键响?

                 break;

        case UartCmd_SetLYRdkl:

               x =  CmdData ;

                 x &= 0xF000;//得到年份

                 x >>= 12 ;

                 MarkYearDkl = x ;

                 E2WrByte(MarkYearDklAddr,x);

                 x =  CmdData ;

                 x &= 0x0fff;//得到年份

                 E2WrByte(MarkMonDklAddr,(CmdData>>8));

                 MarkMonDkl = (CmdData>>8) ;

                 E2WrByte(MarkDayDklAddr,(uchar)CmdData);

                 MarkDayDkl = (uchar)CmdData;

                 KeyReSet();//启动按键响?

                 break;

        case UartCmd_RstCp:

               KeyReSetCsh();//启动按键响?

                 break;

        case UartCmd_SetReCc:

                  WrECc();

                  KeyReSetCsh();// 

                 break;

        case UartCmd_HjwdSet:

               HjWd = CmdData;

                HJWdCmd = 1 ;HJWdCmdOkFlag = 1 ;

                KeyReSet();//  

                 break;

        case UartCmd_RdUIWd:

               HandDisC = 220 ; //读取一次成功

                KeyReSet();//  

                 break;

        case UartCmd_AngQmm://安全密码操作叫一声音

                KeyReSet();//  

                 break;

        

        case UartCmd_DianFei05:

                  if(CmdData == 0){

                           DianFei05Flag = 0 ;

                            ZaiQdFlag = 1 ; //再启动标志

                        CdQdTzFlag=CdFlag_Qd;

                        CdQdTzFlagHandBuf=CdFlag_Qd;

                        Now1sYsCd = 0 ;

                        YsCdKg = 0 ;

                  }else{

                       DianFei05Flag = 1 ;

                       YsCdKg = 1;

                       mlx = CmdData ;

                       mlx *= 60 ;

                      Now1sYsCd=mlx;

                     

                      //暂停充电器

                      CdQdTzFlag = CdFlag_Zt;

                  }

                  KeyReSet();// 

                 break;

        case UartCmd_YsCdTimeSet:

               //AH为自动状态,才能延时,如果设定了AH就不允许延时充电

                  YsCdTime = CmdData;

                  E2WrByte(YsCdTimeAddr,CmdData);//刁扣林模式

                  KeyReSet();// 

                  if(YsCdTime != 0)

                  {

                      YsCdKg = 1;

                      Now1sYsCd=YsCdTime;

                      Now1sYsCd*=3600;

                      //暂停充电器

                      CdQdTzFlag = CdFlag_Zt;

                  }

                  else{

                   ZaiQdFlag = 1 ; //再启动标志

                   CdQdTzFlag=CdFlag_Qd;

                   CdQdTzFlagHandBuf=CdFlag_Qd;

                   Now1sYsCd = 0 ;

                   YsCdKg = 0 ;                  

                  } 

                 break;

 

        case UartCmd_YsCdTimeKg:

               if(YsCdKg == 0){

                       YsCdKg = 1;

                       if(YsCdTime != 0)

                       {

                           Now1sYsCd=YsCdTime;

                            Now1sYsCd*=3600;

                            //暂停充电器

                            CdQdTzFlag = CdFlag_Zt;

                       }

                  } 

                  else

                  {

                        YsCdKg = 0;

                        ZaiQdFlag = 1 ; //再启动标志

                        CdQdTzFlag=CdFlag_Qd;

                        CdQdTzFlagHandBuf=CdFlag_Qd;

                        DianFei05Flag = 0 ;

                        Now1sYsCd = 0 ;

                  } 

                  KeyReSet();//   

                 break;

       

 

        case UartCmd_SyLenPowup:

        case UartCmd_SyLenGotoHl:              

        case UartCmd_SyLenGotoHy:

        case UartCmd_SyLenGotoXf:

        case UartCmd_SyLenGotoEnd:

               E2WrByte(UartCmd+56,CmdData);

                 RdE2SyCs ();//

                 KeyReSet();//

                 break;

                

        case UartCmd_DelYfDzDis:

                 for(i=0;i<10;i++)

                 {  //保存命令有效字节

                      E2WrByte(YfDzDisWzAddr+i,0);      

                 }

                 KeyReSetCsh();//

                 break;

 

        case UartCmd_YfDzDisWz:

             for(i=0;i<10;i++)

                 {  //保存命令有效字节

                      E2WrByte(YfDzDisWzAddr+i,RecAppAckOk[i+2]);         

                 }

                 KeyReSetCsh();//

                 break;

 

        case UartCmd_CpSengJi: //产品升级

                DklCpSj(); 

                 break;

        }

 

 

 

 

六、作品演示 

请上传您的作品的功能演示到腾讯视频,并编辑到本楼(或附上视频链接)。按要求上传视频可获得5分,具体详见活动规则。 

https://v.qq.com/x/page/h0540biktvq.html

 

 

七、总结 

例如您在完成该作品过程中的一些体会、碰到的技术问题或调试经验、作品的未来规划,及对我们主办方的建议和意见等。 

1、经过设计二次打样,并贴片加工,继电器控制是一个电感性负载,在继电器启动时功率比较大,辅助电源不能太小,初期使用THX208芯片,后来更改为DK112

2、要同时使用到电子负载、电池负载、开关电源知识、STM8单片机编程、手机App开发软件eclipse的操作,电脑控制上位机软件VB的编写要一个人同时完成,要求我们的技术人员能够掌握更多的编程工具,否则就要使得到一个很大的团队才能去操作系统产品,

否则就要使用到一个很大的团队才能完成系统产品设计工作。


3、产品硬件全部公开,源程序不公开,但公开源程序的思维,公开目的让更多的用户知道产品为什么要这么开发,有什么好处,而不是怕别人去盗版软件,软件不怕盗版,而且我们还要不断完善和更新

电动车铅酸电池充电器,是一个值得永远去研究的事件,希望更多的人知道充电器原理

市场上普通充电器不是不好,而是不智能,普通充电器目前市场做的相当好了,我们也保留了这个优点:3842便宜方案的大功率开关电源;你知道铅酸电池的使用在市场上是变化多样的,电压等级有高低不同,容量也有大小不同,这是我们用户能够直接看到的不同。还要好多隐藏的不同,下面我再多介绍一下这些,也是产品设计思维用今后的方向

3.1环境温度的不同,会导致铅酸电池能量的不同,温度高电池活性加强,容量也加大,但如果用普通充电器就不能发挥这个优势,因为普通充电器没有温度补偿功能,夏天充不满,冬天充不足,导致电池寿命下降.我们做的程序要能够检测到环境温度的变化,就是这个原因。可以控制因环境温度变化带来的普通充电器的不足

3.2用户使用习惯的不同:有的人喜欢先插交流后插直流电池,有的人却相反,先插交流好处是内部输出电解电容已经充电到与电池电压相当的电压,再插直流就打火不打,但坏处是充电器是空载,也是普通充电器最不稳定的时候,导致硬件损坏,所以好多厂家要求先插电池再插交流,对客户提出更多的要求。我的设计理念是不管用户如何使用你的产品,不能因为用户的使用不同而让产品损坏或让用户电池损坏,这就要求智能,也要求我们软件硬件更好地配合使用。我们充电器不管先插交流还是先插直流均没有任何关系,因为均不会有火花(或者说只有很好的火花,因为只有mA级的上电电流)

3.3、工作环境的不同,因为用户使用的环境你是无法知道的,并不是固定在家中车库中充电,有时会在公司或在野外工作时充电,地表温度可能比较高,所以我们充电器就要有各种温度保护,充电器使用的3只温度传感器,就是为各种保护做好硬件准备的,而代价也不高,一个传感器加人工不超出0.2元,因为只有2只电阻就解决了温度测量问题,我们软件能够做到精度正负3度内的控制是没问题的,具体保护过程也是我们反复研究的结果,目的只有一个,充电器你可以不工作,但不能不安全。普通充电器做不到,是因为他想太便宜,一个0.6元的只有1-2K的程序空间,请问他能做多少测量与保护,这就要有一个性价比,而STM8给我们的性价比就比较高

3.4、电池厂家不同,生产工艺不同,导致充电不能相同。也许大家感觉怪,电池厂家有电池厂家的标准,人家生产肯定按标准来生产,说的不错,但你要知道再高的标准,他总有不足的地方。现在电池一般是48V以上的电池组,至少有4节电池串在一起使用,只有电池组内的电池单只个体有稍微差别,就会使各个电池上的充电电压不一样,随着使用的时间长之后,就会产品明显差异,这就叫单只落后现象,是电池生产厂家控制不了的,只要串联使用,就无法控制,普通充电器的固定程序,只能那个标准48V电池组59V最高电压,55V浮充电压,转灯电流0.6A左右,也就无法满足这种问题的解决。

我们充电器能够全程检测电池电压电流的变化,可以从0V充电到100V,能够适应各种电池充电的要求。单只落后的电池,在充电时这个电池电压就会上升很高很快,而其他电池电压还相对较低,普通充电器由于输出的最高电压值是固定的,会导致大部分电池因为这一只落后电池的影响还没有真正充满电压已经到了最高电压而提前关机,好的电池始终无法充好电,差的电池也得不到改善,日积月累,恶性循环,坏的越坏,好的也慢慢坏了。48V电池为例,48V电池由4只12V电池串联而成,要充满单只12V电池的最高电压是14.7V左右,4只就是58.8V左右(约等于59V),落后的电池由于储存电能的能力下降,由于充电过程中电压上升较快(可以理解为充电时间相比另外三只电池缩短),实际出现的问题是,落后的电池已经达到了14.7V,需要结束充电了,但另外三只由于储存电能的能力大,电压可能还在14V以下,继续充电的结果就是落后的电池电压持续上升,可能会升到16V以上,充电器只能等四只电池串联后的总电压达到59V时才能判断电池已经充满。结果就是落后的电池过充,而其他电池还没有达到14.7V就已经停止了充电 ,没有办法充满。我们的充电就不一样,我们可以控制输出电压的变化,不固定这个59V,做动态数据分析处理,做出相应措施,普通充电器就无法做到


上面是很快充电到59V最高电压下提前关机的,还有的是永远充电不同59V而无法关机的,好一点充电器做了部分智能,只是加了定时,可用户充电习惯不一样,有的人电快用完了才充电器,有的人出去用了10-30%就可能充电,此时你的定时也无法起作用,因为充电到那个点的时间不一样,还是会过充电很多,只是比没有定时的稍微好了那么一点点,但不起多大作用

还有很多电池充电时异常情况,有恒压时电流失控的,行业中也叫热失控,总之很多很多的特殊情况会导致充电不正常,如何对待,简单的程序肯定满足不了这些需求,只能做我们这种动态去跟踪作不同的处理,也就要求我们去做大量的试验,并亲身体验,自己就要做用户,所以做软件只是会了一种工具的使用,就像我们会使用万用表一样,只是一个工具,大量的还要靠研究+试验才能做出一个好产品

4、下面再谈谈对立创主办方的建议和意见

4.1、感谢第二届立创商城电子制作节给我这个机会在这次展示的我产品,更准确一点说是展示我的思维,让更多的老百姓了解手上的充电器产品的更多的特点,为老百姓更好使用充电器作点宣传,因为常规电动车电池一套有400-1000元左右,也是老百姓的一个算是比较大的开支,就要对得老百姓花的这个钱,而我充电器普通市场只要30元不到,常规修理点一般也只有50元左右,而我这个充电器的与常规充电器造价相比也就多了不到5元的成本,相比一个销售50元的充电器不算太高,销售价格全让销售商抄高了。与我的房价也一样,可能抄的人太多了导致价格提高太多,不能走向合理价格上去

4.2、本人设计的硬件全部公开,且我做PCB时器件规格全部直接打到板子,不用你盗版,我直接送给你,但一个产品好坏不仅在于这个看得到的硬件上,还有更多看不到的软件上,智能管理上,这是一个长久的设计理论思维过程,我设计的所有产品均加上USB接口,方便升级产品程序,而且永远免费升级,所以我们硬件尽可能不要更改太大,确保硬件兼容性好

4.3、立创,这里我不仅说商城还有PCBSMT业务,我觉得总体立创是一个良心企业不多的单位,有问题可以投诉、处理问题很满意(我的基本积分:31125,使用至少也有5-10年了,不细查具体多少了,有问题的很少,以前有过,但很快解决,最近5年基本没有投诉过)价格公开透明,在这里为立创点个赞

4.4、我的产品模块化生产、控制CPU与辅助电源一体,直接在立创贴片生产比较,价格也适中,PCB板只有75*33.3,价格只有1.2元不到,以后可以在立创公开免费送板,而且可以把电阻电容贴片好送出去,喜欢的人自己去编程,也是一个很好的开发板,一个220V交流供电的开发板,可以做其他产品使用,因为我已经把所有IO引出了,可以用排针引出,也开以开槽接入各个系统中

4.5、如果有人愿意,我会贴片好后另一面器件我人工二次也用钢网焊接,与机器焊接效果相当(电阻电容已经全部立创贴片好了,没有贴片的就是IC了,以及插件元件),预计整体板总销售价格20-25元,要求不高我每块板零售毛利润10元,批量毛利润可以做到你想要的价格,问题是你诚意。而且产品程序终身免费升级,我的研究会永远做下去