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**** 2538950 points
Other Parts Discussed in Thread: CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/601630/ccs-tms320f28379d-f28379d-servo-development-board-pwm-and-sdfm-synchronous-current-sampling-problem

器件型号:TMS320F28379D

工具/软件: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 在此结束