硬汉嵌入式论坛

 找回密码
 立即注册
查看: 295|回复: 6
收起左侧

[技术讨论] 除数为0会导致出现什么奇怪现象?

[复制链接]

2

主题

29

回帖

35

积分

新手上路

积分
35
发表于 2025-7-24 14:58:49 | 显示全部楼层 |阅读模式
本帖最后由 老陈_cmm 于 2025-7-25 11:22 编辑


250725更新:出去的产品没有读取软件版本的功能,所以不知道有问题的产品对应的软件是哪个,,之前的分析就不成立了,是软件逻辑问题,但是很难复现问题,折腾几天都没能复现。


不知道怎么删贴,是不是没有这个功能呀?

阳台吹了会风,想了会,这时候应该是觉得前面的推测是错误的。不用细看了,感谢大伙!

代码是接手的,比较乱,属于屎山代码,bug也很多!修修补补好多次。


背景:产品为便捷式的小工具(电池供电),新出去了1000个,到用户手中就不知道有多少个,,客户目前反馈了已经发现两个有问题,说是充不进电。



问题描述:给产品用usb充电,屏幕显示,电量从0~100%,个别产品卡在某个电量,比如43%不管充多久都上不去了,但实际测量电池两端电压是达到满电状态了,相当于0~43%量程,44~100%的这部分不会显示了。。其它功能全部正常,放电时电压降到对应值电量也会从43往下掉,充电时也会从0~43%。


问题排查:充电部分代码如下图,batLevel 是代码定义的变量,正常情况是需要达到对应的电压就会增加百分比,拿到问题产品,实际显示电量为41%(这是正常batLevel应该等于41),接上JLINK读取出现问题的产品中batLevel的值为0!!!
32851037-357f-4b06-b6be-76107e5aae01.png

batLevel变量与电池端采集的adc值相关,继续往上找对应的adc值,代码如下图,发现公式计算中除数gADCxConvertedData[0]是一个adc的采样值,这是有几率为0的!!!这时候感觉已经找到了bug的根源,实际上是不是这个所导致的?同样用JLINK读取gADCxConvertedData[0],gADCxConvertedData[1],发现都是0!!!但用万用表测量mcu的adc采样引脚是有2.xV的,所以这也是不正常的。
9edb0167-fff8-42d1-a8bf-ff3f2a32f18d.png
跟着这条思路,我修改代码,偶尔让gADCxConvertedData[0]=0;上机测试,当gADCxConvertedData[0]=0时,整个系统都是正常在跑的,不会触发硬件异常,也没有复现产品出现的问题。这时候傻眼了~~~,搞了一天也没有复现问题,于是有了这个帖子。



主控是普冉的PY32F030,实际是不是除数为0的问题所导致的??我个人觉得是,但是测试却又复现不了,想看看大伙有啥招, 感谢看完!


回复

使用道具 举报

5

主题

40

回帖

55

积分

初级会员

积分
55
发表于 2025-7-24 17:16:19 | 显示全部楼层
显卡43,干显存
电量43,不清楚
建议提高代码可读性
回复

使用道具 举报

2

主题

29

回帖

35

积分

新手上路

积分
35
 楼主| 发表于 2025-7-24 18:35:43 | 显示全部楼层
p00equal1 发表于 2025-7-24 17:16
显卡43,干显存
电量43,不清楚
建议提高代码可读性

什么时候干内核
回复

使用道具 举报

34

主题

206

回帖

308

积分

高级会员

积分
308
发表于 2025-7-25 09:09:41 | 显示全部楼层
不是应该实时读取ADC读数转换电压然后转换电量百分比batLevel么
这里为啥设计成batLevel++?
回复

使用道具 举报

5

主题

40

回帖

55

积分

初级会员

积分
55
发表于 2025-7-25 10:26:56 | 显示全部楼层

建议把电量显示分两层做
底层电压值转百分比(这个需要验证输出的百分比在电池静态状态下不会突变)
百分比到真实显示的百分比中间嵌一层逻辑用于避免电源接入,移除,电池大电流放电时的电压跳变
回复

使用道具 举报

2

主题

29

回帖

35

积分

新手上路

积分
35
 楼主| 发表于 2025-7-25 11:23:11 | 显示全部楼层
p00equal1 发表于 2025-7-25 10:26
建议把电量显示分两层做
底层电压值转百分比(这个需要验证输出的百分比在电池静态状态下不会突变)
百分 ...

好的
回复

使用道具 举报

2

主题

29

回帖

35

积分

新手上路

积分
35
 楼主| 发表于 2025-7-25 11:28:37 | 显示全部楼层
LinY 发表于 2025-7-25 09:09
不是应该实时读取ADC读数转换电压然后转换电量百分比batLevel么
这里为啥设计成batLevel++?

每次进来都读取最新的电压值,DEF_PERCENT_CHARGE_RATE_0_80这个宏做了电压对应的百分比分段,,,需要卡时间,充电不能加太快,放电不能降太快,,这里的计算问题还很大,需要多分几段判断才更加合理,不同型号电池电芯不一样导致特性有差异,,一定要先测试电池特性后再做相应的算法
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-11 21:03 , Processed in 0.043092 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表