目录
1.背景
在一款STM8L低功耗产品中使用的是1S1P(一串一并,即单节)锂电池同时容量1200mAh,需要测量电池电压(3.7V~4.2V),测量范围只有500mV的识别区间,不定时需要驱动3V 100mA的重载(相对锂电池容量来说),保证产品在批量中的电池电压一致性。
2.技术难点
控制最终误差的来源:
A.稳定采样参考电压3.3V:
采用REF3033,其低温漂55ppm/℃,低Iq为42uA,0.2%初始精度,即最大6mV初始误差。

解释这个误差为什么重要,拿我们平常最常用的LDO(AMS1117-3.3V),其中通过截取TWGMC(台湾迪嘉) 规格书参数来举例子:

下面展示ADC读取函数的代码:
float ADC_Data_Read()
{
u16 temp_adc_value;
float adc_value;
ADC_SoftwareStartConv(ADC1); //启动ADC
while(ADC_GetFlagStatus(ADC1 , ADC_FLAG_EOC) == 0); //等待转换结束
ADC_ClearFlag(ADC1 , ADC_FLAG_EOC); //清除中断标志
// *AD_Value = ADC_GetConversionValue(ADC1); //读取ADC1,通道1的转换结果
temp_adc_value = ADC_GetConversionValue(ADC1);
adc_value=((float)temp_adc_value * 3.3)/4096.0;
return adc_value;
}
假设我们读取2.000V电压,其中一块主板的LDO恰巧碰到最低输出只有3.234V参考电压,而程序中参考电压保持3.3V,那么该主板12bit ADC读到的参数为:
LSB
因此程序上按3.3V转换为电压参数为:
这里凭空就多出来40mV的ADC读取误差,假设这2V是电池电压经按一半比例分压得到的,实际的电池的读取差误将达到80mV。同理采用REF3033最大理论读取误差7.2mV。
B.电阻分压精度:
锂电池采用2个300K 1%分压得到直接连接单片机的ADC管脚,同时预留使用运放做同相跟随。

上述方案的影响有如下几种:
1).电阻的大小与精度:电阻选小了,锂电池待机功耗就高了,电阻选大了,远大于ADC管脚的输入阻抗了,分压就偏小导致测量就不准了,理论上就需要接运放做阻抗匹配了;另外精度越高越好!
假设使用300K 1%的电阻,运气不好均选中了最大偏差即一个303K上拉电阻与一个297K下拉电阻进行分压,同时假设是4.000V的锂电池进行分压,则实际分压被单片机读为:
因此就以上假设情况下,则会出现40mV的误差。同理使用300K 0.1%的电阻,则理论最大产生4mV的误差。
2).ADC的采样频率:由于这个项目需要ADC的频率不需要太高,就直接选取1MHz的主频,这样ADC引脚的输入阻抗可以允许的高一点,通常情况采样频率越低,允许的输入阻抗就越高。
3).ADC的输入阻抗:参考规格书最大为50K,但是这个参数为设计保证参数,但没有在生产过程中测试,因此就这一点可以挑战测试提高它的输入阻抗看是否测得准一点。
4).运放:目前预留选用的LMV321,输入失调电压典型值有1.7mV,最大值7mV。这款芯片选得不好,应该选择输入失调电压更小达到uV级别。目前断开R15后测试的失调电压有17mV,我怀疑是不是反馈回路没有接匹配电阻造成的。(有兴趣的小朋友可以选择一个小的输入失调电压试试精度的影响)

C.PCB电路的布局布线
影响比较大就是电路的布局布线了,电池电压的采样电路就相当于是典型的低频模拟电路了,在设计模数混合电路时,特别注意参考地的设计了,在PCB设计中地平面作为参考平面,所有信号的返回电流通过地平面传递了,但是铜也是有电阻率的(如长1200mil宽50mil的铜皮直流电阻约为10mΩ),锂电池模拟信号返回路径上如果有其它信号的返回电流共用(共阻抗干扰),假设这个返回电流有0.1A,则在路径上叠加1mV测量误差。因此需要去规划好一些大电流回流路径,若无法避免也应尽量与模拟信号的回流路径呈十字交叉型,这样模拟信号被干扰降到较低水平。(模数混合电路的布线布局需要大篇章讲解),如果布线布局不合理就合理容易受干扰,想象一下信号路径与其回流路径上在垂直和水平方向上的投影能形成比较大环路,就容易干扰和被干扰。
D.测量设备
不要用3位半数字万用表去测量,那样误差很大,建议使用六位半以上的测量仪器去测试,这样测试出来精度更高,可以直接采样端电池电压。另外不要试图用测试仪器去测试电阻分压后的电压值,这个值会偏低。这是因为表笔也是存在输入阻抗通常在10MΩ,会并联在采样电阻上,导致一种现象表笔测量值偏低,但单片机ADC读取数值接近真实值。
验证一致性的方法为,使用同一块锂电池,分别接上2块主板上,让2块主板大电流驱动设备停止工作开机,观察2块主板ADC读数是否接近。
3.测试数据
| 环温 | 18℃ | ||||
| 测试设备 | 型号ME010标准版(六位半高精度数字直流电流电压表) | ||||
| 硬件设置 | R11、R15使用300K 1%电阻,并未连接运放跟随直接 连接至ADC管脚(备注如果使用300K 0.1%精度电阻效果更佳) | ||||
| 主板编号 | 单片机读取数值 | ADC参考电压 (REF3033) | 锂电池测试电压 | 实际偏差 | 备注 |
| 主板1 | 3.897803V | 3.29786V | 3.89580V | 2mV | 锂电池1测试 |
| 主板2 | 3.897803V | 3.30124V | 2mV | ||
| 主板1 | 3.772119V | 3.29800V | 3.77077V | 1.4mV | 锂电池2测试 |
| 主板2 | 3.773730V | 3.30136V | 3mV | ||
| 主板1 | 4.057324V | 3.29797V | 4.05589V | 1.5mV | 锂电池3测试 |
| 主板2 | 4.058936V | 3.30130V | 3.1mV | ||
4.总结
1)可以看出不同主板之间,测试同一块锂电池测得的电压差异在1.6mV以内,整体误差在4mV以内(目前只测了2块主板的对比,对比数据量太少了)。
2)按理论上使用300K 0.1%电阻将会误差可能进一步降低,目前手上没有这个精度电阻未测,后续如果有将继续测试一下,观察一下趋势。
3)理论上ADC管脚的输入阻抗只用50KΩ,但是将采样频率降低至1MHz之后,依然能得到较为准确直流电压数值,因此规格书中的参数可以根据自己的理解做合理化设计一样也可以得到比较实用电压数据。前提是自己预留好设计进行验证,像ST公司最新的出STM32G系列单片由于设置的主频比较到,使用大电阻分压,误差会呈现的比较大。
4)锂电池输入电压变化也会影响ADC参考电压,但基准电压芯片线性调整率在可控范围内。目前没有测试环境温度变化的影响。
5)12bit ADC 在3.3V参考电压情况下,1LSB=0.8mV。更高精度分辨率就需要16bit、24bitADC进行采样了。
如果挑战批量测量误差控制在100uV以内,又满足低功耗设计则应该怎么做。最好一块主板的精度较为容易,要获取批量稳定性这难度就不止一点。欢迎大佬批评指正,第一篇技术博客写得比较啰嗦,期望能帮助到有此设计需求的工程师。

本文详细描述了在STM8L产品中使用1S1P锂电池进行电压测量时遇到的技术难点,包括参考电压稳定性、电阻分压精度、ADC输入阻抗以及PCB布局对测量的影响。通过测试数据展示了误差控制策略,并讨论了如何在低功耗设计下实现高精度测量。
3万+

被折叠的 条评论
为什么被折叠?



