打印
[技术问答]

关于HK32F030C8T6的浮点运算影响ADC精度问题

[复制链接]
6763|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
logan0279|  楼主 | 2021-9-23 20:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近用HK32F030C8T6做一个项目,利用ADC检测NTC电阻阻值测量环境温度,检测过程中是定时100ms循环启动ADC采样,连续采样5次后停止ADC采样,然后在定时函数中计算采样平均值,再计算出输入电压,然后根据输入电压以及电阻分压公式计算出NTC电阻阻值,最后利用查表法获取温度值。
但实际在执行过程中,发现测出的温度值与实际温度相差好几度,后来我把计算电阻值部分代码注释掉以后,直接输出根据ADC采样值计算出的Vad值,数据与实测值相差不大。但如果把电阻值计算部分代码取消注释,但不输出,仍然只输出根据ADC采样值计算出的Vad值,发现此时的Vad值就会出现明显偏差。
也就是说。如果我在计算Vad值的后面再加上计算NTC电阻值的代码,计算出的Vad值就会出现偏差。而如果没有这些计算NTC电阻值的代码,计算出的Vad值就基本正常。
不知道各位大佬有没有知道是什么原因的?

使用特权

评论回复

相关帖子

沙发
SDLin| | 2021-9-24 09:26 | 只看该作者
根据你的描述【直接输出根据ADC采样值计算出的Vad值,数据与实测值相差不大】,可以判断芯片硬件AD采样是正常的,那么剩下的就是对这些采样值的处理问题了,建议从对这些采样值/结果的处理上分析,应用使用问题。

使用特权

评论回复
板凳
gx_huang| | 2021-9-24 10:02 | 只看该作者
一看就是不懂硬件的工程师设计的软件。
直接根据ADC值计算温度不是更快吗?为何要一步一步来?
直接在xls表格文件里,事先算出ADC值和温度的对应表格,插值计算,全部定点计算,速度快,占用资源少。
网上抄的NTC测温程序,不知道害了多少人,都缺少自己的思维和创新。

使用特权

评论回复
地板
logan0279|  楼主 | 2021-9-24 10:33 | 只看该作者
本帖最后由 logan0279 于 2021-9-24 10:36 编辑

早上继续测试,很神奇的事又发生了。
一开始同昨天一样的现象,如果把计算NTC阻值的部分代码注释掉,则输出的Vad值正常,如果保留,则输出的Vad值异常。
后来我把AD采样计算部分修改,增加采样次数后求平均值,并且把第一次的采样值丢弃。这样改了以后,一开始现象同昨天,即注释掉计算NTC阻值计算部分代码后输出VAD值正常,保留则输出异常。
后来有一次操作时,保留了计算NTC阻值的代码,一开始输出的VAD值也是异常的,但在我拿取产品的时候,手指不知道触碰到什么地方了,输出的VAD值瞬间恢复正常了。
之后重新烧录程序,输出的VAD值也没再出现偏差太大的现象。计算出的NTC阻值与小米的温度计显示的依然差了好几度。
再之后将计算公式用到的几个变量由全局变量改为局部变量后,计算得到的温度值与小米温度计测得的温度值相差一度左右。
而最初的时候,计算公式的几个变量就是局部变量,发现测量值异常后才改为全局变量好输出显示的。
所以到最后仍然是一脸懵逼的状态。最后还有一个问题就是ADC采样的AD值跳动很厉害。。。

使用特权

评论回复
5
logan0279|  楼主 | 2021-9-24 10:43 | 只看该作者
SDLin 发表于 2021-9-24 09:26
根据你的描述【直接输出根据ADC采样值计算出的Vad值,数据与实测值相差不大】,可以判断芯片硬件AD采样是正 ...

谢谢回复。
今天反复测试更改代码,目前恢复正常了。

使用特权

评论回复
6
logan0279|  楼主 | 2021-9-24 10:46 | 只看该作者
gx_huang 发表于 2021-9-24 10:02
一看就是不懂硬件的工程师设计的软件。
直接根据ADC值计算温度不是更快吗?为何要一步一步来?
直接在xls表 ...

谢谢。

使用特权

评论回复
7
logan0279|  楼主 | 2021-9-24 12:06 | 只看该作者
gx_huang 发表于 2021-9-24 10:02
一看就是不懂硬件的工程师设计的软件。
直接根据ADC值计算温度不是更快吗?为何要一步一步来?
直接在xls表 ...

按你说的方法试了下,跟昨天同样的问题,如果注释掉查表这段代码,输出AD值正常,保留这段代码,输出的AD值异常。

使用特权

评论回复
8
Bobby13| | 2021-9-24 12:52 | 只看该作者
把采集的原始数据打印出来,再用excel手工计算,再对比结果,看是哪一步的问题。
单片机,尽量不要用浮点运算,直接用整数,放大一千倍计算。

使用特权

评论回复
9
logan0279|  楼主 | 2021-9-24 14:22 | 只看该作者
Bobby13 发表于 2021-9-24 12:52
把采集的原始数据打印出来,再用excel手工计算,再对比结果,看是哪一步的问题。
单片机,尽量不要用浮点运 ...

谢谢。
我现在是把采样后的计算相关代码全部注释掉,直接输出AD采样值到显示屏,显示屏显示的AD值经手动计算,发现采样的AD值比实测的输入电压大了70到100左右。

使用特权

评论回复
10
logan0279|  楼主 | 2021-9-24 15:16 | 只看该作者
Bobby13 发表于 2021-9-24 12:52
把采集的原始数据打印出来,再用excel手工计算,再对比结果,看是哪一步的问题。
单片机,尽量不要用浮点运 ...

现在我把采样10次的结果全部显示在屏上,发现有时候会出现采样得到的10个数据,其中某一个数据与其他数据相差极大的情况,有时候相差几十,有时相差几百。。。

使用特权

评论回复
11
coody| | 2021-9-24 18:37 | 只看该作者
ADC是硬件的ADC,浮点运算是软件,怎么会影响硬件ADC的性能?

使用特权

评论回复
12
Bobby13| | 2021-9-24 22:46 | 只看该作者
logan0279 发表于 2021-9-24 15:16
现在我把采样10次的结果全部显示在屏上,发现有时候会出现采样得到的10个数据,其中某一个数据与其他数据 ...

用固定比较快的周期去采,比如10ms,1ms周期,打出来看看,
取几百几千个点,excel画个图,看看有啥规律没,
再根据规律找个合适的滤波算法,比如滑动平均,三取一,一阶滤波,等等。
先在excel 里面实现滤波,好了再去单片机实现,
单片机实现了再打印滤波后的数据,跟excel 滤波结果对比。

使用特权

评论回复
13
logan0279|  楼主 | 2021-9-25 09:29 | 只看该作者
Bobby13 发表于 2021-9-24 22:46
用固定比较快的周期去采,比如10ms,1ms周期,打出来看看,
取几百几千个点,excel画个图,看看有啥规律 ...

好的,谢谢指教。
我目前采用的办法是一次采样12个值,去除其中最大和最小的,然后再除10求平均,波动小了很多。
我再按照您说的方法再试试。
再次感谢。

使用特权

评论回复
14
gx_huang| | 2021-9-25 16:05 | 只看该作者
滤波算法只是用于偶尔有干扰场合。
如果ADC采样值经常有问题,显然要先解决这个问题,是硬件设计问题,还是软件驱动问题。
光滤波算法,不是从根本上解决问题。

使用特权

评论回复
15
logan0279|  楼主 | 2021-9-25 17:28 | 只看该作者
gx_huang 发表于 2021-9-25 16:05
滤波算法只是用于偶尔有干扰场合。
如果ADC采样值经常有问题,显然要先解决这个问题,是硬件设计问题,还是 ...

谢谢。
尝试了下直接把采样得到的AD值不经过任何计算,用串口输出,采样得到一千个多数据,统计发现这些AD值波动比较大,一般情况下,AD值波动在20以内,但偶而有个别相差极大的,最小值与最大值间相差接近100。差异很不正常。
一开始怀疑电源的影响,但考虑到同一个电源供电的另一颗STC8G的芯片采样的AD值很稳,波动在5以内,可以排除。
这个应用电路也是比较简单的,外部接NTC热敏电阻,串联分压后采用一颗LMV301的运放跟随式电路输出电压到ADC口.
之前同样的电路用STC的MCU没出过这种情况,这是第一次接触32单片机,整的有点懵。

使用特权

评论回复
16
gx_huang| | 2021-9-25 19:00 | 只看该作者
logan0279 发表于 2021-9-25 17:28
谢谢。
尝试了下直接把采样得到的AD值不经过任何计算,用串口输出,采样得到一千个多数据,统计发现这些A ...

NTC测温,还加运放跟随,大部分是学院派做法。
大概率是你的原理图也有问题。
其实NTC测温,只要电阻和NTC分压,RC低通滤波,直接接ADC输入即可,任何加运放的,基本是画蛇添足。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

41

帖子

0

粉丝