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
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。。程序正确执行了。。以后在浮点运算时,尽量优先使用除法,虽然不知道为什么

一周热门 更多>