本帖最后由 会飞的猪_2020 于 2024-11-19 16:43 编辑
精度问题产生的错误如何处理,是否还是不如定点数?
前几个月,我把一份在M0芯片上的电机驱动代码,抄到了H7上。
原先是定点数,我想着反正H7有浮点计算的单元,就干脆不用Q格式,直接浮点数做就好。
结果出错了。
伪代码如下:
[C] 纯文本查看 复制代码 if (SWITCH_TS - Ta - Tb > 0) {
}else{
Ta = (Ta * SWITCH_TS) / (Ta + Tb);
Tb = (Tb * SWITCH_TS) / (Ta + Tb);
}
这个代码的逻辑如下:
这里的Ts就是开关周期,Ta是a相的打开的时间,Tb是b相打开的时间。
物理上限制了Ta+Tb必须小于等于Ts。如果下发的指令让Ta+Tb超过了Ts就要做一个过调制的操作。
上面的代码就是一个简单的过调制的逻辑。这里判断,如果Ta+Tb的时间超过了Ts,如果Ta+Tb大于Ts,就让Ta和Tb按各自的比例分配Ts。
用浮点数做出来会导致后面计算另外一个值T1的时候出现负值,T1的计算方法如下:
[C] 纯文本查看 复制代码 T1 = (SWITCH_TS - Ta -Tb)/4;
理论上如果过调制之后,T1肯定为0,但是浮点数计算出来是负值,导致后面的换算PWM的CRR值的时候出现了很大的值,而不是零。

这个令我很困惑,不知道浮点数的意义在哪里了。哪怕我的芯片有浮点数计算单元,我也要使用定点数吗?
|