锂电池因其容量大、充电性能好而被广泛引用,特别是在需要电池供电的小型电子设备中。然而,锂电池的充电和使用条件相对严格。例如,充电必须是恒流恒压,电压不得低于3V因此,锂电池供电系统一般需要特殊的锂电池管理功能,以确保锂电池处于正确的工作状态。
这部分内容可以讲STM8S如何在单片机系统中使用典型的锂电池充电管理芯片?TP为了实现锂电池的充电,以及如何使用单片机内置AD转换功能测量电池电压,实现电池电量监测。
1、电路设计
使用电路图如下TP4056充电管理,TP4056采用恒定电流/恒定电压线性锂电池充电管理IC,电路简单,恒流恒压充电只需外接一个编程电容即可。充电电流取决于编程电阻的电阻值。电阻与电流大致相关:R=1200/I(误差10%)K在编程电阻下,充电电流为580mA。下图中R即编程电阻。
发光二极管D1和限流电阻R组成充电指示电路,正在向锂电池充电,D1发光。
D2稳压管TL431,和R2组成稳定的2.5V参考电压。这个参考电压输入到STM8S单片机的PD2引脚(也是模拟输入3)AIN3),通过单片机ADC可以测量功能AIN3(2.5V固定电压)ADC读数反转电池电压。
通过外部充电电源MircoUSB接口P1接入电路。
2、软件设计
无需软件参与锂电池充电功能,TP4056芯片可以独立完成。然而,开机状态下的锂电池电量监控需要软件的配合。软件的功能是定期收集AIN3的ADC当电池电压低于3时,读数计算电池电压V时,需要自动关机。
STM8S单片机的ADC10位,即最大读数为1023,VCC就是其AD转换参考电压有以下关系:
1023/AIN3读数=VCC电压/2.5V
所以,VCC电压,即电池电压,即电池电压=2.5V*1023/AIN3读数
1)设置ADC工作模式
可以使用STM8S_StdPeriph_Lib库中的ADC1_Init(), ADC1_DeInit(),
ADC1_Cmd()来实现ADC设置工作模式。这三个函数分别设置ADC,重置ADC,启用或停用ADC,这里重点说明一下ADC1_Init(),。
ADC1_Init()界面定义:
void ADC1_Init(ADC1_ConvMode_TypeDef ADC1_ConversionMode,
ADC1_Channel_TypeDef ADC1_Channel, ADC1_PresSel_TypeDef
ADC1_PrescalerSelection, ADC1_ExtTrig_TypeDef ADC1_ExtTrigger,
FunctionalState ADC1_ExtTriggerState, ADC1_Align_TypeDef
ADC1_Align, ADC1_SchmittTrigg_TypeDef ADC1_SchmittTriggerChannel,
FunctionalState ADC1_SchmittTriggerState)
ADC1_Init()参数较多,看每个参数的说明:
ADC1_ConversionMode:
转换模式,指定单次或连续转换,相应值为:ADC1_CONVERSIONMODE_SINGLE/ADC1_CONVERSIONMODE_CONTINUOUS
ADC1_Channel:
指定转换通道,取值为ADC1_CHANNEL_0~ADC1_CHANNEL_12.注意不同单片机型号支持的不同通道,如STM8S103只支持7个通道,取决于单片机的数据手册。
ADC1_PrescalerSelection:可以指定预分频fcpu/2到fcpu/18,对应值为ADC1_PRESSEL_FCPU_D2/~3/~4/~6/~8/~10/~12/~18。
ADC1_ExtTrigger:
指定ADC特殊外部中断(ADC_ETR)或定时器触发信号(TRGO)作为外部触发信号,值分别为:ADC1_EXTTRIG_GPIO/ADC1_EXTTRIG_TIM
ADC1_ExtTriggerState:外触发状态,DISABLE或ENABLE
ADC1_Align:数据对齐,左对齐或右对齐,值:ADC1_ALIGN_LEFT/ADC1_ALIGN_RIGHT
ADC1_SchmittTriggerChannel:指定施密特触发器,ADC1_SCHMITTTRIG_CHANNEL0~12
ADC1_SchmittTriggerState:指定施密特触发器状态,DISABLE或ENABLE
这里要通过AIN3引脚采集2.5V固定电压值,使用以下三个代码设置ADC1:
ADC1_DeInit();
ADC1_Init(ADC1_CONVERSIONMODE_SINGLE,
ADC1_CHANNEL_3, ADC1_PRESSEL_FCPU_D2, ADC1_EXTTRIG_TIM, DISABLE,
ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL3, ENABLE);
ADC1_Cmd(ENABLE);
2)启动ADC并获取读数
ADC1设置后,执行一次AD转换相对简单,先用ADC1_StartConversion()启动转换,然后使用ADC1_GetConversionValue()获取值,ADC1_GetConversionValue()的返回值就是装换结果。
为避免一次收集数据的干扰误差较大,一般需要多收集几次,平均值比收集10次要高。平均采集10次:
u16 u16_adc1_value=0 ;
for(int
i=0;i<10;i )
{
ADC1_StartConversion();
u16_adc1_value = ADC1_GetConversionValue();
}
u16
vref=u16_adc1_value/10;
已经算出了2.5V固定电压值vref,最后用2.5V*1023/vref就能计算出VCC也就是锂电池的电压。但是直接计算误差会很大(因为u16最大值为65535,除法结果精度低),因此改为以下方法来提高结果精度。结果单位是mv:
u16
vcc=(51200/(vref/10))*5;
3)实现低电池电量自动关机
电池的电压已经电池的电压,所以结合上一篇文章《STM8S单片机入门2(关机模式开关按钮),很容易关机,只要打开标志fPowerOn_flag设置为FALSE可以在下一个主循环中关机。
if(vcc<3000)
{fPowerOn_flag=FALSE;
}
3、总结
STM8S单片机的ADC功能非常强大,这里只有一个监测锂电池电压来解释最基本的用法,其他更多的用法仍然取决于数据手册。现在回顾一下所涉及的知识点:
1)ADC设置工作模式
2)启动AD转换并获得结果