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;
}







