微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > TI模拟硬件电路设计 > 电机控制,寻求帮助

电机控制,寻求帮助

时间:10-02 整理:3721RD 点击:
DMC f281xpwm.c 中有一段程序
void F281X_EV1_PWM_Update(PWMGEN *p)
{
int16 MPeriod;
int32 Tmp;

// Compute the timer period (Q0) from the period modulation input (Q15)
Tmp = (int32)p->PeriodMax*(int32)p->MfuncPeriod; // Q15 = Q0*Q15
MPeriod = (int16)(Tmp>>16) + (int16)(p->PeriodMax>>1); // Q0 = (Q15->Q0)/2 + (Q0/2)
EvaRegs.T1PR = MPeriod;

// Compute the compare 1 (Q0) from the PWM 1&2 duty cycle ratio (Q15)
Tmp = (int32)MPeriod*(int32)p->MfuncC1; // Q15 = Q0*Q15
EvaRegs.CMPR1 = (int16)(Tmp>>16) + (int16)(MPeriod>>1); // Q0 = (Q15->Q0)/2 + (Q0/2)

// Compute the compare 2 (Q0) from the PWM 3&4 duty cycle ratio (Q15)
Tmp = (int32)MPeriod*(int32)p->MfuncC2; // Q15 = Q0*Q15
EvaRegs.CMPR2 = (int16)(Tmp>>16) + (int16)(MPeriod>>1); // Q0 = (Q15->Q0)/2 + (Q0/2)

// Compute the compare 3 (Q0) from the PWM 5&6 duty cycle ratio (Q15)
Tmp = (int32)MPeriod*(int32)p->MfuncC3; // Q15 = Q0*Q15
EvaRegs.CMPR3 = (int16)(Tmp>>16) + (int16)(MPeriod>>1); // Q0 = (Q15->Q0)/2 + (Q0/2)

}
有人能看懂吗?谢谢

// Compute the timer period (Q0) from the period modulation input (Q15)
Tmp = (int32)p->PeriodMax*(int32)p->MfuncPeriod; // Q15 = Q0*Q15
MPeriod = (int16)(Tmp>>16) + (int16)(p->PeriodMax>>1); // Q0 = (Q15->Q0)/2 + (Q0/2)
EvaRegs.T1PR = MPeriod;

_________________________________________________________________
这样处理的确有些费解.为什么不直接赋值呢?
EvaRegs.T1PR = PeriodMax ;
这样就不行吗?
如果出于可能溢出的考虑,那么乘以MfuncPeriod又有什么意义?

分几部分来说一下我的理解:
1,用指针作为参数的好处:看来该指针是个指向一个自定义结构的指针,有一下成员。
p->PeriodMax
p->MfuncPeriod
p->MfuncC1
p->MfuncC2
p->MfuncC3
如果,只传指针,效率相对来说比较高,毕竟只要穿一个指针,而不用传四个参数了。当然,
这可能只是作者的意图之一,毕竟指针的y应用太灵活了。

2,Q?是一种利用定点小数进行计算的方法。Q16表示小数部分精度为16bit,Q0表示为精度为小数部分精度0。 让Q16参与计算的目的是,避免因为舍位,造成累计舍位误差。对于不同精度Q与Q之间的运算,是有一定规则的。

3,把以上纷纷扰扰的东西去掉后,就是
EvaRegs.T1PR = MPeriod;
EvaRegs.CMPR1 = ?
EvaRegs.CMPR2 = ?
EvaRegs.CMPR3 = ?
这个我想你翻一下书就能看明白了,无非是dsp比较单元的设置。

这种做法一直都没有理解,有人出来答疑解惑吗?

经典! 其实就真的是事件管理器的一些寄存器的赋值,你去翻书对着每个寄存器的位看看它的作用是什么就可以了,很简单。。。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top