用dsPIC30F的QEI模块测量交流电机速度和位置(05-100)
本文引用地址:http://www.amcfsurvey.com/article/91537.htm
图6 由标志模式复位
用QEI计算角速度
在一个周期性中断中执行速度计算,因为角速度在一个固定时间周期中是增长的数字,这个中断间隔,必须小于最大转速的1/2转所需时间。电机的转速是3450RPM,所以在这个实例中选用4000RPM,以避免在任何速度计算时溢出。下式用于计算时间间隔:
实例3是定时器1的初始化,用于产生周期性中断,dsPIC DSC运行在14.75MIPS。
实例3:定时器1初始化,产生0.0075秒ISR周期
void InitTMR1(void)
{
TMR1=0; //复位定时器计数器
T1CONbit.TON=0; //关闭定时器1
T1CONbit.TSIDL=0; //睡眠期间连续工作
T1CONbit.TGATE=0; //禁止进入精确定时器
T1CONbit.TCS=0; //使用Tcy作为时钟源
T1CONbit.TCK=2; //Tcy/64作为输入时钟
PR1=1728 ;
//用64预分频器确定中断周期=0.0075秒
IFSobit.T1IF=0; //清定时器1中断标志
IECobits.T1IE=1; //允许定时器1中断
T1CONbits.TON=1; //打开定时器1
turn;
}
实例4是在周期性ISR中计算速度变量:
实例4:角速度计算实例
#define MAX_CNT_PER_REV(500*4-1)
#define MAXSPEED (unsigned int)(((unsigned long)MAX_CNT_PER_REV*2048)/125)
#define HALFMAXSPEED (MAXSPEED>>1)
int Speed;
void_attribute_((_interrupt_))_T1Interrupt(void)
{
IFSobits.T1IF=0;//清定时器1中断标志
PositionCalculation();
Speed=AngPos[0]- AngPos[1];
If(Speed>=0)
{
if (Speed>=(HALFMAXSPEED)
Speed=Speed-MAXSPEED;
}
else
{
if (Speed<-(HALFMAXSPEED)
Speed=Speed+MAXSPEED;
}
Speed*=2;
Return;
}
结语
从本文的编码实例,可以得到表1所示数据。
如果测量的速度和角位置需要比较高的分辨率,可以用下列方法:
用比较长地时间周期精确计数。必须避免脉冲计数器寄存器POSCN溢出,所以在这种情况下推荐使用POSCN寄存器的精度。
使用输入捕捉通道代替转换每转计数周期测量。
用每转产生更多脉冲地增量计数器。
代码实例选用dsPIC30F6010 DSC,开发工具是MPLAB IDE7.11和MPLAB C30 v1.31。■
(郭盛利)
分频器相关文章:分频器原理
评论