资讯详情

[转载]STM8S单片机入门3(AD转换及锂电池管理)

锂电池因其容量大、充电性能好而被广泛引用,特别是在需要电池供电的小型电子设备中。然而,锂电池的充电和使用条件相对严格。例如,充电必须是恒流恒压,电压不得低于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接入电路。

a4c26d1e5885305701be709a3d33442f.png

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转换并获得结果

标签: 电容etr

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台