打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
STM8S单片机入门3(AD转换及锂电池管理)

锂电池以其容量大、充电性能好的优点,已经得到了广泛引用,特别在小型的需电池供电的电子设备上。但是锂电池的充电和使用条件比较严格,比如充电必须以恒流恒压方式,使用时电压不能低于3V等

锂电池以其容量大、充电性能好的优点,已经得到了广泛引用,特别在小型的需电池供电的电子设备上。但是锂电池的充电和使用条件比较严格,比如充电必须以恒流恒压方式,使用时电压不能低于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转换并获取结果


来源:互联网

换一批

延伸阅读

[单片机应用] stm8s开发(八) IIC的使用:IIC主机通信!

前面讲过两个常用的串口,UART和SPI,这次这次讲解一下另一个常用的串口:IIC(I2C)通信科普IIC:一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到IIC总线设备上的串行数据SDA都接到总线的SD......

关键字:stm8s IIC 主机通信

[单片机应用] STM8S电源管理-重点活跃停机模式

STM8 电源管理2012-06-08 22:47:55|分类:STM8|字号订阅默认情况下在系统或电源复位后,MCU处于运行模式。在这种模式下,CPU由fCPU提供时钟并执行程序代码,系统时钟分别为各个处于激活状态的外设提供时钟,MCU功......

关键字:STM8S 电源管理 停机模式

[单片机应用] STM8S按地址增量的烧写方法

1 打开STVP2 PROJECT/NEW,乱取个名来建立项目3 PROJECT EDITION,首先在Configuration选好芯片,最重要的就是在SerialNumbering中来设置了勾住Enable Serial Number,......

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
STM32内置参照电压的使用 -- STM32 Releasing Your Creati...
STM32 GPIO模式汇总分析
常见传感器和芯片的介绍
STM32如何通过内部VREF得到实际的VDDA值_单片机学习网
初学电子 ADC模块应用的一些问题
创意DIY:改造9.9元包邮的小电磨,增加堵转保护和点动功能且开源
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服