原问题如下:
“
DSP28335 在更新EPWM 比较寄存器的时候,要把算完的小数 乘以 PWM周期,然后送给 CMPA 这里 是不是要强类型转换成整数? 是用int16 还是 Uint16啊???
下面是更新EPWM 比较寄存器,这样写对不对啊???????
int32 Tmp_a;
Tmp_a=p->PeriodMax*(p->MfuncC1);
EPwm1Regs.CMPA.half.CMPA = (int16)Tmp_a;
EPwm1Regs.CMPB=(int16)Tmp_a;
其中 MfuncC1 存得是调制信号,正常时应该是0-1之间的数,不过也不排除有些时候可能会在0-1之外一点点。
或者在更新CMPA比较值的时候是否可以直接写:
EPwm1Regs.CMPA.half.CMPA =p->PeriodMax*(p->MfuncC1);
它是否会自己自动进行数据类型转换啊?
怎样写好呢????
”
原答案如下:
sys.param.Mfunc_c1 = _IQmpyI32int(sys.param.DutyA, EPwm1Regs.TBPRD);
建议用这样的语句使用
IQ是定点,F28335不需要用IQ库,用的目的是各个芯片的版本兼容,你可以看一下IQmath,h中,对于F28335, IQmath type= float, 就是靠硬件直接算出来的,对于定点的芯片,需要IQ转换。所以你可以不包含此库。
按照前边两位高人所说,修改更新比较器语句如下:
EPwm1Regs.CMPA.half.CMPA = _IQmpyI32int(p->MfuncC1, EPwm1Regs.TBPRD);
修改后报如下错误:
undefined first referenced symbol in file ——— —————- __IQmpyI32int D:\\tidcs\\c28\\DSP2833x\\v131\\zhengliu_by_380\\epwm_updown_aq\\Debug\\Example_2833xEPwmUpDownAQ.obj
试着在开头增加包含头文件“IQmathLib.h”之后还是不对,我的工程目录下没有“IQmath,h”
我的CMD文件里有这样的句子:
FLASHC : origin = 0x328000, length = 0x008000 /* on-chip FLASH */
IQmath : > FLASHC PAGE = 0 /* Math Code */
IQmathTables : > IQTABLES, PAGE = 0, TYPE = NOLOAD
想问下如何解决啊 ?还有 TI有没有 关于在28335 下 这种调用IQ 函数的说明文档啊 ?
guoqiang wang:
回复 Jones Chen:
不是的啊,这就是您 在上一个问题中给我的答案,我放在我的程序中,报错误,上一个帖子的题目是“28335 EPWM 比较器更新,强制类型转换 问题”
这里报的错误信息中确实是说了“__IQmpyI32int ”没有,但是这个函数是在IQmathLib.h中有定义的,但是我包含这个头文件一样报错。
而且我不想只为了这一个EPWM更新 就多包含一个文件,只想知道更新的时候强制类型转换 如何写法合适
谢谢