OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6505|回复: 8

stm32中由于数据类型强制转换遇到的问题

[复制链接]

1

主题

5

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2017-3-3
在线时间
3 小时
发表于 2017-4-22 08:42:28 | 显示全部楼层 |阅读模式
10金钱
  目的:输出n个方波(方波周期为m)暂停a秒;输出n个方波(方波周期为m)暂停a秒。。。如此循环,动作过程中,要求n,m,a三个参数可控  我的程序代码节选:
     u16 speed;        //控制方波周期                       
     u32 step;        //控制方波步数                               
     u32 delay;        //控制暂停时间                       
     u32 count;        //定时器中断中进行计数                       
     u32 real_step;        //记录实际输出的方波步数       

        float speed_buff = 0;
        float step_buff = 0;
        float delay_buff = 0;


        TIM2_Int_Init((1000 - 1),(72 - 1));                // 中断周期为1ms

     //Modbus_HoldReg[0~2] 由外部通过Modbus RTU通讯传递给单片机,此处直接赋值常数,方便进行脉冲输出验证
        Modbus_HoldReg[0] = 10;   //通讯时,数值扩大了10倍,需要除以10得到真实参数,数值调节范围是:5—20,即真实范围是:0.5—2.0。
        Modbus_HoldReg[1] = 100;  //通讯时,数值扩大了100倍,需要除以100得到真实参数,数值调节范围是:50—200,即真范围是:0.50—2.00。
        Modbus_HoldReg[2] = 100;  //通讯时,数值扩大了100倍,需要除以100得到真实参数,数值调节范围是:50—200,即真范围是:0.50—2.00。
       
        speed_buff = (float)Modbus_HoldReg[0] * 0.1; //将参数还原,并赋值给浮点型变量,下同
        step_buff = (float)Modbus_HoldReg[1] * 0.01;
        delay_buff = (float)Modbus_HoldReg[2] * 0.01;
       
        speed = (u16)(500/speed_buff); //经过计算,当Modbus_HoldReg[0] = 10时,理论上speed应等于500
        step = (u32)step_buff * 5;   //经过计算,当Modbus_HoldReg[1] = 100时,理论上step应等于5
        delay = (u32)delay_buff * 5000;//经过计算,当Modbus_HoldReg[2] = 100时,理论上delay应等于5000



     其他代码这里就省略了。。。在Debug下观察,speed、step、delay确实分别等于500、5、5000。但是却没有脉冲输出。但是直接给这三个参数赋值   时,脉冲输出正常。所以我猜测这里应该是由于进行了强制转换的原因,小弟才疏学浅,不知道为何会这样。。还请诸位大神不吝赐教!!!

最佳答案

查看完整内容[请看2#楼]

虽然没有人指教,我终于还是找到了问题所在,总结一下经验: 1、进行浮点运算时采取double = float / float 这样的形式进行运算,我试了一下将被除数改为double时,虽然Debug里看到的数是正确的,但不知道为什么,程序就是不正确执行。所以以后在进行浮点运算时,一定要先将操作数强制为float型,再将运算结果传递给double型。 2、speed_buff = (float)Modbus_HoldReg[0] * 0.1; 使用这条指令时,程序也不正确执行。但是将其改为 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2017-3-3
在线时间
3 小时
 楼主| 发表于 2017-4-22 08:42:29 | 显示全部楼层
虽然没有人指教,我终于还是找到了问题所在,总结一下经验:
1、进行浮点运算时采取double = float / float 这样的形式进行运算,我试了一下将被除数改为double时,虽然Debug里看到的数是正确的,但不知道为什么,程序就是不正确执行。所以以后在进行浮点运算时,一定要先将操作数强制为float型,再将运算结果传递给double型。
2、speed_buff = (float)Modbus_HoldReg[0] * 0.1; 使用这条指令时,程序也不正确执行。但是将其改为speed_buff = (float)Modbus_HoldReg[0] / 10; 把乘以0.1,改为除以10。。程序正确执行了。。以后在浮点运算时,尽量优先使用除法,虽然不知道为什么
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7714
金钱
7714
注册时间
2016-11-30
在线时间
652 小时
发表于 2017-4-22 09:28:33 | 显示全部楼层
最好用int进行强制转换吧,float是有符号数
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2017-4-22 10:47:36 | 显示全部楼层
ZeroDis2016 发表于 2017-4-22 09:31
虽然没有人指教,我终于还是找到了问题所在,总结一下经验:
1、进行浮点运算时采取double = float / floa ...

单片机里能不用除法就不用除法。尽量不用除法,做一次除法花费的时间太长了,当你处理流程需要时间限制时,最好不要用除法。你的问题肯定还不是这个原因。
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2017-3-3
在线时间
3 小时
 楼主| 发表于 2017-4-22 10:57:14 | 显示全部楼层
lvkanger 发表于 2017-4-22 09:28
最好用int进行强制转换吧,float是有符号数

。。没看到你评论。。确实可能存在你说的问题,无符号和有符号数之间的转换确实需要注意,不过在这里不是主要原因。。。谢谢!
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2017-3-3
在线时间
3 小时
 楼主| 发表于 2017-4-22 11:01:35 | 显示全部楼层
szczyb1314 发表于 2017-4-22 10:47
单片机里能不用除法就不用除法。尽量不用除法,做一次除法花费的时间太长了,当你处理流程需要时间限制时 ...

感觉遇到了Keil的BUG。。刚刚还正常运行了。。突然又不行了。。。
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2017-3-3
在线时间
3 小时
 楼主| 发表于 2017-4-22 12:09:42 | 显示全部楼层
lvkanger 发表于 2017-4-22 09:28
最好用int进行强制转换吧,float是有符号数

请问一下,只要存在整数与浮点数之间的强制转换程序就无法正常运行,这是哪里的问题?编译器不支持转换?
回复

使用道具 举报

49

主题

341

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5271
金钱
5271
注册时间
2012-8-25
在线时间
1025 小时
发表于 2017-4-22 15:35:55 | 显示全部楼层
在单精度用法是  *0.1   0.1是双精度  他会隐私转换Modbus_HoldReg[0]到双精度   
所以直接给数要显示明确是单精度   *0.1f  ,

但是我感觉这不是导致出错的原因 ,只是会降低点效率
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7714
金钱
7714
注册时间
2016-11-30
在线时间
652 小时
发表于 2017-4-24 09:10:05 | 显示全部楼层
ZeroDis2016 发表于 2017-4-22 12:09
请问一下,只要存在整数与浮点数之间的强制转换程序就无法正常运行,这是哪里的问题?编译器不支持转换?

不应该会出现这样的问题啊?最好检查下代码!
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-8-22 01:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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