工具/软件:
您好:
我使用带 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;
}







