工具/软件:
您好:
我使用带 ePWM 的56引脚 F28035来移动伺服电机。 随机地、伺服电机将在其遍历的某些点开始嗡嗡声/卡顿。 我发布了代码和视频来展示发生了什么。 我已经尝试使用不同的频率之间的50Hz 到333Hz ,但同样的行为出现。 作为参考、伺服电路使用333Hz。 是否应该查找任何要更改的设置或任何应该查找的寄存器行为? 通常情况下、我们使用 F28035的80引脚型号、这样不会经常出现嗡嗡声。 谢谢你。
// // Included Files // #include "DSP28x_Project.h" // Device Headerfile and Examples Include File Uint16 isrCntr = 0; Uint16 pos = 0; Uint16 dir = 0; __interrupt void pwm2Isr(void); // // Main // void main(void) { // // Step 1. Initialize System Control: // PLL, WatchDog, enable Peripheral Clocks // This example function is found in the DSP2803x_SysCtrl.c file. // InitSysCtrl(); InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitPieVectTable(); InitEPwm2Gpio(); EALLOW; GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 0; GpioCtrlRegs.GPADIR.bit.GPIO23 = 1; GpioDataRegs.GPACLEAR.bit.GPIO23 = 1; EDIS; EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; EDIS; // // Setup TBCLK // EPwm2Regs.TBSTS.all = 0; EPwm2Regs.TBPHS.half.TBPHS = 0; EPwm2Regs.TBCTR = 0; EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // Count up. EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Disable phase loading. EPwm2Regs.TBPHS.half.TBPHS = 0x0000; // Phase is 0. EPwm2Regs.TBCTR = 0x0000; // Clear counter. EPwm2Regs.TBCTL.bit.HSPCLKDIV = 0; // Clock ratio to SYSCLKOUT. EPwm2Regs.TBCTL.bit.CLKDIV = 6; // // Setup shadow register load on ZERO // EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // // Set actions // EPwm2Regs.AQCTLA.bit.ZRO = AQ_SET; // Set PWM2A on Zero EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR; // Clear PWM2A on event A, up count EPwm2Regs.ETSEL.bit.INTSEL = 2; EPwm2Regs.ETPS.all = 1; EPwm2Regs.TBCTL.bit.SYNCOSEL = 3; EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; EDIS; EALLOW; PieVectTable.EPWM2_INT = &pwm2Isr; EDIS; IER |= M_INT3; EINT; ERTM; PieCtrlRegs.PIEIER3.bit.INTx2 = 1; GpioDataRegs.GPASET.bit.GPIO23 = 1; EPwm2Regs.ETCLR.bit.INT = 1; EPwm2Regs.ETSEL.bit.INTEN = 1; EPwm2Regs.TBPRD = 2815; EPwm2Regs.CMPA.half.CMPA = 1407; pos = 1407; while (1) {} } __interrupt void pwm2Isr(void) { if (pos < 1642 && dir == 0) { EPwm2Regs.CMPA.half.CMPA = pos++; } else if (pos == 1642) { isrCntr++; if (isrCntr > 1000) { isrCntr = 0; dir = 1; EPwm2Regs.CMPA.half.CMPA = pos--; } } else if (pos > 1172 && dir == 1) { EPwm2Regs.CMPA.half.CMPA = pos--; } else if (pos == 1172) { isrCntr++; if (isrCntr > 1000) { dir = 0; isrCntr = 0; } } EPwm2Regs.ETCLR.bit.INT = 1; PieCtrlRegs.PIEACK.all = PIEACK_GROUP3; }