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

2019-08-20 17:50发布

  目的:输出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。但是却没有脉冲输出。但是直接给这三个参数赋值   时,脉冲输出正常。所以我猜测这里应该是由于进行了强制转换的原因,小弟才疏学浅,不知道为何会这样。。还请诸位大神不吝赐教!!!

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
ZeroDis2016
1楼-- · 2019-08-20 18:39
虽然没有人指教,我终于还是找到了问题所在,总结一下经验:
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。。程序正确执行了。。以后在浮点运算时,尽量优先使用除法,虽然不知道为什么
lvkanger
2楼-- · 2019-08-20 23:20
 精彩回答 2  元偷偷看……
szczyb1314
3楼-- · 2019-08-21 04:28
ZeroDis2016 发表于 2017-4-22 09:31
虽然没有人指教,我终于还是找到了问题所在,总结一下经验:
1、进行浮点运算时采取double = float / floa ...

单片机里能不用除法就不用除法。尽量不用除法,做一次除法花费的时间太长了,当你处理流程需要时间限制时,最好不要用除法。你的问题肯定还不是这个原因。
ZeroDis2016
4楼-- · 2019-08-21 08:02
lvkanger 发表于 2017-4-22 09:28
最好用int进行强制转换吧,float是有符号数

。。没看到你评论。。确实可能存在你说的问题,无符号和有符号数之间的转换确实需要注意,不过在这里不是主要原因。。。谢谢!
ZeroDis2016
5楼-- · 2019-08-21 13:58
szczyb1314 发表于 2017-4-22 10:47
单片机里能不用除法就不用除法。尽量不用除法,做一次除法花费的时间太长了,当你处理流程需要时间限制时 ...

感觉遇到了Keil的BUG。。刚刚还正常运行了。。突然又不行了。。。
ZeroDis2016
6楼-- · 2019-08-21 16:23
lvkanger 发表于 2017-4-22 09:28
最好用int进行强制转换吧,float是有符号数

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

一周热门 更多>