
导语:
在电机控制软件设计中,常常需要使用到电机的位置、速度信息,就需要使用到传感器。传感器的种类很多,其中之一便是增量式光电编码器,该传感器具有非接触、高精度、高分辨率和响应快等优点,在检测和控制领域得到了广泛的应用,在使用时便需要用到eQEP模块。本期我们做一个简单的eQEP例程:eQEP对ePWM产生的脉冲进行测算。
什么是eQEP?
eQEP(增强型正交编码器)用于将线性位移转换为脉冲信号。通过监控脉冲的数目和两个信号的相对相位,用户可以获取旋转位置、旋转方向和速度,通过第三个通道的索引信号,可用于对位置计数器进行复位,从而确定绝对位置。
EQEP对PWM产生的脉冲进行测算的原理
HXS320F28027内置1个eQEP模块,4个ePWM模块(ePWM1/ePWM2/ePWM3/ePWM4)。利用ePWM1A和ePWM1B输出两个信号来模拟光电传感器的的输出,作为eQEP模块的输入,通过计算,得到模拟的电机转速。
本程序继续中科昊芯Core_DSC28027核心板,相关资料可以在中科昊芯官网下载
http://www.haawking.cn/kfb
运行效果:
ePWM模拟增量式编码器示波器截图:

Haawking-IDE V1.5.0实时刷新功能显示转速信息:

例程主要代码:
//
// 主函数:
//
int main(void)
{
//
// Step 1. Initialize System Control:
//
InitSysCtrl(); //60MHz
//
// Step 2. Initialize GPIO:
//
SysGpioInit();
//
// Step 3. Clear all interrupts and initialize PIE vector table:
//
DINT;
InitPieCtrl();
IER |= 0x0000;
IFR |= 0X0000;
InitPieVectTable();
EALLOW;
PieVectTable.TINT0 = &timer0_isr;
EDIS;
//
// Step 4. Initialize all the Device Peripherals:
//
// ePWM
Pwm1CMPA = SysFreq*15000/SetSpeed;
EPWMConfig();
// Timer
Timer0Config();
//eQEP
EQEPConfig();
//
// Step 5. User specific code, enable interrupts
//
Timer0Counter = 0;
PulseNum = 0;
PulseDir = 0;
MotorSpeed = 0;
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
IER |= M_INT1;
EINT;
ERTM;
for(;;)
{
__asm(" NOP");
}
return 0;
}
//
// timer0中断函数:
//
__interrupt void CODE_SECTION("ramfuncs") timer0_isr(void)
{
Timer0Counter++;
PulseNum = EQep1Regs.QPOSLAT;
PulseDir = EQep1Regs.QEPSTS.bit.QDF;
if(PulseDir==1)
{
MotorDir = 1;
}
else
{
MotorDir = -1;
PulseNum = 0xFFFFFFFF - PulseNum;
}
MotorSpeed = MotorDir*PulseNum*10000*60/4000;
CpuTimer0Regs.TCR.bit.TIF = 1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
//
// eQEP配置函数
//
void EQEPConfig()
{
EALLOW;
EQep1Regs.QPOSMAX = 0xFFFFFFFF;
EQep1Regs.QUPRD = SysFreq*100;
EQep1Regs.QDECCTL.bit.QSRC = 0; // 0-Quadrature count mode, 1-Direction-count mode
EQep1Regs.QDECCTL.bit.XCR = 0; // 0-2x resolution, 1-1x resolution
EQep1Regs.QEPCTL.bit.FREE_SOFT = 3;
EQep1Regs.QEPCTL.bit.PCRM = 3; // Position counter reset on a unit time event
EQep1Regs.QEPCTL.bit.QPEN = 1; // eQEP position counter is enabled
EQep1Regs.QEPCTL.bit.QCLM = 1; // Latch on unit time out
EQep1Regs.QEPCTL.bit.UTE = 1; // Enable unit timer
EDIS;
}