硬汉嵌入式论坛

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

float变量运算,结果出错。没想到~~

[复制链接]

25

主题

58

回帖

133

积分

初级会员

积分
133
发表于 2024-12-14 14:44:45 | 显示全部楼层 |阅读模式
版主,各位大神!


       手里的项目已经接近尾声,有一个温度测量的电路,测试环境温度,硬件电路测试和看波形没问题。

       但是发现,计算的数据,有问题。所以,在线调试观察发现 两个float变量,运算中出现问题

      之前没有遇到这样的情况。

      代码如下:

       其他变量都是uint32_t
       percent1 是float  
       temp1    是double


        for(i=0;i<20;i++)
        {
                read_TO103J2F();  //读取uhADCxConvertedValue值
                adc_data1[i] = uhADCxConvertedValue;
        }
       
        adc_sum1 = 0;
        for(i=0;i<20;i++)
        {
                        adc_sum1 += adc_data1[i];
        }       
       
        //对adc转换值进行修正
        adc_avg1 = adc_sum1/20 ;   //
       
        percent1 = (float)((float)adc_avg1/65536.0);
        temp1    = 3.30*percent1;



我觉得应该没问题,但是方针看到的结果
adc_avg1  = 8706
percent1   = 0.132843018;
temp1       = 0.001381958007812

浮点数相乘,问题出在哪里了?

谢谢大家


回复

使用道具 举报

25

主题

58

回帖

133

积分

初级会员

积分
133
 楼主| 发表于 2024-12-14 14:45:44 | 显示全部楼层
percent1的值是正确的
回复

使用道具 举报

22

主题

182

回帖

248

积分

高级会员

积分
248
QQ
发表于 2024-12-14 17:40:14 | 显示全部楼层
你把这两句
percent1 = (float)((float)adc_avg1/65536.0);
temp1    = 3.30*percent1;
替成
temp1    = ((float)adc_avg1) * 5.035400390625e-5f
试试
没看出问题,但是你的好像效率很低
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2024-12-15 09:42:57 | 显示全部楼层
        float percent1;
        float temp1;
        uint32_t adc_avg1 = 8706;
       
        percent1 = adc_avg1/65536.0f;
    temp1    = 3.30f*percent1;
回复

使用道具 举报

25

主题

58

回帖

133

积分

初级会员

积分
133
 楼主| 发表于 2024-12-16 14:56:26 | 显示全部楼层
还是不行。
float1_20241216145354.png
float2_20241216145431.png
float3_20241216145443.png
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
发表于 2024-12-16 15:07:54 | 显示全部楼层
本帖最后由 supertankhzt 于 2024-12-16 17:46 编辑

   
[C] 纯文本查看 复制代码
adc_avg1 = adc_sum1/20 ; 

percent1 = (float)((float)adc_avg1/65536.0);
temp1    = 3.30*percent1;

建议把以上代码改成下面的,可以最大程度保留精度,原则上先乘后除。

[C] 纯文本查看 复制代码
temp1=3.3f*adc_sum1/(65536ul*20);


回复

使用道具 举报

2

主题

65

回帖

71

积分

初级会员

积分
71
发表于 2024-12-16 17:34:22 | 显示全部楼层
确实奇怪,随手拿别的板子试了下也没啥问题
可以排查下是不是爆栈了
捕获.PNG
回复

使用道具 举报

25

主题

58

回帖

133

积分

初级会员

积分
133
 楼主| 发表于 2024-12-16 18:09:47 | 显示全部楼层
谢谢@yono,谢谢@eric2013,谢谢@supertankhzt,谢谢@踩姑娘的小蘑菇

感谢大家的帮助,每次提问,都会有热心的兄弟姐们的帮助。

问题发现了,硬件和软件都有问题,已经确定了问题!

首先上述,float 的乘法没有问题。
后面的代码里面,从新把temp1赋值做了其他运算;编程习惯不好,后面注意。

硬件配置也有问题:
错误配置采集计算的电压值,竟然和示波器采集到数据一样。

后来,拿了一个玻璃瓶热水杯,NTC传感器,贴在上面,才发现数据不正确。

从新检查引脚配置。已经可以正常采集数据。

这里要说明一下:
我用的是stm32H743,他的ADC可以配置为单点采集,也可以配置为差分采集;

如果是单点采集:ADC_INPx接入模拟信号;ADC_INNx不起作用,千万别以为可以接入另外一路模拟信号接入;
如果是差分采集:ADC_INPx接入差分正(+)信号,ADC_INNx接入差分负(-)信号;

我配置的是单点采集;PC5配置有问题。

现在已经可以了!

再次感谢大家了!!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-25 20:36 , Processed in 0.260667 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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