工具/软件:Code Composer Studio
你好!μ A
1、我使用 f23379d 伺服代码( path:C:\ti\controlSUITE\development_kits\TMDSIDDK_v2.0\IDDK_PM_Servo_F2837x_v2_00_00_00), PWM 输出为高电平输出(configure:(* ePWM[chanel]).DBCTL.bit.POL_00_00_00_00 ),通常情况下、PWM 输出为高电流输出,配置 ACSD_MOBIT_SEND 电流采样仅运行电流模式。 ;电机未连接到电机、则电流样本为0 μ A
2、作为一个新的电路板、我需要将输出 PWM 逻辑更改为低电平有效(配置:(* ePWM[chanel]).DBCTL.bit.POLSEL = DB_ACTV_LOC;),使用 SD_CURRENT_SENSE 电流模式时、当新电路板 未与电机连接时、可被视为电流、 但电流采样不是0,在模拟模式 下 ,我 发现电流大跳变现象, 我判断 SDFM 电流采样不与 PWM 同步。 如何同步更改? 您能帮我解决吗、谢谢!
3、以下代码是 PWM 高电平输出、SDFM 电流采样和 PWM 同步、验证是否正常;现在、我要更改为 PWM 低电平、SDFM 电流采样和 PWM 同步、需要在哪里更改?
该代码的读数如下::
(__LW_AT__注释:原始为 db_actv_hic 高电平输出有效、现在我想更改为 db_actv_loc 电平输出有效、我发现当前采样不正确。)
void HS_PWM_Int ()
{
volatile Int16 temp;
//初始化 PWM 模块
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=0;//
HS_PWMChanelUpDwnCntCnf (1、INV_PWM_TICKs、200);
HS_PWMChanelUpDwnCntCnf (2、INV_PWM_TICKs、200);
HS_PWMChanelUpDwnCntCnf (3、INV_PWM_TICKs、200);
HS_PWMChanelUpCntCnf (4、SDFM_TICKs);//Sigma
EPwm4Regs.CMPA.bit.CMPA=EPwm4Regs.TBPRD>>1;
//
//PWM 11、用于将 SD 滤波器窗口与电机控制 PWM 同步
//
//================================ sd ================================================================
HS_PWMChanelUpCntCnf (11、INV_PWM_TICKs);
//将2和3配置为从器件
/*========================= ======================================================================== *
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE;//
EPwm2Regs.TBPHS.bit.TBPHS = 2;//
EPwm2Regs.TBCTL.bit.PHSDIR = TB_UP;//
EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
EPwm3Regs.TBCTL.bit.PHSEN = TB_ENABLE;//
EPwm3Regs.TBPHS.bit.TBPHS = 2;//
EPwm3Regs.TBCTL.bit.PHSDIR = TB_UP;//
//================================ sigma ================================================================
EPwm4Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;//Sigma
//================================ EPWM11 SD ================================================================
EPwm11Regs.TBCTL.bit.PHSEN = TB_ENABLE;//SD
EPwm11Regs.TBPHS.bit.TBPHS = 2;
EPwm11Regs.TBCTL.bit.PHSDIR = TB_UP;
EPwm11Regs.CMPC = EPwm11Regs.TBPRD - SDFM_TICK*(OSR_RATE + 1)* 3/2;/
EPwm11Regs.CMPA.bit.CMPA =(SDFM_TICK*(OSR_RATE + 1)*3/2)+ 500;// 500是任意的
EPwm11Regs.CMPD = 0;
//
//为 PWM 功能设置 GPIO
/********
InitEPwm1Gpio();//
InitEPwm2Gpio();//
InitEPwm3Gpio();
InitEPwm4Gpio();//clk 用于 Sigma Delta
EDIS;
EALLOW;
EPwm11Regs.ETSEL.bit.INTSEL=ET_CTRL_CMPA;
EPwm11Regs.ETSEL.bit.INTEN = 1;//启用 INT EPWMxINTn
EPwm11Regs.ETPS.bit.INTPRD = et_1st;
EDIS;
PhaseCurrentHwInit();/
BusVoltageDetectInit();//
init_Val ();
// TODO 反馈偏移校准例程
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;
EDIS;
OFFSET_SDFM1 = 0;
OFFSET_SDFM2 = 0;
对于(OffsetCalCounter=0;OffsetCalCounter<20000;)
{
if (EPwm11Regs.ETFlG.bit.INT==1)//
{
if (OffsetCalCounter>1000)
{
OFFSET_SDFM1 = K1*OFFSET_SDFM1 + K2*(temp=SDFM1_READ_filter1_DATA_16BIT)*SD_pu_SCALE_FACTOR;
OFFSET_SDFM2 = K1*OFFSET_SDFM2 + K2*(temp=SDFM1_READ_FILTER2_DATA_16BIT)*SD_pu_SCALE_FACTOR;
}
EPwm11Regs.ETCLR.bit.INT=1;
OffsetCalCounter++;
}
}
//TODO ISR 映射
秘书长的报告
秘书长的报告
EALLOW;
//PWM11 INT 用于触发电机控制 ISR
EPwm11Regs.ETSEL.bit.INTSEL = ET_CTRL_CMPA;
EPwm11Regs.ETSEL.bit.INTEN = 1;//启用 INT
EPwm11Regs.ETPS.bit.INTPRD = et_1st;//在每个事件上生成 INT
PieVectTable.EPWM11_INT =&MotorControlISR;
PieCtrlRegs.PIEIER3.bit.INTx11 = 1;//在 PIE 组3中启用 PWM11INT
EPwm11Regs.ETCLR.bit.INT=1;
IER = 0x185;
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM
EDIS;
}
//====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//todo
void HS_PWMChanelUpDwnCntCnf (uint16 chanel、uint16 period、uint16 dead_band)
{
EALLOW;
//时基子模块寄存器
(* ePWM[chanel]).TBCTL.bit.PRDLD = TB_Immediate;//设置立即加载
(* ePWM[通道]).TBPRD =周期/ 2;// PWM 频率= 1/周期
(* ePWM[通道]).TBPHS.bit.TBPHS = 0;//设置时基相位高电平
(* ePWM[通道]).TBCTR = 0;//时基计数器
(* ePWM[通道]).TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
(* ePWM[通道]).TBCTL.bit.HSPCLKDIV = TB_DIV1;
(* ePWM[通道]).TBCTL.bit.CLKDIV = TB_DIV1;
(* ePWM[通道]).TBCTL.bit.PHSEN = TB_DISABLE;
(* ePWM[chanel]).TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;//同步"下流"
//计数器比较子模块寄存器
(* ePWM[通道]).cmpa.bit.cmpA = 0;//初始设置占空比0%
(* ePWM[通道]).cmPCTL.bit.SHDWAMODE = CC_SHADOW;
(* ePWM[通道]).cmPCTL.bit.LOADAMODE = CC_CTR_ZERO;
//操作限定符子模块寄存器
(* ePWM[通道]).AQCTLA.bit.CAU = AQ_CLEAR;
(* ePWM[通道]).AQCTLA.bit.CAD = AQ_SET;
//高电平有效互补 PWM -设置死区
(* ePWM[通道]).DBCTL.bit.in_mode = DBA_ALL;
(* ePWM[chanel]).DBCTL.bit.out_mode = DB_full_enable;//
(* ePWM[通道]).DBCTL.bit.POLSEL = DB_ACTV_HIC;
(* ePWM[通道]).DBRED.ALL =死区;//
(* ePWM[通道]).DBFED.ALL =死区;//
EDIS;
}
//todo
空 HS_PWMChanelUpCntCnf (uint16 chanel、uint16 period)
{
EALLOW;
//时基子模块寄存器
(* ePWM[chanel]).TBCTL.bit.PRDLD = TB_Immediate;//设置立即加载
(* ePWM[通道]).TBPRD =周期-1;// PWM 频率= 1/周期
(* ePWM[通道]).TBPHS.bit.TBPHS = 0;
(* ePWM[通道]).TBCTR = 0;
(* ePWM[通道]).TBCTL.bit.CTRMODE = TB_COUNT_UP;
(* ePWM[通道]).TBCTL.bit.HSPCLKDIV = TB_DIV1;
(* ePWM[通道]).TBCTL.bit.CLKDIV = TB_DIV1;
(* ePWM[通道]).TBCTL.bit.PHSEN = TB_DISABLE;//
(* ePWM[chanel]).TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;//同步"下流"
//计数器比较子模块寄存器
(* ePWM[通道]).cmpa.bit.cmpA = 0;//初始设置占空比0%
(* ePWM[通道]).cmPCTL.bit.SHDWAMODE = CC_SHADOD;//
(* ePWM[通道]).cmPCTL.bit.LOADAMODE = CC_CTR_ZERO;
//操作限定符子模块寄存器
(* ePWM[通道]).AQCTLA.bit.CAU = AQ_CLEAR;//
(* ePWM[通道]).AQCTLA.bit.ZRO = AQ_SET;//
//高电平有效互补 PWM -设置死区
(* ePWM[通道]).DBCTL.bit.in_mode = DBA_ALL;
(* ePWM[通道]).DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;
(* ePWM[通道]).DBCTL.bit.POLSEL = DB_ACTV_HIC;
(* ePWM[通道]).DBRED.ALL = 0;//
(* ePWM[通道]).DBFED.ALL = 0;//
EDIS;
}
//TODO 电机控制 ISR
中断空 MotorControlISR (空)
{
GPIO_WritePin (59、0);
EINT;
MotorControl_ISR ();
//DX DLOG_4ch_F_FUNC (&dlog_4ch1);
EPwm11Regs.ETCLR.bit.INT = 1;
PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;
GPIO_WritePin (59、1);
}// MainISR 在此结束