12下一页
返回列表 发新帖我要提问本帖赏金: 15.00元(功能说明)

[蓝牙芯片] 分享CH582之电阻分压实现电池电压检测“踩坑”记录

[复制链接]
4372|21
 楼主| lilijin1995 发表于 2023-3-7 17:20 | 显示全部楼层 |阅读模式
本帖最后由 lilijin1995 于 2023-3-7 18:31 编辑

今天要跟大家分享CH582之电阻分压实现电池电压检测“踩坑”记录!!!设计电池电压检测电路的前期参考了很多资料,如沁恒论坛帖子:https://www.wch.cn/bbs/thread-74306-1.html

一、硬件设计
然后我就设计了如下电路:
195416407030457599.png

粗看并没有啥问题,R4电阻和C14我的想法是RC滤波电路,但是电阻的匹配上面并没有计算的。
4.2V的锂电池,4.2/3*1=1.4V, 如果ADC检测到1.4V的话,那么不就可以算出4.2V满电状态吗,
然而实际上板验证后,并没有那么理想,2M和1M分压后,并没有1.4V,实际测得的电压1.2V左右;0.2V的误差太大了;肯定不能用的,然后请假各路群友,大部分人建议用200K和100K,我也搜到了一篇博客:
作者是在Kindle上用的,虽然我没有踩到电阻精度的坑,不过也需要警醒,提醒生产要注意电阻精度1%或更高才行。 4951964070798ef004.png

查看了公司仓库只有390K和196K的0402,1%的电阻。然后修改线路图如下:
109164070653d40eb.png

二、软件设计
我们接下来看软件代码,
我们用了两个ADC通道,其一是用来检测霍尔传感器信号,其一是用以检测电池电压。
1649664070a9dc9526.png
配置初始化代码如下:
  1. void MyADC_Init(void)
  2. {
  3.     uint8_t i = 0;
  4.     /* DMA单通道采样:选择adc通道0(PA4)做采样 */
  5.     GPIOA_ModeCfg(GPIO_Pin_4, GPIO_ModeIN_Floating);
  6.     ADC_ExtSingleChSampInit(SampleFreq_3_2, ADC_PGA_1_4);
  7.     ADC_ChannelCfg(0);
  8.     ADC_AutoConverCycle(192); // 采样周期为 (256-192)*16个系统时钟
  9.     ADC_DMACfg(ENABLE, (uint16_t) (uint32_t) &abcBuff[0],
  10.             (uint16_t) (uint32_t) &abcBuff[20], ADC_Mode_Single);
  11.     PFIC_EnableIRQ(ADC_IRQn);
  12.     ADC_StartDMA();
  13.     while(!DMA_end);
  14.     DMA_end = 0;
  15.     PRINT("AIN0 DMA end \n");
  16.     for (i = 0; i < 20; i++) {
  17.         PRINT("%d \n", abcBuff[i]);
  18.     }

  19.     ADC_ChannelCfg(5);
  20.     ADC_StartDMA();
  21.     while(!DMA_end);
  22.     DMA_end = 0;
  23.     PRINT("AIN5 DMA end \n");
  24.     for (i = 0; i < 20; i++) {
  25.         PRINT("%d \n", abcBuff[i]);
  26.     }
  27. }
因为开始了中断,所以要有中断服务函数:
  1. /*********************************************************************
  2. * @fn      ADC_IRQHandler
  3. *
  4. * [url=home.php?mod=space&uid=247401]@brief[/url]   ADC中断函数
  5. *
  6. * [url=home.php?mod=space&uid=266161]@return[/url]  none
  7. */
  8. __INTERRUPT
  9. __HIGH_CODE
  10. void ADC_IRQHandler(void) //adc中断服务程序
  11. {
  12.     if (ADC_GetDMAStatus()) {
  13.         ADC_ClearDMAFlag();
  14.         ADC_StopDMA();
  15.         R16_ADC_DMA_BEG = (uint16_t) (uint32_t) &abcBuff[0];
  16.         DMA_end = 1;
  17.     }
  18. }
最后是电压的转换公式
  1. void BPVF_Handle(void)
  2. {
  3.     u8 i=0;
  4.     u32 Ad_Sum = 0;

  5.     double dftemp=0.00000;

  6.     ADC_ChannelCfg(5);
  7.     ADC_StartDMA();
  8.     while(!DMA_end);
  9.     DMA_end = 0;
  10.     for (i = 0; i < 20; i++) {
  11.         Ad_Sum += abcBuff[i];
  12.     }
  13.     dftemp=Ad_Sum/20;
  14.     dftemp=(dftemp/512-3)*1.05*586/196;
  15.     PRINT("VBAT=%f\r\n",dftemp);

  16. }
我们来分析一下电池电压的计算过程;我门这里是做了取20个样本求平均。dftemp=Ad_Sum/20是R4和R8分压的ADC值,那么如何计算出实际电压值呢?
CH582规格书中有个表,ADC 转换后的数据计算被采样的电压 Vi计算公式如下:
(ADC/512-3)*Vref;其中,
ADC:ADC 转换后的数字量,即 R16_ADC_DATA。
Vref:内部模拟电路的电源节点 VINTA 的实际电压值,通常为 1.05V±0.015V。

我用万用表测得测得VINTA =1.052V=Vref


4946964070cbfbd66f.png
举个栗子:如ADC处理的值是2211,那么R7和R8分压的值(2211/512-3)*1.052=1.3869140625V,然后
电池电压VBAT=1.3869140625V*(R7+R8)/R8=4.146590003188776v;


打赏榜单

21ic小管家 打赏了 15.00 元 2023-04-14

稳稳の幸福 发表于 2023-3-8 11:03 | 显示全部楼层
上来就坑了坑的,吓人。呵呵
奔牛滚滚 发表于 2023-3-31 00:15 | 显示全部楼层
说了半天,到底你的采集结果和实际相差多少?
biechedan 发表于 2023-4-4 21:26 | 显示全部楼层
这个有什么问题              
1988020566 发表于 2023-4-4 21:43 | 显示全部楼层
这个有什么选择的要求的吗              
tabmone 发表于 2023-4-4 21:58 | 显示全部楼层
因为负载,负载有阻性负载               
timfordlare 发表于 2023-4-4 22:04 | 显示全部楼层
分压电阻确实不好用 。              
chenci2013 发表于 2023-4-4 22:14 | 显示全部楼层
怎么得到比较稳定的毫伏电压?  
albertaabbot 发表于 2023-4-7 09:40 | 显示全部楼层
使用一个滑动变阻器吧               
juliestephen 发表于 2023-4-7 09:45 | 显示全部楼层
为什么不是M欧姆的电阻              
backlugin 发表于 2023-4-7 10:19 | 显示全部楼层
这个太小的电阻,消耗就比较大的。
tpgf 发表于 2023-4-7 14:44 | 显示全部楼层
电阻一分压 我就想起了外部阻抗不同 是不是能匹配的问题
qcliu 发表于 2023-4-7 14:55 | 显示全部楼层
adc采集本来就讲究电阻匹配  如果使用电阻分压真的不太好用了
drer 发表于 2023-4-7 15:33 | 显示全部楼层
考虑使用放大器搭建一个跟随器好使吗
coshi 发表于 2023-4-7 15:58 | 显示全部楼层
感觉光是提高电阻的精度是远远不够的
kxsi 发表于 2023-4-7 16:28 | 显示全部楼层
感觉使用电阻分压本身就不是一个太好的选择
wiba 发表于 2023-4-7 16:39 | 显示全部楼层
这种方式采集到的数据也只能凑合用了
biechedan 发表于 2023-4-7 18:19 | 显示全部楼层
使用分压法测电池的电压,这两个电阻选择多大合适
sdlls 发表于 2023-4-7 18:32 | 显示全部楼层
会不会产生能量的浪费呢?              
vivilyly 发表于 2023-4-7 22:30 | 显示全部楼层
电路中电阻有分压降压特性               
您需要登录后才可以回帖 登录 | 注册

本版积分规则

56

主题

165

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部