基于51单片机的智能充电器系统.docx
- 文档编号:14446947
- 上传时间:2023-04-23
- 格式:DOCX
- 页数:17
- 大小:119.01KB
基于51单片机的智能充电器系统.docx
《基于51单片机的智能充电器系统.docx》由会员分享,可在线阅读,更多相关《基于51单片机的智能充电器系统.docx(17页珍藏版)》请在冰豆网上搜索。
基于51单片机的智能充电器系统
基于51单片机的智能充电器系统
一、功能简介:
通过定时器定时从A/D上读取数据,根据不同的电压选择不同的控制充电方案,使用PWM控制输出脉宽来控制电流。
二、器件以及接口
本文中使用了8051和ADC0809芯片。
下面对所使用的器件以及器件和单片机的接口作以下说明。
1、器件和原理
本文中主要使用的器件是可以进行A/D转换的8位ADC0809芯片。
ADC0809是一种逐次逼近式8路模拟输入、8位数字量输出的A/D转换器。
其引脚如图1所示。
图1ADC0809外观图
由引脚图可知,ADC0809共有28引脚,采用双列直插式封装。
其主要引脚功能如下。
(1)、IN0~IN7是8路模拟信号输入端。
(2)、2^(-1)~2^(-8)是8位数字量输出端。
(3)、ADDA、ADDB、ADDC与ALE控制8路模拟通道的切换,ADDA、ADDB、ADDC分别与3根地址线或数据线相连,三者编码对应8个通道地址口。
ADDC、ADDB、ADDA=000~111分别对应IN0~IN7通道地址。
(4)、OUTPUTENABLE、START、CLK为控制信号端,OUTPUTENABLE为输出允许端、START为启动信号输入端、CLK为时钟信号输入端。
(5)、VREF(-)和VREF(+)为参考电压输入端。
2、器件的接口
在讨论8051与ADC0809的接口设计之前,先来讨论单片机如何控制ADC的问题。
用单片机控制ADC时,多数采用查询和中断控制两种方法。
查询法是在单片机把启动命令送到ADC之后,执行别的程序,同时对ADC的状态进行查询,以检查ADC变换是否已经结束,如查询到变换已结束,则读入转换完毕的数据。
中断控制法是在启动信号达到ADC之后,单片机执行别的程序。
当ADC变换结束并向单片机发出中断请求信号时,单片机响应此中断请求,进入中断服务程序。
读入转换数据,并进行必要的数据处理,然后返回到原程序。
这种方法单片机无需进行转换时间的管理。
CPU效率高,所以特别适合于变换时间较长的ADC。
如果对转换速度要求高,采用上述两种ADC控制方式往往不能满足要求,可采用DMA(直接存储器存取)的方法,这时可在ADC与单片机之间插入一个DMA接口(例如,btel公司的8237DM控制器)。
传输一开始,AD转换的数据就可以从输出寄存器经过DMA中的数据寄存器直接传输到主存储器,因而不必受程序的限制。
在本文中,采用中断方式。
从ADC0809与8051的中断方式接口电路如硬件电路图2和图3所示,ADC0809和8051的INT0管脚连接,当转换结束的时候,EOC向8051发送一个脉冲信号,提出中断申请,单片机响应中断请求,由外部中断l的中断服务程序读A/D结果,并启动8051的下一个转换,外部中断1采用跳沿触发方式。
图2智能充电器原理电路图
图3智能充电器原理电路图
三、硬件电路图
本文中,单片机电路主要包括8051和ADC0809两块芯片,DM74163N用做分频器,74F138SJ用来产生和选择地址。
具体的连接原理电路图如图2和图3所示。
其中,8051的晶振频率为11.0592MHz。
电路有2个输入输出端口,AnalogVoltageInput是作为电池组电压的输入,PWMcontraltor是做为电池组控制脉宽的输出。
四、软件程序设计
本文为智能充电器,传统充电器采用电流负反馈来进行控制,本程序使用8051单片机作为控制器进行控制。
对于电池中不同的电量,如果采取同样的方案,不会获得满意的充电效果,一般根据电池两端不同的电压值采取不同的方案进行充电。
本文中,将采集电池组的电压值,通过ADC转到单片机,在单片机端接收到信号后,根据不同的电压情况采取不同的方案。
当电压非常小的时候,采取方案1来充电,方案l采取小电流充电;当电压比较小但是不是极小的时候,采取方案2来充电,方案2采取较大电流充电;当电压达到正常电压的时候,采取方案3来充电,方案3采取恒流充电;对于电压超出正常电压,采取方案4,即不充电的方案。
本文中,采用定时查询电压的机制,定时器每500ms给出标志位,查询A/D上的电压值,根据不同的电压值选择不同的方案。
对于电流的控制,采用PWM控制脉宽的方法来控制电流,应用不同的占空比,占空比越高,电流越大。
下面将首先对程序的主要模块进行介绍,然后给出整个程序。
(1)、初始化
在初始化程序中,需要进行与定时器相关的寄存器的初始化以及各个标志位和计数位的清零,如果采用中断方式,还包括与中断相关的寄存器。
本文中,电路中采用的晶振频率fosc=11.0592MHz,需要每500ms查询l次,将定时器设置成16位计数器,根据计算,可以得出定时器T0的初值为7936(1F00H),并且中断中使用计数器,计满8就达到了500ms。
将方案选择位置1,以便主程序查询。
初始化程序清单如下:
;程序开始,初始化各个寄存器以及标志位
START:
MOVSP,#050H;设置堆栈
MOVR0,#030H;设置A/D存储单元初始地址
MOVIE,#0FFH;打开所有中断
MOVDPTR,#78FFH;采集通道首地址,只使用一路A/D就可以
MOVR0,#40H
MOV@R0,#00H;清除方案选择位
MOVR0,#40H
MOV@R0,#00H;清除方案选择触发位
MOVR1,#042H
MOV@R0,#00H;清除定时器计数器
LCALLTIMER1_INIT
TIMER1_INIT:
ANLTMOD,#0FH;设置定时器T1为方式2
ORLTMOD,#10H
MOVTMOD,#21H;定时器T0工作在方式1
MOVPCON,#080H
CLRTR1;禁止定时器T1
SETBEA
SETBET1
SETBET0
SETBPT0;定时器T0中断优于串口中断
CLRTF1
MOVTL0,#00H
MOVTH0,#01FH;定时器T0中断发生时间为62.5ms
SETBTR0;使能定时器T0
CLRTF0
RET;
(2)、定时器中断
定时器中断是用来计时的,在中断中使用软件计数来达到想要的时间。
当时间到达0FFFFH后,再跳到O000H,TFX位就会申请中断。
使用定时器T0,那么TF0位会申请中断,进入中断服务程序,进行中断处理,设置相应的触发标志位。
应当注意的是,在采用中断方式处理时,对于中断中使用到的寄存器、变量(作为全局变量使用的除外)应当进行压栈处理,并且更换寄存器的区域。
;进入定时器中断,每500ms设置1次标志位
TIMER0_INIT:
PUSHACC;累加器入栈
PUSHPSW;程序状态字入栈
MOVPSW,#18H;切换寄存器区域
CLRTF0;清除定时器中断TF0
CLRTR0;禁止定时器T0
MOVTL0,#00H
MOVTH0,#01FH;定时器T0中断发生时间为6
CLRTF0;清除溢出中断位
MOVR1,#042H
INC@R1;增加计数器的值,到8为止,这样达到500ms
CJNE@R1,#08H,TIMER0_READY
MOV@R1,#00H;清除计数器的值
MOVR1,#041H;设置标志位,每500ms重新选择方案
MOV@R1,#01H
TIMER0_READY:
SETBTR0;使能定时器T0
POPPSW;程序状态字出栈
POPACC;累加器出栈
RETI
(3)、A/D转换器的使用
当ADC转换结束时,会向单片机发出中断请求信号,触发单片机的外部中断,这时单片机响应此中断请求,进入中断服务程序,读取转换数据,ADC读入的首地址要依靠电路原理图来确定。
程序清单如下:
EXTERN_INIT:
PUSHACC;累加器压栈
PUSHPSW;程序状态字压栈
MOVPSW,#010H;切换寄存器区域
MOVDPTR,#78FFH;A/D转换器首地址
MOVXA,@DPTR;读入A/D的值
MOVR1,#030H;存储A/D转换器的数据的地址
MOV@R1,A;将A/D的值读入该地址
POPPSW;程序状态字出栈
POPACC;累加器出栈
RETI
(4)、PWM脉冲宽度的控制
在本文中,需要控制PWM脉冲的占空比来控制充电的电流,因此采用直接设置对应管脚高低来产生脉冲,对于不同的要求,可以使用空跑来设置不同占空比。
本文选用方案1.程序清单如下:
PROCESS_01:
MOVR1,#040H
MOV@R1,#01H;选择方案1
PROCESS_01_NEXT:
SETBP2.0;将和PMW连接的管脚置高
MOVR1,#0F0H
MOVR0,#00H
PROCESS_01_01:
DJNZR1,PROCESS_01_01
DJNZR0,PROCESS_01_01;空跑16×256×2个周期
CLRP2.0;将和PMW链接的管脚置低
MOVR1,#070H
MOVR0,#00H
PROCESS_01_02:
DJNZR1,PROCESS_01_02
DJNZR0,PROCESS_01_02;空跑16×256×2×9个周期
MOVR1,#041H;当方案改变标志位到来的时候,清除
;标志并且重新进行判断
CJNE@R1,#00H,CLEAR_FLAG
SJMPPROCESS_01_NEXT
注意:
当输出脉冲的时候,应一直在查询方案改变标志位,当标志位到来的时候跳出循环,重新选择新的万菜。
(5)、方案的选择控制
本实例中,在主程序中需要对不同的方案进行选择,需要根据输入信号的不同范围进行跳转,对于8051,通常与需要比较的数进行相减,然后读取进位标志位,根据标志位来判断两个数的大小。
程序清单如下:
;进入循环,查询标志位,采取不同的方案
LOOP:
MOVR0,#30H;30H是AD转换的地址,将数据和几个值
;进行比较,确定方案
MOVA,@R0
SUBBA,#30H;当电压很小的时候,采用第一种方案,
;向引脚PWM发送占空比为10%的信号
JCPROCESS_01
MOVA,@R0
SUBBA,#90H
JCPROCESS_02;当电压较小的时候,采用第二种方
;案,向引脚PWM发送占空比为20%的信号
MOVA,@R0
SUBBA,#90H
JZPROCESS_03;当电压正好的时候,采用第三种方
;案,向引脚PWM发送占空比为50%的信号
MOVA,#04H;当电压超出的时候,采用第四种方
;案,向引脚PWM发送占空比为0%的信号
LJMPPROCESS_04
(6)、程序全貌
本文中,A/D采用外部中断触发的方式,当数据到来的时候将数据读入,根据不同的电压值选择不同方案,并且用定时器每500ms查询l次,改变原来的方案。
程序清单如下:
;智能充电器
;功能:
通过定时器定时从A/D上读取数据,根据不同的电压选
;择不同的控制充电方案,使用PWM控制输出脉宽来控制电流
ORG0000H
LJMPSTART
ORG0003H
LJMPEXTERN_INT;外中断入口
ORG000BH
LJMPTIMER0_INT;定时器中断入口
;程序开始,初始化各个寄存器以及标志位
START:
MOVSP,#050H;设置堆栈
MOVR0,#030H;设置A/D存储单元初始地址
MOVIE,#0FFH;打开所有中断
MOVDPTR,#78FFH;采集通道首地址,只使用一路A/D就可以
MOVR0,#40H
MOV@R0,#00H;清除方案选择位
MOVR0,#40H
MOV@R0,#00H;清除方案选择触发位
MOVR1,#042H
MOV@R0,#00H;清楚定时器计数器
LCALLTIMER1_INIT
;进入循环,查询标志位,采取不同的方案
LOOP:
MOVR0,#30H;30H是A/D转换的地址,
;将数据和几个值进行比较,确定方案
MOVA,@R0
SUBBA,#30H;当电压很小的时候,采用第一种方案,
;向引脚PWM发送占空比为10%的信号
JCPROCESS_01
MOVA,@R0
SUBBA,#90H
JCPROCESS_02;;当电压较小的时候,采用第二种方案,
;向引脚PWM发送占空比为20%的信号
MOVA,@R0
SUBBA,#90H
JZPROCESS_03;;当电压正好的时候,采用第三种方案,
;向引脚PWM发送占空比为50%的信号
MOVA,#04H;;当电压超出的时候,采用第四种方案,
;向引脚PWM发送占空比为0%的信号
LJMPPROCESS_04
CLEAR_FLAG:
MOVR0,#40H;清除方案选择位
MOV@R0,#00H
MOVR0,#41H;清除触发位
MOV@R0,#00H
LJMPLOOP
PROCESS_01:
MOVR1,#40H
MOV@R1,#01H;选择方案1
PROCESS_01_NEXT:
SETBP2.0;将和PWM连接的管脚置高
MOVR1,#0F0H
MOVR0,#00H
PROCESS_01_01:
DJNZR1,PROCESS_01_01
DJNZR0,PROCESS_01_01;空跑16×256×2个周期
CLRP2.0;将和PWM连接的管脚置低
MOVR1,#070H
MOVR0,#00H
PROCESS_01_02:
DJNZR1,PROCESS_01_02
DJNZR0,PROCESS_01_02;空跑16×256×2×9个周期
MOVR1,#041H;当方案改变标志位到来的时候,
;清除标志并且重新进行判断
CJNE@R1,#00H,CLEAR_FLAG
SJMPPROCESS_01_NEXT
PROCESS_02:
MOVR1,#040H
MOV@R1,#02H;选择方案2
PROCESS_02_NEXT:
SETBP2.0;将和PWM连接的管脚置高
MOVR1,#0E0H
MOVR0,#00H
PROCESS_02_01:
DJNZR1,PROCESS_02_01
DJNZR0,PROCESS_02_01;空跑16×256×2个周期
CLRP2.0;将和PWM连接的管脚置低
MOVR1,#080H
MOVR0,#00H
PROCESS_02_02:
DJNZR1,PROCESS_02_02
DJNZR0,PROCESS_02_02;空跑16×256×2×8个周期
MOVR1,#041H;当方案改变标志位到来的时候,
;清除标志并且重新进行判断
CJNE@R1,#00H,CLEAR_FLAG
SJMPPROCESS_02_NEXT
PROCESS_03:
MOVR1,#040H
MOV@R1,#30H;选择方案3
PROCESS_03_NEXT:
SETBP2.0;将和PWM连接的管脚置高
MOVR1,#0B0H
MOVR0,#00H
PROCESS_03_01:
DJNZR1,PROCESS_03_01
DJNZR0,PROCESS_03_01;空跑16×256×2×2个周期
CLRP2.0;将和PWM连接的管脚置低
MOVR1,#0B0H
MOVR0,#00H
PROCESS_03_02:
DJNZR1,PROCESS_03_02
DJNZR0,PROCESS_03_02;空跑16×256×2×7个周期
MOVR1,#041H;当方案改变标志位到来的时候,
;清除标志并且重新进行判断
CJNE@R1,#00H,CLEAR_FLAG
SJMPPROCESS_03_NEXT
PROCESS_04:
CLRP2.0
MOVR1,#040H
MOV@R1,#04H;选择方案4
MOVR1,#041H
CJNE@R1,#00H,CLEAR_FLAG
SJMPPROCESS_04
TIMER1_INIT:
ANLTMOD,#0FH;设置定时器T1为方式2
ORLTMOD,#10H
MOVTMOD,#21H;定时器T0工作在方式1
MOVPCON,#080H
CLRTR1;禁止定时器T1
SETBEA
SETBET1
SETBET0
SETBPT0;定时器T0中断优先于串口中断
CLRTF1
MOVTL0,#00H
MOVTH0,#01FH;定时器T0中断发生时间为62.5ms
SETBTR0;使能定时器T0
CLRTF0
RET;
;进入定时器中断,每500ms设置1次标志位
TIMER0_INT:
PUSHACC;累加器入栈
PUSHPSW;程序状态字入栈
MOVPSW,#18H;切换寄存器区域
CLRTF0;清除定时器中断TF0
CLRTR0;禁止定时器T0
MOVTL0,#00H
MOVTH0,#01FH;定时器T0中断发生时间为6
CLRTF0;清除溢出中断位
MOVR1,#042H
INC@R1;增加计数器的值,直到8为止,这样达到500ms
CJNE@R1,#08H,TIMER0_READY
MOV@R1,#00H;清除计数器的值
MOVR1,#041H;设置标志位,每500ms重新选择方案
MOV@R1,#01H
TIMER0_READY:
SETBTR0;使能定时器T0
POPPSW;程序状态字出栈
POPACC;累加器出栈
RETI
;进入外部中断,每进入一次读取ADC的值
EXTERN_INT:
PUSHACC;累加器压栈
PUSHPSW;程序状态字压栈
MOVPSW,#010H;切换寄存器区域
MOVDPTR,#78FFH;A/D转换器首地址
MOVXA,@DPTR;读入A/D的值
MOVR1,#030H;存储A/D转换器的数据的地址
MOV@R1,A;将A/D的值读入该地址
POPPSW;程序状态字出栈
POPACC;累加器出栈
RETI
END
五、技巧总结
1、程序中,如果有多个中断,可通过设置PS位来调整串口的优先级。
注意在8051中中断的优先级只有两级。
2、A/D转换器的首地址要根据硬件设计来读取,数据的读取采用外部中断触发的方式速度比较快。
3、输出脉冲可以通过管脚的置高置低来直接进行控制,若波形有占空比的需要,可以通过空跑的时间来控制占空比。
4、在定时器中断完成后,需要对TFX位进行软件清0。
5、在比较两个数的大小来控制程序走向的时候,通常采用相减再判断进位标志的办法来控制程序。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 智能 充电器 系统