最近使用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等值弄乱了。