Tool/software:
Hello,
I am utilizing a 56 pin F28035 with ePWM to move a servo motor. Randomly, the servo motor will start buzzing/stuttering at certain points in its traversal. I am posting the code and a video to show what is happening. I have tried utilizing different frequencies between 50Hz to 333Hz, but the same behavior arises. For reference, the servo utilizes 333Hz. Are there any settings I should look to change or any register behavior I should look for? Normally, we use the 80 pin variant of the F28035, and buzzing does not happen as often. Thank you.
// // 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; }