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

最近使用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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值