ADC电量检测与校准
ADC电量检测方案
目录
- ADC电量检测方案
- 1. 需求概述
- 1.1 目的
- 1.2 背景
- 1.3 定义
- 1.4 参考资料
- 2. 问题分析
- 2.1 采样原理
- 2.2 误差影响
- 3. 方案设计
- 3.1 校准原理
- 3.2 校准接口
- 3.3 上电校准方案
- 3.4 满电校准方案
- 3.5 上电或满电校准方案
- 3.6 确保电量呈现步进变化
1. 需求概述
1.1 目的
- 提高ADC采样的准确性,消除板级差异。
1.2 背景
- 实现采集的电压信息准确,覆盖电池容量0~100。
- 在进入充电或退出充电时,消除跳跃大的电量跳变。
- 保证各样品之间的一致性,消除板级间差异。
1.3 定义
- kR:Adc分压网络的电阻系数比
- kV:Adc参考电压与精度的系数比
- k:分压网络电阻系数与adc参考电压的乘积
1.4 参考资料
2. 问题分析
2.1 采样原理
kR = 1 + R21 / R20
已知R21 = 2.2M,R20 = 1.5M,计算理论值 kR = 2.467。
Vbat = kR * Vdet
考虑R21和R20存在1%误差,则:
kRmax = 1 + (1.01*R21) / (0.99*R20) = 1.012kR
kRmin = 1 + (0.99*R21) / (1.01*R20) = 0.988kR
假设adc的基准电压为Vref,精度为Prec,adc采集到的adc数值为AdcValue,则:
kV = Vref /Prec
Vdec = kV * AdcValue
Vbat = kR * kV * AdcValue
仅考虑采样电阻的偏差
VbatMax = 1.012Vbat;
VbatMin = 0.988Vbat;
2.2 误差影响
如下表,为某型号电池电压与电量的对应关系
电压 | 电量 | 电压 | 电量 | 电压 | 电量 | 电压 | 电量 | 电压 | 电量 |
---|---|---|---|---|---|---|---|---|---|
3.001 | 0 | 3.219 | 1 | 3.333 | 2 | 3.416 | 3 | 3.474 | 4 |
3.517 | 5 | 3.547 | 6 | 3.572 | 7 | 3.587 | 8 | 3.599 | 9 |
3.608 | 10 | 3.616 | 11 | 3.622 | 12 | 3.628 | 13 | 3.634 | 14 |
3.643 | 15 | 3.648 | 16 | 3.655 | 17 | 3.660 | 18 | 3.665 | 19 |
3.669 | 20 | 3.674 | 21 | 3.678 | 22 | 3.682 | 23 | 3.686 | 24 |
3.690 | 25 | 3.693 | 26 | 3.695 | 27 | 3.698 | 28 | 3.701 | 29 |
3.704 | 30 | 3.707 | 31 | 3.709 | 32 | 3.712 | 33 | 3.714 | 34 |
3.717 | 35 | 3.719 | 36 | 3.721 | 37 | 3.725 | 38 | 3.728 | 39 |
3.730 | 40 | 3.733 | 41 | 3.736 | 42 | 3.739 | 43 | 3.743 | 44 |
3.746 | 45 | 3.749 | 46 | 3.753 | 47 | 3.757 | 48 | 3.761 | 49 |
3.765 | 50 | 3.770 | 51 | 3.774 | 52 | 3.779 | 53 | 3.783 | 54 |
3.787 | 55 | 3.792 | 56 | 3.797 | 57 | 3.802 | 58 | 3.808 | 59 |
3.813 | 60 | 3.818 | 61 | 3.824 | 62 | 3.830 | 63 | 3.836 | 64 |
3.842 | 65 | 3.848 | 66 | 3.855 | 67 | 3.861 | 68 | 3.868 | 69 |
3.874 | 70 | 3.881 | 71 | 3.889 | 72 | 3.897 | 73 | 3.904 | 74 |
3.912 | 75 | 3.919 | 76 | 3.927 | 77 | 3.934 | 78 | 3.943 | 79 |
3.952 | 80 | 3.960 | 81 | 3.968 | 82 | 3.978 | 83 | 3.988 | 84 |
3.997 | 85 | 4.007 | 86 | 4.017 | 87 | 4.027 | 88 | 4.036 | 89 |
4.045 | 90 | 4.055 | 91 | 4.064 | 92 | 4.074 | 93 | 4.084 | 94 |
4.095 | 95 | 4.105 | 96 | 4.116 | 97 | 4.128 | 98 | 4.141 | 99 |
如下图,为该型号的电池曲线
从图中可看出,当电量在30%附近时变化最缓慢,取实际电池电压为3.7V时
VbatMax = 1.012Vbat = 1.012 * 3.7 = 3.7444V;
VbatMin = 0.988Vbat = 0.988 * 3.7 = 3.6556V;
VbatMax - VbatMin = 3.744 - 3.6556 = 0.0888V = 88.8mV;
因此不理想的状态下,板级偏差可达88.8mv,此时分别对应的百分比是44%和14%,同一块电池在这两类情况下测量的电量相差达到30%。
3. 方案设计
3.1 校准原理
因为板级之间存在差异,需要校准kA * kV的系数乘积,又
Vbat = kR * kV * AdcValue = kR * Vref / Prec * AdcValue
从上述公式中可知,Adc的精度Prec是固定的,kR * Vref是造成差异性的原因,令
k = kR * Vref
则有
Vbat = k * AdcValue / Prec
在此方案中,因此给定已知的Vbat,则根据采样的adc数值可推出系数k。
3.2 校准接口
读取校准系数
/*** @fn Bool ReadAdcCoefficient(DWord *pdwCalibMark, float *pfCoefficient)* @brief Read the calibration mark and calibration coefficient of ADC* @details If the reading fails, the contents of the passed-in parameters will not be modified* @param[in] pdwCalibMark is Memory address of calibration mark* @param[in] pfCoefficient is Memory address of calibration coefficient* @return TRUE if read successfully, FALSE if not* @note None* @attention The valid byte of Flash read by this function is 8 lengths*/
static Bool ReadAdcCoefficient(DWord *pdwCalibMark, float *pfCoefficient)
{Bool bRet = TRUE;UDat4Byte UDat;STFlashPage stFlashPage = {0u};//读取Flash的某一页内容 一共64字节bRet = FlashReadPage(&stFlashPage, FLASH_PAGE_MIN_NUM);//读取成功且长度正确 将读取的校准标记和校准系数进行替换if((bRet == TRUE) && (stFlashPage.wLen == 8u)){*pdwCalibMark = stFlashPage.adwDat[0u];UDat.dwDat = stFlashPage.adwDat[1u];*pfCoefficient = UDat.fDat;}//读取失败 保留之前的采样系数else{bRet = FALSE;}return bRet;
}
写入校准系数
/*** @fn Bool WriteAdcCoefficient(Word wAdcCalibValue, float fCalibBatVol)* @brief The calibration coefficient is calculated and stored by the incoming adc* and the expected voltage value* @details If the calculated coefficient is unreasonable, it will not be stored* @param[in] wAdcCalibValue: Adc value for calibration* @param[in] fCalibBatVol: Voltage for calibration* @return Returns TRUE if writing is successful, otherwise returns FALSE* @note None* @attention The reasonable interval range is adjusted according to the demand*/
static Bool WriteAdcCoefficient(Word wAdcCalibValue, float fCalibBatVol)
{Bool bRet = TRUE;UDat4Byte UDat;STFlashPage stFlashPage = {0u};//通过传入校准的采样值和预期电压值计算校准系数UDat.fDat = fCalibBatVol / wAdcCalibValue * ADC_PRECISION;//系数在合理范围内if((UDat.fDat >= ADC_MIN_COEFFICIENT) && (UDat.fDat <= ADC_MAX_COEFFICIENT)){stFlashPage.adwDat[0u] = ADC_CALIBRATION_MARK;stFlashPage.adwDat[1u] = UDat.dwDat;stFlashPage.wLen = 8u;bRet = FlashWritePage(&stFlashPage, FLASH_PAGE_MIN_NUM);}else{bRet = FALSE;}return bRet;
}
3.3 上电校准方案
上电给定稳定的校准电源,校准方法如下:
上电读取Flash判断是否已校准?
是:通过给定的输入电压进行校准系数k,将系数k存储到Flash,并标记校准完成;
否:读取校准系数k。
//读取校准系数ReadAdcCoefficient(&g_dwAdcCalibMark, &g_fAdcKRVCoefficient);if(g_dwAdcCalibMark != ADC_CALIBRATION_MARK){//没有校准过 进入出厂校准模式if(WriteAdcCoefficient(ADC_GetSmpleValue(ADC_CHANNEL1, 5u), ADC_FACTORY_CALIB_BAT)){ReadAdcCoefficient(&g_dwAdcCalibMark, &g_fAdcKRVCoefficient);}}
优点:
- 校准一次即可。
缺点:
- 依赖给定的校准电压,与生产流程息息相关,给定校准电压的一致性决定了系数的可靠性。
3.4 满电校准方案
重新上电时使用默认校准系数k,不需要校准源,满电时自校准,校准方法如下:
每次采样过程中判断是否在充电状态
- 是
- 存储充电过程中采集的最大adcValue值;
- 如果检测到电压满电,通过已知的满电电压和最大的adcValue值校准系数k;
- 如果新的校准系数k在合理范围内,则存储校准系数k到内部Flash中。
- 否
- 存储充电过程中采集的最大adcValue值。
//从非充满到充满状态时 写入新的采样系数if((bIsChgFull == ENABLE) && (g_bChargFull != ENABLE)){byBatPercent = CHARGED_FULL_BAT;//新的系数保存 判断是否在合理范围里 不合理将使用默认的参数if(TRUE == WriteAdcCoefficient(s_wMaxAdcVal, ADC_FULL_CALIB_BAT)){ReadAdcCoefficient(&g_dwAdcCalibMark, &g_fAdcKRVCoefficient);}s_wMaxAdcVal = 0u;}//充满状态变化if(bIsChgFull != g_bChargFull){g_bChargFull = bIsChgFull;}
优点:
- 自动校准系数,不依赖校准电压和生产流程。
缺点:
- 第一次充满前使用默认系数k,可能是不准的。
3.5 上电或满电校准方案
MCU实现自校准功能,通过上电校准或满电时校准,校准方法如下:
满足上电校准方案逻辑,只允许出厂时校准一次;
满足满电校准方案逻辑,每次满电重新校准。
优点:
- 自动校准系数,不强制依赖校准电压和生产流程。
缺点:
- 如果未进行上电校准,第一次充满前使用默认系数k,可能是不准的。
3.6 确保电量呈现步进变化
- 周期性检测电池容量(30s),根据当前的采集到的电压值,计算电量百分比;
- 考虑到电量可能检测不到100%的情况,当软件检测到充满时,将电量百分比强制变更为100%;
- 当处于充电状态时,此次采集的电量百分比大于当前百分比,百分比自增1;
- 当处于放电状态时,此次采集的电量百分比小于当前百分比,百分比自减1。
//充电且满足电量百分比在向上变化 每次加1个百分比if((bIsCharge == ENABLE) && (byBatPercent > g_byBatteryPercentage)){g_byBatteryPercentage += 1u;}//当没在充电 电量百分比只能每次向下掉1个百分比else if((bIsCharge == DISABLE) && (byBatPercent < g_byBatteryPercentage)){g_byBatteryPercentage -= 1u;}
优点:
- 无复杂的滤波方法,效率高。
- 保证每次变化的电量百分比不超过预期。
- 对插入充电和拔除充电有比较好的效果。
缺点:
- 与实际采集有偏差,带延迟。
2021-08-18 李不清的烦恼,总结篇。
ADC电量检测与校准相关推荐
- 原理篇1、锂电池充/供电与电量检测
目录 1.充电.供电电路 2.电量检测电路 3.电量计算 4.关于IIR滤波器设计 参考资料 资料获取 1.充电.供电电路 键盘上的充电电路原理图 数据手册中的原理图 其中与TP5400 3脚(PRO ...
- 1.3双摇杆遥控器电路部分--基本外设电路(ST-link下载、串口、按键、摇杆、电量检测、LED指示灯、0.96寸OLED、NRF24L01)
目录 一.摘要 二.电路 1.ST-LINK下载接口 2.串口 3.按键 功能按键 唤醒按键 4.摇杆 滑动变阻器摇杆 霍尔摇杆 5.电量检测 6.LED指示灯 7.0.96寸OLED屏 8.NRF2 ...
- stm32Cubemx实用篇(三):DAC电压输出和ADC电压检测以及内部温度传感器测温
stm32Cubemx实用篇(三):DAC电压输出和ADC电压检测以及内部温度传感器测温 本章将介绍使用stm32Cubemx软件配置DAC电压输出和ADC电压检测.最终将两个引脚连接起来通过一个AD ...
- 基于51单片机锂电池电压电量检测(原理图+PCB+程序)
资料编号:198 下面是该资料仿真演示视频: 198-基于51单片机锂电池电压电量检测(原理图+PCB+程序+全套资料) 功能介绍: 采用51系列自带AD的单片机stc12c5a60s2型号单片机( ...
- 可编程线性霍尔传感器CHA611/MLX91209在新能源汽车的电量检测系统中的应用
新能源汽车主要靠电力驱动系统来完成对汽车电机的控制和一些辅助功能的实现,新能源汽车蓄电池组是电力驱动的来源,新能源汽车的电量检测系统则显示了新能源汽车蓄电池组当前的状态,与电力驱动系统的正常运作息息相 ...
- 【开发教程5】开源蓝牙心率防水运动手环-电池电量检测
蓝牙心率防水运动手环 --疯壳·智能穿戴开发系列 电池电量检测 1 ADC 简介 ADC(Analog-to-Digital Converter),模/数转换器或者模数转换器,是指将连续变化的模拟 ...
- 电量检测芯片BQ27510使用心得
最近接触到一款TI的电量检测芯片BQ27510,网上很少有人提及该芯片如何使用,大部分博文都是搬得BQ27510的datasheet,至于真正使用过的很少,该芯片我个人感觉还是非常强大的,能自动学习你 ...
- 电量监测程序 c语言,基于单片机的电量检测系统设计方案.doc
基于单片机的电量检测系统设计方案 1绪论 自第一个微处理器问世以来,以微处理器为核心构成的计算机以各种各样的形式,无孔不入的渗入到人们的生产.生活.科研等各个领域,为人类带来了渗透到各个领域的&quo ...
- 仪器保养 | 安捷伦DSO-X 2002A示波器自检测/自校准
安捷伦DSO-X 2002A示波器自检测.自校准 首先上电开机 1. 按下Utility-服务-Diagnostics-硬件本机自检-前面板自检 2. 按下Utility-服务-Calibration ...
最新文章
- Evaluation of hybrid and non-hybrid methods for de novo assembly of nanopore reads
- 配置FindBugs和常见FindBugs错误
- Linux操作命令(四)
- 总奖金100万!2021SEED江苏大数据开发与应用大赛(华录杯)正式开赛!
- SAP License:财务帐与后勤不一致情况
- 1061 判断题 (15 分)—PAT (Basic Level) Practice (中文)
- 记一次route配置不起作用的问题解决过程
- Linux串口编程详解(转)
- WhatsApp网页版(电脑版)使用教程
- 网页加载Java特别慢_打网页打开速度慢,教你3分钟解决
- 搞笑的chitgpt
- 关于单片机内部的ROM、RAM、Falsh的解释
- 浅析2017年医疗类APP开发前景
- 第三届云计算大会 - 华为李三琦:云计算发展与华为运战略(转载)
- 2020年是意义非凡的一年,大专的我面试阿里P6居然过了,activity事件分发
- Spring | 深入理解面向切面编程(AOP)
- 湖北省宜昌市谷歌高清卫星地图下载
- python发微信-python实现向微信用户发送每日一句
- mysql 删除权限记录_mysql-数据(记录)相关操作(增删改查)及权限管理
- 软件工程直招士官生_如何看待今年首次面向普通高校毕业生直招士官?是毕业生的一个好选择吗?...
热门文章
- ai讲师人工智能讲师计算机视觉讲师叶梓:计算机视觉领域的自监督学习模型——MAE-15
- 自己.NET写的汉堡店收银软件可能有很多不足的地方
- ###openssl 详解#####
- 基于html5的视频点播,基于HTML5的视频播控和客户服务系统
- 连接手表_小米手表连接不上WearOS APP,提示无法连接到手表解决方法
- Android 图形驱动初始化(二十三),移动开发者升职加薪的8项技能
- 解决brew: Warning: Unexpected method ‘arch‘ called on Cask portfolioperformance.
- 微信小程序 java社会治安交通执法助手php
- DeepWalk初探
- 两间三层小型别墅图片_两间三层中式别墅外观图片