This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

使用F28377D控制4路BLDC电机遇到ecap的Time-Stamp数值异常波动(与使用xINT2有关?)



各位好:

我使用TI的TMS320F28377DZWT控制4路BLDC同时转动并计算每路电机的速度(BLDC电机的永磁转子为2对磁极)控制,控制程序采用开环方式。

第1路电机,使用ePWM1~3做控制换相、eCAP1~3中断做电机HALL信号捕捉,电机速度使用eCAP的Time-Stamp功能计算;

第2路电机,使用ePWM4~6做控制换相、eCAP4~6中断做电机HALL信号捕捉,电机速度使用eCAP的Time-Stamp功能计算;

第3路电机,使用ePWM7~9做控制换相、xINT2中断做电机HALL信号捕捉(原电机的3路HALL信号经CPLD变成1路信号),电机速度使用CPUTimer0功能计算;

第4路电机,使用ePWM10~12做控制换相、xINT3~5中断做电机HALL信号捕捉,电机速度使用CPUTimer1功能计算;

eCAP 配置如下(eCAP1~6配置方法相同此处以eCAP1为例):

    ECap1Regs.ECEINT.all = 0x0000;             // Disable all capture __interrupts
    ECap1Regs.ECCLR.all = 0xFFFF;              // Clear all CAP __interrupt flags
    ECap1Regs.ECCTL1.bit.CAPLDEN = 0;          // Disable CAP1-CAP4 register loads
    ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0;        // Make sure the counter is stopped

    // Configure peripheral registers
    ECap1Regs.ECCTL2.bit.CONT_ONESHT = 0;      // 1:One-shot 0:continuous
    ECap1Regs.ECCTL2.bit.STOP_WRAP = 3;        // Stop at 4 events
    ECap1Regs.ECCTL1.bit.CAP1POL = 1;          // Falling edge
    ECap1Regs.ECCTL1.bit.CAP2POL = 0;          // Rising edge
    ECap1Regs.ECCTL1.bit.CAP3POL = 1;          // Falling edge
    ECap1Regs.ECCTL1.bit.CAP4POL = 0;          // Rising edge
    ECap1Regs.ECCTL1.bit.CTRRST1 = 1;          // Difference operation
    ECap1Regs.ECCTL1.bit.CTRRST2 = 1;          // Difference operation
    ECap1Regs.ECCTL1.bit.CTRRST3 = 1;          // Difference operation
    ECap1Regs.ECCTL1.bit.CTRRST4 = 1;          // Difference operation
    ECap1Regs.ECCTL2.bit.SYNCI_EN = 1;         // Enable sync in
    ECap1Regs.ECCTL2.bit.SYNCO_SEL = 0;        // Pass through
    ECap1Regs.ECCTL1.bit.CAPLDEN = 1;          // Enable capture units

    ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1;        // Start Counter
    ECap1Regs.ECCTL2.bit.REARM = 1;            // arm one-shot
    ECap1Regs.ECCTL1.bit.CAPLDEN = 1;          // Enable CAP1-CAP4 register loads
    ECap1Regs.ECEINT.bit.CEVT1 = 1;            // 2 events = __interrupt
    ECap1Regs.ECEINT.bit.CEVT2 = 1;            // 4 events = __interrupt
    ECap1Regs.ECEINT.bit.CEVT3 = 1;            // 2 events = __interrupt
    ECap1Regs.ECEINT.bit.CEVT4 = 1;            // 4 events = __interrupt
xINT配置如下:

    // Initialize xINT2
    XintRegs.XINT2CR.bit.ENABLE=1;//enable xint2
    XintRegs.XINT2CR.bit.POLARITY=3;// Interrupt is selected as positive or negative edge triggered
    // Initialize xINT3
    XintRegs.XINT3CR.bit.ENABLE=1;//enable xint3
    XintRegs.XINT3CR.bit.POLARITY=3;// Interrupt is selected as positive or negative edge triggered
    // Initialize xINT4
    XintRegs.XINT4CR.bit.ENABLE=1;//enable xint4
    XintRegs.XINT4CR.bit.POLARITY=3;// Interrupt is selected as positive or negative edge triggered
    // Initialize xINT5
    XintRegs.XINT5CR.bit.ENABLE=1;//enable xint5
    XintRegs.XINT5CR.bit.POLARITY=3;// Interrupt is selected as positive or negative edge triggered

eCAP ISR程序如下(电机1与电机2的速度计算方法相同):

    Period = ECap1Regs.CAP1 + ECap1Regs.CAP2 + ECap1Regs.CAP3 + ECap1Regs.CAP4;
    BldcA_Speed = 12000000000 / Period ;    //caculate speed
    ECap1Regs.ECCLR.all = 0xFFFF;    //Clear eCap event flag
    ECap2Regs.ECCLR.all = 0xFFFF;    //Clear eCap event flag
    ECap3Regs.ECCLR.all = 0xFFFF;    //Clear eCap event flag
    motor_sensor(Direction,BLDCA);
    // Acknowledge this interrupt to receive more interrupts from group 4
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;

xINT ISR程序如下(电机3与电机4的速度计算方法相同):

    BldcC_trigger_count++;
    if(BldcC_trigger_count == 12)
    {
        BldcC_trigger_count = 0;
        Period = 200000000 - (Uint32)CpuTimer0Regs.TIM.all;
        BldcC_Speed = 12000000000 / Period;    //caculate speed
        CpuTimer0Regs.TCR.bit.TRB = 1;
    }
    motor_sensor(Direction,BLDCC);
    // Acknowledge this interrupt to receive more interrupts from group 1
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

开始测试:

采用CPU1进行控制未使用CPU2。

当单路电机运行时,电机运行平顺,工作正常,速度计算准确。

当4路电机同时运行时,电机运行平顺,工作正常,使用CPUTimer0~1功能计算的速度值准确,使用eCAP的Time-Stamp功能计算的速度值出现无规则跳变。

之后经过测试发现,如果第3路电机无HALL信号(即不产生xINT2中断),第1、2、4路电机运行平顺,工作正常,速度计算准确。Time-Stamp的数值变化不大(可忽略)。

当第3路电机产生连续的HALL信号(转动)时,例如:Time-Stamp的ECap1Regs.CAP1值会变小但无序(时大时小),因此导致速度值计算错误,结果是正常速度值1倍多到几倍之间变化。

xINT3~5中断则不影响eCAP的Time-Stamp功能。

已知中断优先级为xINT2 > eCAP1~6 > xINT3~5

采用CPU1与CPU2同时进行控制。

CPU1控制电机1、2、4(CPU2PIE中的xINT2不使能,仅通过XBar将中断信号配置到input5中,配置方法如下)

InputXbarRegs.INPUT5SELECT = 109;

CPU2控制电机3(CPU2PIE中的xINT2使能)

运行CPU1端程序,电机运行平顺,工作正常,速度计算准确。

再运行CPU2端程序,电机运行平顺,工作正常,使用CPU2.Timer0功能计算的速度值准确,使用eCAP的Time-Stamp功能计算的速度值出现无规则跳变。

单核控制与双核控制,问题都存在。请问当xINT2产生中断时,对eCAP的Time-Stamp有什么影响?为什么会出现这些(以上)影响?如何避免这样的问题?