文档说明
资料中提供的是一份针对铅酸电池的 太阳能12V/24V自动识别充电控制器的技术资料,包括硬件图纸、源程序、工艺说明和使用说明,技术资料。
1、 硬件图纸包括一份原理图和对应的PCB图,使用PROTEL99SE或者其他兼容软件打开,没有该软件或者兼容软件的,请自己想办法下载软件。
2、 开发环境,源程序使用C语言编写,开发环境使用STVD+COSMIC。STVD是ST公司官方提供的免费单片机开发平台,只能编译汇编,但允许使用第三方C语言编译器COSMIC,在STVD的平台上运行源程序,除了去ST公司下载STVD以外,还要去COSMIC官网下载针对STM8单片机的第三方软件。COSMIC提供32K免费一年的版本,用户可以下载注册获取许可证,有了STVD和COSMIC就可以建立起软件开发平台了。需要注意的是,由于COSMIC的免费版本不断升级,安装时的路径可能与源工程文件中设置的目录有差别,用户可以在STVD的工程设置中修改成正确的编译器连接目录。如下图:
在Toolset中选择 STM8 Cosmic,在Root path中选择COSMIC STM8的正确路径。
源文件中使用iostm8s003.h头文件,可以使用COSMIC提供的iostm8s103.h替代。
3、 关于单片机STM8S003K3的开发环境,提供了三份文档,三份文档均来自ST公司官方资料。
A、 基于STM8S单片机如何进行项目开发,开头讲到了开发需要的文档信息。
B、 STM8S003K3的数据手册,注意这份文件只是针对该型号的一些特异性和电气属性,不涉及寄存器与具体的编程操作。
C、 STM8S系列单片机的中文编程手册,英文好的最好到官网下载英文的手册,英文有时候比中文版本的更新信息更准确。该文档介绍了STM8S整个系列的寄存器以及操作方法,不特指STM8S003K3。
4、 关于工艺说明书以及实物
本套资料是经过市场检验的,确定可以使用的产品资料,工艺说明书以及使用说明书中给出了比较详细的加工,使用注意事项。
5、本程序是其他程序中移植而来,所以源程序C语言的变量、宏定义和一些语句可能与本模块无关,但是并不影响功能,阅读或移植时,请留意辨别。
该说明书对应的硬件版本:12V/24V V1.0
一、 模块参数
1、 系统电压: 12V/24V自动识别
2、 额定充电电流:20A
3、 提升充电电压:14.6V / 29.2V
4、 直充充电电压:14.4V / 28.8V
5、 浮充充电电压:13.6V / 27.2V
6、 超压保护: 17V / 34V
7、 欠压: 12V / 24V
8、 过放: 11.1V / 22.2V
9、 温度补偿: -4mV /℃/2V
二、 系统连线
请按下图连接,最好在蓄电池的正极出线口使用一个保险丝,防止蓄电池外线短路。
图1 连接图
三、 LED指示灯说明12V/24V
1、 太阳能电池板指示灯:常亮表示有光照;黑夜指示灯熄灭;快速闪烁表示系统超压。
2、 浮充指示灯:进入充电状态,该灯闪烁;不充电,该灯灭。
3、 蓄电池指示灯:该灯常亮表示电压高于12.5V/25V,电压正常;蓄电池电压大于11.1V/22.2V,但是小于12.5V/25V,该灯闪烁表示欠压。
4、 蓄电池缺电:该灯亮,表示电压低于11.1V / 22.2V;电压回复到12.5V以上,则熄灭。
四、 注意事项
1、 电路板固定时,要特别留意如果固定器件是金属,千万不可导致电路板上电路短路。
2、 连接蓄电池和太阳能板的导线一定要牢靠,焊接导线的时候可以在走大电流的路径上再加焊锡,以增大导通能力。
3、 电路板不防水,要在恰当的环境下使用。
4、 尽量通风,可以有效降低发热。
加工工艺参考书
本指导书针对电路板:12V/24V 20A V1.0
加工工艺仅作参考,可根据实际情况和经验做调整。
一、 工具类
1、 电烙铁:焊接插件和涂锡选用40W或者50W电烙铁,功率太低的电烙铁可能拉锡的时候功率不够,过大功率的电烙铁可能会导致铜皮脱落。但是焊接贴片元器件时,建议使用外热20W/30W电烙铁。
2、 专用工装:工装是用来焊接保持产品一致性,提高生产效率的特定装备,需要根据用户自身需求自行设计,比如焊接4个LED灯的高度控制等,可以考虑自行设计工装。
二、 MOS管的组装
1、 电路板上共使用2颗MOS管,充电电流会流经这两颗MOS管,所以当以20A充电时MOS管会发热,MOS管上必须安装散热片以解决发热问题,否则MOS管会因为发热严重而烧毁。因此MOS管跟散热片的安装非常重要。
2、 散热片是双管脚固定的,实际电路板上只有一个管脚用到,所以另外一个管脚可以剪掉或者压弯。
3、 在MOS管的扇热面涂抹导热硅脂,将MOS管和散热片用螺钉拧紧。注意必须保证MOS管跟散热片接触紧密,这样有利导热,另外还要保证MOS管的固定位置处于散热片的中间,否则散热片的管脚和MOS管管脚焊接时错位。
三、 焊接流程
贴片元器件使用贴片机自动焊接,以下仅针对插件以及大电流走线的涂锡部分。
1、 插件焊接原则是先焊接矮的,再焊接高的。
2、 焊接电容时,请注意插件电容均有极性,请按电路板上的标识进行焊接,请勿极性焊反。电容焊接时,电容管脚不能悬空,要将电容安装到位后焊接。
3、 焊接40A保险丝时,为了保持整洁美观,保险丝最好不要悬空焊接。因为保险丝上要走大电流,所以焊接保险丝必须要有足够的焊锡。
4、 焊接4个LED指示灯。LED指示灯是有方向的,切勿焊反。实际LED指示灯长脚对应二极管的正极,短脚对应二极管的负极。焊接高度的控制 可以根据实际要求利用工装解决。另外要注意由于LED的安装高度较高,两个管脚之间要避免短路。
5、 大电流部分的拉锡焊。模块以20A充电时,电路板部分线路上会流过大电流,为了增加电路板走线的导通能力,需要在部分走线上拉锡。电路板上所有开窗的走线正面和反面均需要做拉锡处理。拉锡均匀且足量。除了走线拉锡以外,MOS管与走线相连的部分也要涂上足够的锡,总之在整个20A电流的回路中不管走线粗还是细都尽量多涂焊锡,以确保导电能力。
四、 充电测试
1、 焊接完成以后,进入测试以前,先要目测一下电路板上器件状态,电容极性有无搞错,二极管方向是否正确等等。
2、 连接导线测试。导线连接示意图见使用说明书
单片机源程序如下:
- /*
- 程序:太阳能控制器充电模块
-
- 硬件:本程序适用12V/24V 20A V1.0
- 作者:
- 日期:
- 基本功能表述:
- 1、只有充电功能
- 2、额定电压: 12V/24V铅酸电池自动识别?
- 3、提升充电电压:14.6V/29.2V
- 4、直充充电电压:14.4V/28.8V
- 5、浮充充电电压: 13.6V/27.2V
- 7、超压电压: 17V/34V
- 8、欠压: 12V/24V
- 9、过放: 11.1V/22.2V
- 10、温度补偿范围 -5 --- 55 °,仅对 充电返回,提升充电,直充 , 浮充进行补偿
- 11、使用内部 16M RC振荡器,2分频,8Mhz运行,对于时间要求不严 ,可使用内部RC,如果对时间要求很高,则使用外部8M晶振
- 12、额定电流 20A
- 修改记录:
- 修改LED的指示功能
- 1. 1号灯,绿灯,不接太阳能板或者黑夜时 不亮, 接上太阳能电池板,有光照时 常亮。
- 2. 2号灯 绿灯,开始充电后,闪烁;不充电 不亮。
- 3. 3号灯 绿灯,电压达到正常电压后,常亮, 低于标准电压后闪烁。
- 4. 4号灯 红灯,电池降低到最低电压后红灯常亮, 高于最低电压熄灭。
- 修改PWM_BAT初始化时的状态,有原来的初始=0,改为初始化=1, 以关闭对应MOS管
- */
- #include <iostm8s003.h>
- #define GLOBAL
- #include "data.h"
- #include "ad.h"
- #include "display.h"
- #include "manage.h"
- //-------------------------------------------------
- //--------------------------------------------------
- //---------------------------------------------------------------------------------
- //----------------------------------------------------------------------------------
- //----------------------------------------------------------------------------------
- void sys_initialize(void);
- void wtd_manage(unsigned char wtd_data);
- int main( void )
- {
- //--------------clock--io,ad,time,eeprom,ram initialize-------------
- sys_initialize();
- while(1)
- {
- analyze_manage(); //根据ad值 综合处理
- wtd_manage(IWTD_FEED); //喂狗
- }
- }
- void wtd_manage(unsigned char wtd_data) //独立看门狗一旦开启 ,将无法关闭
- {
- if (1 == wtd_data) //启动看门狗
- {
- IWDG_KR = 0XCC;
- IWDG_KR = 0X55; //解锁
- IWDG_RLR = 0XFF;
- IWDG_PR = 0x06; //256分频
- IWDG_KR = 0XAA;
- }
- else if (2 == wtd_data) //喂狗
- {
- IWDG_KR = 0XAA;
- }
- }
- void sys_initialize(void)
- {
- unsigned char temp1 = 0;
- unsigned char temp2 = 0;
- unsigned char temp3 = 0;
- unsigned long temp4 = 0;
- //---------------如果需要对时钟进行管理先进行时钟管理---------------
- for(temp4 = 0; temp4 < 255; temp4++)
- {
- ;
- }
- //---------------使用内部RC---------------
- CLK_ICKCR |= 0X01;//开HSI
- while (!(CLK_ICKCR & 0x02));
- CLK_CKDIVR = 0X08; //HSI 2分频后 8M,保持与外部晶振一致,CPU的频率 = 8M
- CLK_HSITRIMR = 0x00; //不进行校正
- TEST:
- CLK_PCKENR1 = 0X80; //TIME 1 时钟使能
- CLK_PCKENR2 = 0X08; //AD
-
- //-----------------io 口设置--------------------------
- CFG_GCR |= 0x01;//PD1做io口,不做SWIM仿真口
- PA_DDR = 0X08; //PA3 输出,PA1,PA2设置成输入
- PA_CR1 = 0XFE; //PA3 推挽输出,PA1 PA2上拉输入
- PA_CR2 = 0X00; //
- PA_ODR = 0X00; //输出为0
-
- PB_DDR = 0XC0; //PB6,PB7输出,PB5 PB4 PB0未用,PB3--PB1 ,AD?
- PB_CR1 = 0Xf1;
- PB_CR2 = 0X00;
- PB_ODR = 0X00; //
-
- PC_DDR = 0X00; //PC全部没有使用
- PC_CR1 = 0XFF; //
- PC_CR2 = 0X00; //
- PC_ODR = 0X00; //
-
- PD_DDR = 0XC0; //PD6、PD7作为PWM控制输出 推挽,其他PD口 均做上拉输入
- PD_CR1 = 0XFF;
- PD_CR2 = 0X00;
- PD_ODR = 0x80;
-
- PE_DDR = 0X00; //PE5 上啦输入
- PE_CR1 = 0XFF;
- PE_CR2 = 0X00;
- PE_ODR = 0X00;
-
- PF_DDR = 0X10; //PF4 推挽输出
- PF_CR1 = 0XFF;
- PF_CR2 = 0X00;
- PF_ODR = 0X00;
-
- //-----------------ram 初始--------------------------------------
- ad_ch.pv_mosoff = 0XFF; //设置成黑夜
- flag.charge_enable = DISABLE; //
-
- //-----------------ADC 采集设置----------------------------------
- ADC_TDRL = 0XFF;
- ADC_TDRH = 0XFF;
- ADC_CSR = 0X02; //通道2,禁止转换中断,禁止模拟看门狗中断,转换未结束
- ADC_CR1 = 0X20; //8MHZ 4分频,频率2M,单次转换,禁止ADC
- ADC_CR2 = 0X08; //数据右对齐,禁止外部触发,禁止扫描
- ADC_CR3 = 0X00; //
-
- //-----------------定时器TIME1设置,0.5ms中断一次------------------------------------
- TIM1_PSCRH = 0X00;
- TIM1_PSCRL = 0X07; //8分频 后 1MHZ
- TIM1_ARRH = 0X01; //定时 0.5ms
- TIM1_ARRL = 0Xf4;
- TIM1_CNTRH = 0X00;
- TIM1_CNTRL = 0X00;
- TIM1_CR1 = 0X01; //启动计数器工作,允许更新事件发生?挥屑拇嫫鞲虏挪率录?
- //禁止自动预装载,计数器向上计数,边缘 对齐
- TIM1_IER = 0X01; //允许更新中断
-
-
- display_open();
- _asm("rim");
- wtd_manage(IWTD_ON);
- }
- //----------------------------------------定时器中断 0.5ms-------------------------
- @far @interrupt void tim1_over_int (void)
- {
-
- static unsigned char time_30MS = 0;
- static unsigned char ad_times = 0; //ad采集的次数
-
- static unsigned int time_2000MS = 0;
- static unsigned char time_pulse = 0;
-
- static unsigned char time_load_pwm = 0;
-
- static unsigned long time_bat_full = 0; //电池充满时间
-
- unsigned char i;
- unsigned int temp_ad;
- static unsigned char count=0;
-
-
- static unsigned int led_pv_time = 0;
- static unsigned int led_float_time = 0;
- static unsigned int led_bat_time = 0;
- static unsigned int led_load_time = 0;
-
- TIM1_SR1 &= ~0X01;
-
- //--------------各种延时,延时可能存在交差,所以使用各自延时,不共用-------------------
-
- if (flag.start_delay_10M_open == 1) //延时10分钟 对应黑夜判断
- {
- if(++time_delay_10M_open >= TIME_DELAY_10M)
- {
- flag.over_delay_10M_open = 1;
- }
- }
-
- if (flag.start_delay_10M_close == 1) //十分钟 对应白天判断
- {
- if(++time_delay_10M_close >= TIME_DELAY_10M)
- {
- flag.over_delay_10M_close = 1;
- }
- }
-
-
- if (flag.start_delay_2S_day == 1) // 此处的时间2S
- {
- if(++time_delay_2S_day >= TIME_DELAY_2S)
- {
- flag.over_delay_2S_day = 1;
- }
- }
-
-
- if (flag.start_delay_30M_directcharge == 1)//延时30分钟
- {
- if(++time_delay_30M_directcharge >= TIME_DELAY_30M)
- {
- flag.over_delay_30M_directcharge = 1;
- }
- }
-
- //----------------充电MOS控制----------------------------------------------------
- //MOS控制是一直进行的。分负载和充电
- //充电,每个周期30ms,33HZ //2S插入 5ms的低电平,和5ms 高 电平
- if (flag.charge_enable == ENABLE)
- {
- ad_times = 0;
- time_2000MS++;
- time_30MS++;
- if ((time_2000MS >= 4000) && (time_30MS >= PWM_H_NUM))
- {
- if (++time_pulse > 10)
- {
- time_2000MS = 0;
- time_pulse = 0;
- }
- else
- {
- if (time_pulse == 9)
- {
- ad_ch.bat_mosoff_buf = 0;
- ad_ch.pv_mosoff_buf = 0;
- for (i = 0; i<2;i++)
- {
- ad_ch.bat_mosoff_buf += ad_collect(AD_BAT) ;//
- ad_ch.pv_mosoff_buf += ad_collect(AD_PV);
- }
- ad_ch.bat_mosoff = ad_ch.bat_mosoff_buf >> 1;
- ad_ch.pv_mosoff = ad_ch.pv_mosoff_buf >> 1;
- }
- if (time_pulse <= 10)
- {
- PV_PWM_L;
- BAT_PWM_L;
- }
- }
- }
- else
- {
- ad_ch.bat_mosoff_buf = 0;
- ad_ch.pv_mosoff_buf = 0;
- temp_ad = 0;
- for (i = 0;i<2;i++)
- {
- temp_ad += ad_collect(AD_BAT) ;
- }
- ad_ch.bat_moson_average_buf += (temp_ad >> 1);
- count++;
- if (time_30MS >= PWM_H_NUM)
- {
- time_30MS = 0;
- ad_ch.bat_moson_average = ad_ch.bat_moson_average_buf / count ;
- if ((ad_ch.bat_moson_average_buf % count) != 0)
- {
- ad_ch.bat_moson_average += 1;
- }
- ad_ch.bat_moson_average_buf = 0;
- count = 0;
- pwm_h_num = pwm_h_num_buf;
- flag.calculate_pwm_enable = 1;
-
- if (pwm_h_num == 0)
- {
- PV_PWM_L;
- BAT_PWM_L;
- }
- else
- {
- PV_PWM_H;
- BAT_PWM_H;
- }
- }
- else
- {
- if (time_30MS >= pwm_h_num)
- {
- PV_PWM_L;
- BAT_PWM_L;
- }
- else
- {
- PV_PWM_H;
- BAT_PWM_H;
- }
- }
- }
- }
- else
- {
- PV_PWM_L;
- BAT_PWM_L;
- time_2000MS = 0;
- time_30MS = 0;
- time_pulse = 0;
- ad_ch.bat_moson_average_buf = 0;
- ad_ch.bat_mosoff_buf += ad_collect(AD_BAT) ;//
- ad_ch.pv_mosoff_buf += ad_collect(AD_PV);
- if (++ad_times >= 16)
- {
- ad_ch.bat_mosoff = ad_ch.bat_mosoff_buf / 16;
- if (ad_ch.bat_mosoff_buf % 16 )
- {
- ad_ch.bat_mosoff += 1;
- }
- ad_ch.pv_mosoff = ad_ch.pv_mosoff_buf /16;
- if (ad_ch.pv_mosoff_buf % 16 )
- {
- ad_ch.pv_mosoff += 1;
- }
- ad_ch.bat_mosoff_buf = 0;
- ad_ch.pv_mosoff_buf = 0;
- ad_times = 0;
- }
- }
- //------------------------------------------------------------------
- //------------------------------------------------------------------
-
- //----------------------------LED灯闪烁管理---------------------------------
- //PB6
- //pv指示灯:正常充电 常亮
- // 超压 快速闪烁 12V系统大于17V 24V系统大于34V
- // 白天但未充电 慢闪
- //--------------------pv_led----------------------------
- if (flag.alarm_over_voltage_bat == 1)//电池超压,快闪,超压
- {
- if (++led_pv_time > TIME_DELAY_100MS)
- {
- led_pv_time = 0;
- PB_ODR ^= 0X40; //PB6
- }
- }
- else if (flag.pv_close_load == ENABLE)// 2014-9-3 增加
- {
- LED_PV_H;
- }
- else
- {
- LED_PV_L; //晚上长灭
- }
- //-------------------bat_led----------------------------
- //GRENN LED---PF4
- //RED LED---PB7
- //电压正常---------绿色灯常亮
- //欠压 ---------绿色灯慢闪
- //过放 ---------红色灯亮
-
- if (flag.alarm_lower_voltage == 1 && flag.return_lower_voltage == 1) //发生了过放并且当前的低压低于过放返回电压
- {
- //红灯亮,绿灯灭
- LED_BAT_G_L;
- LED_BAT_R_H;
-
- }
- else if (flag.alarm_low_voltage == 1) //欠压,
- {
- LED_BAT_R_L;
- if (++led_bat_time > TIME_DELAY_1S)
- {
- led_bat_time = 0;
- PF_ODR ^= 0X10;
- }
-
- }
- else //电压正常
- {
- LED_BAT_G_H;
- LED_BAT_R_L;
-
- }
- //-----------------------------FLOAT CHARGE----------------
- //浮充 正在充电 该灯闪烁,如果不充电 则不亮
- if ( (flag.charge_enable == 1) ) //充电中 进入浮充状态90分钟算充满 ,绿色闪烁&& (flag.charge_mode == 3)
- {
- if (++led_float_time > TIME_DELAY_1S)
- {
- led_float_time = 0;
- PB_ODR ^= 0X80;
- }
-
- }
- else
- {
- LED_FLOAT_L;
- }
-
- }
复制代码
所有资料51hei提供下载(这个电路板可在某宝搜索获得,广告一下):
太阳能充电模块资料.7z
(3.68 MB, 下载次数: 194)
|