单片机实战智能家居 (单片机物联网实战入门)

软件及相关的硬件分析上一篇分析了太阳能电池板电压检测硬件电路及软件,接下来我们一起来分析蓄电池电压及电流检测电路构成及软件。同样我把初始化及主程序在以后仿真调试时分析,现在开始各模块的子程序设计分析。

第二:蓄电池电压及充电电流的检测

从原理图可以看出,蓄电池电压是由电阻R7、R8分压后供给MCU的,电路结构及其电阻值与太阳能电池板电压检测电路完全相同,故而电压计算公式也是一样,这里不再详述;

软件说明:

1 操作概要

使用 A/D 转换器的软件触发、单次转换模式,将输入 ANI1(P21) 的模拟电压进行 A/D 转换。在判断ADIF=1模式下等待 A/D 转换结束,A/D 转换结束以后,将 A/D 转换结果右移 6 位,保存在内部 RAM 中。

(1) 初始化 A/D 转换器

<设定条件>

• 模拟输入使用 P21/ANI1 引脚。

• A/D 转换的动作模式选择为单次转换模式。

• 使用软件触发开始 A/D 转换。

• 使用ADIF=1转换结束。

(2) 将 ADM0 寄存器的 ADCS 位(开始转换动作)置为"1",开始 A/D 转换。然后判断ADIF=1转换结束。

(3) 当 ANI1 引脚的输入电压 A/D 转换完成以后(ADIF=1),A/D 转换器将结果传送给 ADCR 寄存器,并且ADIF=0。

(4)以从 ADCR 寄存器中读取 A/D 转换结果,右移6 位后保存在内部 RAM 中。

(5)转换3次,取中间值

蓄电池电压检测子程序:(使用P21/ANI1,检测蓄电池电压值)

BATVOL_CNT:

MOVADS,#1 ;ADS=1,指定ANI1作为当前转换

NOP

CALL!ADCVSO_CON ;此程序是公共的,参见上篇

MOV!MDUC,#0 ;MDUC=00H,指定芯片做乘法运算

MOVW!MDAH,AX ;

MOVW!MDAL,#60 ;

NOP ;等待

NOP

NOP

MOVWAX,!MDBL ;读取结果

MOV!MDUC,#0X80 ;MDUC=80H,指定芯片做除法运算

MOVWMDAH,#0

MOVWMDAL,AX

MOVWMDBH,#0

MOVWMDBL,#2048 ;

SET1!DIVST

DATV_LOP:

NOP

MOVA,!MDUC

BT A.0,$DATV_LOP ; 除运算结束?

MOVWAX,!MDAL

XCHA,X

MOV!BATDCRGH,A ; 保存结果(整数)

MOVWAX,!MDCL

XCHA,X

MOV!BATDCRGL,A ; 保存结果(小数)

RET

下面分析充电电流检测电路的结构。

充电电流由采样电阻R1取得,R1=0.03Ω,充电电流为2A时,也只能采样到0.06V的电压,这显然是很小的,因此用了由运放芯片U2A(LM358N)构成的放大电路,其增益=R24/R2+1=100/2.05+1≈50,因MCUAD转换结果是数字量,那么对应的充电电流是:

Ibat=Ubat/R2= Ubat/0.03-------------------(1)

Ubat=5Dbat/1024*50=Dbat/10240-------------(2)

Ibat=Dbat/307----------------------------(3)

软件说明:

1 操作概要

使用 A/D 转换器的软件触发、单次转换模式,将输入 ANI2(P22) 的模拟电压进行 A/D 转换。在判断ADIF=1模式下等待 A/D 转换结束,A/D 转换结束以后,将 A/D 转换结果右移 6 位,保存在内部 RAM 中。

(1) 初始化 A/D 转换器

<设定条件>

• 模拟输入使用 P22/ANI2 引脚。

• A/D 转换的动作模式选择为单次转换模式。

• 使用软件触发开始 A/D 转换。

• 使用ADIF=1转换结束。

(2) 将 ADM0 寄存器的 ADCS 位(开始转换动作)置为"1",开始 A/D 转换。然后判断ADIF=1转换结束。

(3) 当 ANI0 引脚的输入电压 A/D 转换完成以后(ADIF=1),A/D 转换器将结果传送给 ADCR 寄存器,并且ADIF=0。

(4)以从 ADCR 寄存器中读取 A/D 转换结果,右移6 位后保存在内部 RAM 中。

(5)转换3次,取中间值

蓄电池电流检测子程序:(使用P22/ANI2,检测蓄电池电流值)

BATELE_TRE:

MOVADS,#2 ;ADS=2,指定ANI2作为当前转换

NOP

CALL!ADCVSO_CON ;此程序是公共的,参见上篇

MOV!MDUC,#0X80 ;MDUC=80H,指定芯片做除法运算

MOVWMDAH,#0

MOVWMDAL,AX

MOVWMDBH,#0

MOVWMDBL,#307 ;

SET1!DIVST

DATE_LOP:

NOP

MOVA,!MDUC

BT A.0,$DATE_LOP ; 除运算结束

MOVWAX,!MDAL

XCHA,X

MOV!BATIVRGH,A ; 保存结果(整数)

MOVWAX,!MDCL

XCHA,X

MOV!BATIVRGL,A ; 保存结果(小数)

RET