Thread 中讨论的其他器件:controlSUITE
工具/软件:Code Composer Studio
你好!μ A
1、我使用F23379D伺服代码(路径:C:\ti\controlSUITE\development_kits\TMDSIDDK_v2.0\IDDK_PM_Servo_F2837x_v2_00_00_00),PWM输出是高电平输出(配置:(* ePWM[chanel]).DBCTL.bit.POLSEL = DB_ACTV_HIC;),使用SD μ A CURRENT_SENSE才电流模式,电机可以正常运行,电流采样是正确的;当电机不接电机时,电流采样是0;μ F
2、由于换成新板子,需要将输出PWM逻辑改成低电平有效(配置:(* ePWM[通道]).DBCTL.bit.POLSEL = DB_ACTV_LOC;;),使用SD Ω 电流 SENSE采电流模式,当电机不接电机时,能采到电流,但是电流采样不是0,采集到的电流有较大跳变现象,所以怀疑SDFM才电流与PWM输出没有同步,该如何改动?Ω
3、以下代码是原来PWM高电平输出,正确代码,标记处是修改位置,请问还有哪里需要改动?μ A
代码如下:μ A
(__LW_AT__注:原来是DB ACTV_ HIC高电平输出有效,现在改成DB ACTV_ LOC电平输出有效)
void HS_PWM_Int ()
{
volatile Int16 temp;
//初始化 PWM 模块 初始化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时钟设置=================================================
同步SD滤波 PWMChanelUpCntCnf (11、INV_PWM_TICKs);//μ s
//将2和3配置为从器件
/*========================= 估计是电流采样同步使用================================================= *
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;//同步输出选择 μ s
EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE;//相加载使能
EPwm2Regs.TBPHS.bit.TBPHS = 2;相位偏移寄存器 μ s
EPwm2Regs.TBCTL.bit.PHSDIR = TB_UP;//相位方向 μ s
EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
EPwm3Regs.TBCTL.bit.PHSEN = TB_ENABLE;//相加载使能
EPwm3Regs.TBPHS.bit.TBPHS = 2;相位偏移寄存器 μ s
EPwm3Regs.TBCTL.bit.PHSDIR = TB_UP;//相位方向 μ s
//================================ Sigma同步=================================================
EPwm4Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;// Sigma接口 μ s
//================================ 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();// C相PWM管
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 编码器
AbsEncoderInit();
// 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[chanel]).AQCTLA.bit.CAU = AQ_CLEAR;//向上比较
(* ePWM[chanel]).AQCTLA.bit.CAD = AQ_SET;//向下比较
//高电平有效互补 PWM -设置死区设置死区
(* ePWM[chanel]).DBCTL.bit.in_mode = DBA_ALL;//死区输入选择模式控制
(* ePWM[chanel]).DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;//死区输出模式控制
(* ePWM[chanel]).DBCTL.bit.POLSEL = DB_ACTV_LOC;//DB_ACTV_HIC;(注:原来是DB ACTV_HIC高电平输出有效,现在改成DB LOC电平输出有效)ACTV_ACTV_M Ω
(* ePWM[通道]).DBRED.ALL =死区;//死区发生器上升沿延时计数寄存器设置上升沿死区
(* ePWM[chanel]).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[chanel]).TBCTL.bit.PHSEN = TB_DISABLE;//相负载使
(* ePWM[chanel]).TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;//同步"下流"同步输出选择
//计数器比较子模块寄存器比较寄存器计数器模块
(* ePWM[通道]).cmpa.bit.cmpA = 0;//初始设置占空比0%设置初始化占空比0
(* ePWM[chanel]).cmPCTL.bit.SHDWAMODE = CC_SHADOW;//比较寄存器块操作模式
(* ePWM[通道]).cmPCTL.bit.LOADAMODE = CC_CTR_ZERO;
//操作限定符子模块寄存器
(* ePWM[chanel]).AQCTLA.bit.CAU = AQ_CLEAR;//比较器A寄存器向上计数
(* ePWM[chanel]).AQCTLA.bit.ZRO = AQ_SET;//动作计数器为零
//高电平有效互补 PWM -设置死区设置死区
(* ePWM[通道]).DBCTL.bit.in_mode = DBA_ALL;
(* ePWM[通道]).DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;
(* ePWM[chanel]).DBCTL.bit.POLSEL = DB_ACTV_LOC;//DB_ACTV_HIC;(__LW_AT__注:原来是DB ACTV_HIC高电平输出有效,现在改成DB LOC电平输出有效)ACTV_ACTV_M Ω
(* ePWM[死区发生器上升沿通道]).DBRED.ALL = 0;//μ s
(* ePWM[死区发生器下降沿通道]).DBFED.ALL = 0;//μ s
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 在此结束
以上是配置PWM和Sigmadelt 同步采样电流;由于原来输出PWM都是高有效;现在改成低有效后,Σ-Δ 滤波器模块 采样电流就与PWM不同步了,不知道如何改,才可以同步采电流?多谢!