This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TMS320F28379D:F28379D 伺服开发板 PWM与SDFM同步电流采样问题

Guru**** 2511985 points
Other Parts Discussed in Thread: CONTROLSUITE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/601409/ccs-tms320f28379d-f28379d-pwm-sdfm

器件型号:TMS320F28379D
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不同步了,不知道如何改,才可以同步采电流?多谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    本论坛仅支持英文,如果你更想使用中文提问,请将问题发布到中文版本论坛http://www.deyisupport.com/

    肖恩