大家好、如下图所示、在我的其中一个三相电机控制应用中、我需要在保持占空比的同时、在一个 PWM 周期内将一相 PWM 从脉冲一次更改为两次 (其优点是可以在高调制比下降低电机定子电流的谐波)。
因此、我将需要两次脉冲的 PWM 定义为 mode4、仅脉冲 一次的 PWM 定义为 mode3、并使用函数 my_pwmB ()在下一个控制周期中更新三相 PWM 的 TBPRD、CMPA、CMPB 和 AQCTLA。
下面是 my_pwmB()函数的细节以及 mode3和 mode4这两种发射状态的示意图。
/********************************* my PWM for DSP 28388 ***************************************/ // Explanations to array d for ePWM // d=[TPRD,duty[6],Mode(3)] // TPRD: PWM period in second (s) // dABC: [dA,dA0,dB,dB0,dC,dC0], dA indicates EPwm1Regs.CMPB.bit.CMPB, dA0 indicates EPwm1Regs.CMPA.bit.CMPA (0~1) // Mode: 3: pulse once, 4: pulse twice /********************************* my PWM for DSP 28388 ***************************************/ void my_pwmB(real32_T *d) { uint16_T mode, i, *ePWM1Addr; uint16_T TPRD, dA, dA0; TPRD = (uint16_T) *(d+0); EPwm1Regs.TBPRD = TPRD; EPwm2Regs.TBPRD = TPRD; EPwm3Regs.TBPRD = TPRD; ePWM1Addr=(uint16_T *) (0x406B); // Initial address for EPwm1Regs.CMPA.half.CMPA for (i=0;i<3;i++) // correspond to Phase a, b, c { mode=(uint16_T) (*(d+7+i)); dA=(uint16_T) (*(d+2*i+1) * TPRD); // for CMPB dA0=(uint16_T) (*(d+2*i+2) * TPRD); // for CMPA *(ePWM1Addr+i*0x100+2) = dA; // write EPwmiRegs.CMPB.bit.CMPB *(ePWM1Addr+i*0x100) = dA0; // write EPwmiRegs.CMPA.bit.CMPA if (dA==TPRD) // 0% *(ePWM1Addr+i*0x100-0x2B) = 0x1; // CBD (00) CBU (00) CAD (00) CAU (00) PRD (00) ZERO clear (01) [CBD CBU CAD CAU PRD ZRO] else if (dA==0) // 100% *(ePWM1Addr+i*0x100-0x2B) = 0x2; // CBD (00) CBU (00) CAD (00) CAU (00) PRD (00) ZERO set (10) [CBD CBU CAD CAU PRD ZRO] else { if (mode==3) // mode=3, (0--->1--->0) *(ePWM1Addr+i*0x100-0x2B) = 0x601; // CBD clear (01) CBU set (10) CAD (00) CAU (00) PRD (00) ZERO clear (01) [CBD CBU CAD CAU PRD ZRO] else if (dA==dA0) // mode=4 && CMPA==CMPB (0%, When CMPB=CMPA, CMPA is invalid) *(ePWM1Addr+i*0x100-0x2B) = 0x1; // CBD (00) CBU (00) CAD (00) CAU (00) PRD (00) ZERO clear (01) [CBD CBU CAD CAU PRD ZRO] else // mode=4 && CMPA!=CMPB (0--->1--->0--->1--->0) *(ePWM1Addr+i*0x100-0x2B) = 0x691; // CBD clear (01) CBU set (10) CAD set (10) CAU clear (01) ZERO clear (01) [CBD CBU CAD CAU PRD ZRO] } } }
但在实际的闭环电机运行中、我发现 PWM 中存在一些单独周期、它们的作用与我给定的不符。 在示波器的屏幕截图中、 CH1_1、CH1_2、CH2_1分别对应于 PWM1A、PWM2A、PWM3A;CH2_2表示 PWM1A 的模式、低电平表示模式3、高电平表示模式4; CH4_1表示 EPwm1Regs.CMPB.bit.CMPB 的值、0V 表示 CMPB 为0、4.5V 表示 CMPB 的值等于 PRD (PRD=10000、PWM 时钟频率为100MHz)、类似地、CH4_2表示 EPwm1Regs.CMPA.bit.CMPA 的值;CH3_1表示电机定子电流。
我将 DA 输出放在 ADC 中断的开头、因此示波器屏幕截图中的 PWM 和 DA 输出之间没有一步式延迟。
您可以看到红色框中的 PWM 波形1和3属于 Mode4、但它们不会两次产生脉冲。
我还将样本触发器的时序从 CTR=ZRO 更改为 CTR=PRD、但下面示波器屏幕截图红色框中的 PWM 也属于 Mode4、但仅产生一次脉冲。 请注意、与 PWM 波形相比、屏幕截图中的 DA 输出波形将具有半周期延迟、因为此处修改了 ADC 采样时间。
我正在尝试了解发生这种情况的原因、 您会不会介意给我一些建议以供参考。
此致,
朱