STM8S单片机入门3(AD转换及锂电池管理)
扫描二维码
随时随地手机看文章
锂电池以其容量大、充电性能好的优点,已经得到了广泛引用,特别在小型的需电池供电的电子设备上。但是锂电池的充电和使用条件比较严格,比如充电必须以恒流恒压方式,使用时电压不能低于3V等,所以用锂电池供电的系统一般都需要专门的锂电池管理功能,确保锂电池在正确的工作状态下。
这部分内容以讲述在STM8S单片机系统中,如何使用典型的锂电池充电管理芯片TP4056来实现锂电池的充电,以及如何使用单片机内置的AD转换功能测量电池电压,实现电池电量监控。
1、电路设计
电路图如下,使用TP4056做充电管理,TP4056是一款采用恒定电流/恒定电压线性锂电池充电管理IC,电路简单,只需要外接一个编程电容即可实现恒流恒压充电,充电电流取决编程于电阻的阻值,电阻和电流大致有这个关系:R=1200/I(误差10%),如2K编程电阻下,充电电流为580mA。下图中R1即编程电阻。
发光二极管D1和限流电阻R2组成充电指示电路,正在向锂电池充电时,D1发光。
D2稳压管TL431,和R2一起组成稳定的2.5V参考电压。这个参考电压输入到STM8S单片机的PD2引脚上(同时也是模拟输入3AIN3),通过单片机的ADC功能可以测量到AIN3(2.5V固定电压)的ADC读数,从而反推出电池的电压。
外部充电电源通过MircoUSB接口P1接入电路。
2、软件设计
锂电池充电功能不需要软件参与,TP4056芯片可独立完成。但是开机状态下的锂电池电量监控需要软件配合实现。软件要实现的功能是,周期性的采集AIN3的ADC读数,然后计算出电池电压,当电池电压低于3V时,需要自动关机。
STM8S单片机的ADC是10位的,即最大读数是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转换并获取结果