You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ATMEGA328P采集Lifepo4电池组时ADC转电压低压段精度偏低问题

ATMEGA328P ADC采样电压偏差问题修复方案

偏差来源分析

  • 转换公式计算顺序错误:整数运算过程中先做除法导致截断误差被放大,低压下截断误差占比远高于高压,正好匹配你给出的「电压越低偏差越大、满量程附近几乎无偏差」的测试结果。
  • 分压系数用标称值计算,未考虑电阻实际阻值公差、TL431实际输出电压的微小偏差,引入固定系统误差。
  • 未校准ADC本身的偏移误差,该误差在低压区间的影响更明显。

修复方案

第一步:修正转换公式计算顺序

所有乘法运算先执行,最后再做除法,最大程度降低整数截断误差,转换公式的理论推导如下:
输入电压 = (ADC采样值 / ADC满量程) * 参考电压 * 分压比倒数
你使用10位ADC(满量程值为1023而非1024,用1024会引入固定偏差)、参考电压5.005V、分压比倒数为(510+120)/120=5.25,保留两位小数(单位为0.01V)的转换公式用整数运算实现如下:

// 理论系数,可后续通过校准调整
#define VOLT_COEFF (uint32_t)(5.005 * 5.25 * 100) // 计算得2627

pinValue_Bank1[cellIndex] = analogRead(MPLEX_COM.Pin);
// 加511是为了实现四舍五入,避免截断误差
pinVoltage_Bank1[cellIndex] = ((uint32_t)pinValue_Bank1[cellIndex] * VOLT_COEFF + 511) / 1023;

第二步:两点校准消除系统误差

理论计算的系数永远存在偏差,用两点校准法可以覆盖电阻公差、参考电压偏差、ADC偏移所有系统误差:

  1. 输入端接一个3~4V的已知低压,用万用表测得实际电压V1(单位0.01V),读取当前ADC采样值ADC1
  2. 输入端接一个23~25V的接近满量程电压,用万用表测得实际电压V2(单位0.01V),读取当前ADC采样值ADC2
  3. 计算校准参数:
k = (V2 - V1) * 1000 / (ADC2 - ADC1)  // 千倍系数,保留3位小数精度
b = V1 - (k * ADC1) / 1000
  1. 替换转换代码为校准后的版本:
// 请替换为自己实测得到的k、b值
#define CAL_K 2572
#define CAL_B 8

pinValue_Bank1[cellIndex] = analogRead(MPLEX_COM.Pin);
pinVoltage_Bank1[cellIndex] = ((uint32_t)pinValue_Bank1[cellIndex] * CAL_K + 5) / 10 + CAL_B;

其他优化建议

  • 单次ADC采样波动大,可连续采样8~16次,去掉最高最低值后取平均,降低随机噪声影响
  • 分压电阻选择精度1%、温漂≤50ppm/℃的金属膜电阻,避免温度变化带来的漂移
  • TL431输出端加100nF陶瓷电容滤波,减小电源纹波对参考电压的影响

内容的提问来源于stack exchange,提问作者Jay Dee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 08:45:04