本帖最后由 一只耳朵怪 于 2018-6-14 10:34 编辑
各位好:
我使用
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.RE
ARM= 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有什么影响?为什么会出现这些(以上)影响?如何避免这样的问题?
0