Haawking DSC28027实例程序开发教程——eQEP_ePWM
中科昊芯
编辑于 2021年11月15日 09:24
收录于文集
共36篇

导语:

在电机控制软件设计中,常常需要使用到电机的位置、速度信息,就需要使用到传感器。传感器的种类很多,其中之一便是增量式光电编码器,该传感器具有非接触、高精度、高分辨率和响应快等优点,在检测和控制领域得到了广泛的应用,在使用时便需要用到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实时刷新功能显示转速信息:

例程主要代码:

代码块
clike
自动换行
复制代码
//
// 主函数:
//
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;
}
复制成功