我的芯片是TMS320F28035,我需要计算一个占空比:
我要计算一个式子:dutybase=timbase*duty/100;
duty范围:10~50 (十进制)
timbase是固定值:4166(十进制)
然后我用Q格式计算,算式如下:
void Setduty(Uint8 duty)
{
Uint16 timbase,dutybase;
_iq q_base;
timbase=4166;
q_base=_IQ15div(_IQ14mpy(_IQ15toIQ(timbase),_IQ24toIQ(duty)),_IQ24toIQ(100)); //用Q格式计算
dutybase=_IQ15int(q_base);//把Q格式数据还原为寄存器数
}
当我传入duty=10的时候,这个时候dutybase的值为13(十进制) ,正常来说我得到的值应该是4166*10/100=416才对,如果我不用Q格式的话,如果这样写:
dutybase=timbase*duty/100;这样就得到的0,以前都是用arm开发,第一次用dsp,所以不是很理解这个Q值转换,如果不用Q值计算,用arm的习惯写出来的公式,得到的结果又不对,能帮我分析下我哪里有问题么?
Green Deng:
你好,建议你可以参考一下IQmath的使用说明文档,位置在:C:\ti\c2000\C2000Ware_3_02_00_00\libraries\math\IQmath\c28\docs
user6392471:
回复 Green Deng:
那些资料只是说明如何用而已,但是没有说明如何数据对齐啊,就是说我用的过程中,我怎么知道什么时候该用哪个_iqN呢?
q_base=_IQ15div(_IQ14mpy(_IQ15(timbase),_IQ25(duty)),_IQ24(100));比如这个算式中,我既可以定义duty为_IQ25也可以定义_IQ24如果用这两种定义的话,最后我dutybase=_IQ15int(q_base);这个得数是否一样?
Green Deng:
回复 user6392471:
你好,我为你的问题升级到英文E2E论坛了,你可以参考帖子中工程师的回复:
e2e.ti.com/…/933976
user6392471:
回复 Green Deng:
我用英文回了他的答复并继续提了一个问题,等待他的答复。
Green Deng:
回复 user6392471:
好的,因为对方是国外(大部分是美国)工程师,所以有时差,可能回复会比较慢。