记忆:嵌入式中 float型数无法进行除法和if判断

来源:互联网 发布:域名备案被注销 编辑:程序博客网 时间:2024/06/06 00:12

最近使用K60遇到一个很奇怪的问题

用拉普兰德LPLD库的时候有一个函数:


<span style="font-size:24px;">__INLINE uint16 LPLD_FTM_GetCounter(FTM_Type *ftmx){  return ftmx->CNT;        //获取FTMx计数器值}</span>


该函数返回值为uint16  即unsigned short int(16bits)

第一次用的时候没注意,定义了一个float型的Speed,使用正交解码直接获得该函数的返回值。


<span style="font-size:24px;">Speed = LPLD_FTM_GetCounter(FTM1);</span>

输出Speed随时间变化的波形竟然有正负之分,而且值随时间变化很正确。(这也是我现在无法理解的,求大神讲解。)

但是却出现了一个问题:使用if语句无法判断Speed大于小于0.

如:

<span style="font-size:24px;">  if(Speed_Out >= 5000) Speed_Out=5000;  if(Speed_Out < -5000) Speed_Out=-5000;</span>

该语句执行完

之后Speed 大于0时 输出波形很正常,跟随程序运行;

但是当Speed低于0时,输出波形横为5000;

当我没发现这个函数返回值是uint16时,我监测Speed的输出波形,发现值很正常,然后两句简单的判断之后值就不正常了。


调bug调了两天两夜之后终于发现了,这个关于bit的小又大的bug。

于是 ,16bit和32bit之间的“爱情”打败了我这个第三者。


修正方式:

<span style="font-size:24px;">int16 g_nLeftMotorPulseSigma=0;int16 g_nRightMotorPulseSigma=0;</span>
<span style="font-size:24px;">nleft_pulse = LPLD_FTM_GetCounter(FTM1);//获取FTM1的正交解码计数值nright_pulse = LPLD_FTM_GetCounter(FTM2);LPLD_FTM_ClearCounter(FTM1);//清空计数器LPLD_FTM_ClearCounter(FTM2);</span>
<span style="font-size:24px;">Speed = (-g_nLeftMotorPulseSigma + g_nRightMotorPulseSigma)>>1;</span>


成功的将左轮和右轮的uint16返回值进行运算,得出了float型的32bit值的Speed。

并可进行以下运算。


<span style="font-size:24px;">  if(Speed >= 5000) Speed=5000;  if(Speed < -5000) Speed=-5000;</span>



总结:当在嵌入式编程中,我们遇到float或者其他类型的值无法除法运算或者if判断的时候,我们应该深入研究所有用到它的地方,是不是哪里运算将32bit 16bit 8bit等值弄乱了。




0 0
原创粉丝点击