我尝试使用 PWM 6、7、8。
PWM6和 PWM7的标称运行频率为125000Hz、PWM8的运行频率为4倍 PWM6和 PWM7。 这是一个使用 HR 周期控制的变频应用。
PWM 8是 ADC 的触发器、需要与 PWM6和 PWM7进行相位同步。
每次我更改所有3个 PWM 的频率时、我都会松开从 PWM8到 PWM6和 PWM7的相位同步。 某些频率会导致 PWM6、PWM7和 PWM8相位对齐、但大多数频率不会对齐。
我是在更改频率时出现问题还是初始化问题?
下面是我的频率设置代码、后跟 PWM 初始化:
#define resono_PWM_Left EPwm6Regs
#define resono_PWM_RIGHT EPwm7Regs
#define ADC_PWM EPwm8Regs
void H_BRIDGE_FREQUENCY 寄存器(uint32_t freq)
{
uint32_t 整数;
uint32_t frac;
uint32_t 周期;
uint32_t ADC_PERIOD = 0;
float freq_f = freq;
if (freq >= 10000 && freq <= 320000)
{
//将频率转换为周期
周期= 2560000.0/freq_f;
//计算周期并除以4以 ADC 采样频率
ADC_PERIOD =(周期>> 2);
整数=(ADC_PERIOD >> 8);
//屏蔽小数
FRAC =(ADC_PERIOD & 0xFF);
//将 ADC 频率设置为4倍 PWM 周期
ADC_PWM.TBPRD =整数-1;
ADC_PWM.TBPRDHR =(FRAC << 8);
FRAC =(周期和0xFF);
整数=(周期>> 8);
//设置 PWM 频率
reson_PWM_LEFT.TBPRD =整数-1;
RESACON_PWM_LEFT.TBPRDHR =(FRAC << 8);
resono_PWM_right.TBPRD =整数-1;
RESACON_PWM_RIGHT。TBPRDHR =(FRAC << 8);
}
}
void reson_left_pwm_setup (void)
{
int period = 800;
reson_PWM_LEFT.TBCTL.bit.PRDLD = TB_SHADOW;//设置影子负载
resono_PWM_LEFT.TBCTL.bit.PHSEN = 0;
RESONACT_PWM_LEFT.TBPRD =周期-1;// PWM 频率= 1/(2 * TBPRD)
reson_PWM_LEFT.CMPA.bit.CMPA =周期/ 2;//初始设置占空比50%
reson_PWM_LEFT.CMPA.bit.CMPAHR =(1 << 8);//初始化 HRPWM 扩展
reson_PWM_LEFT.CMPB.bit.CMPB =周期/ 2;//初始设置占空比50%
reson_PWM_LEFT.CMPB.ALL |= 1;
RESONACE_PWM_LEFT.TBPHS.ALL = 0;
RESOON_PWM_LEFT.TBCTR = 0;
reson_PWM_LEFT.TBCTL.bit.CTRMODE = TB_COUNT_UP;//选择向上计数模式
reson_PWM_LEFT.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
resony_PWM_LEFT.TBCTL.bit.HSPCLKDIV = TB_DIV1;
RESACON_PWM_LEFT.TBCTL.bit.CLKDIV = TB_DIV1;// TBCLK = SYSCLKOUT
reson_PWM_LEFT.TBCTL.bit.free_soft = 11;
resocon_PWM_LEFT.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;//在 CTR = 0上加载 CMPA
reson_PWM_LEFT.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
resocon_PWM_LEFT.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
reson_PWM_LEFT.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
reson_PWM_LEFT.AQCTLA.bit.ZRO = AQ_SET;// PWM 切换高电平/低电平
reson_PWM_LEFT.AQCTLA.bit.CAU = AQ_CLEAR;
reson_PWM_LEFT.AQCTLB.bit.ZRO = AQ_SET;// PWM 切换高电平/低电平
reson_PWM_LEFT.AQCTLB.bit.CBU = AQ_CLEAR;
reson_PWM_LEFT.DBCTL.bit.out_mode = DB_full_enable;//启用死区模块
resony_PWM_LEFT.DBCTL.bit.POLSEL = DB_ACTV_HIC;//活动高电平互补
reson_PWM_LEFT.DBCTL.bit.in_mode = DBA_ALL;// EPWM1A 是两种延迟的源
reson_PWM_LEFT.DBFED.bit.DBFED = 10;
reson_PWM_LEFT.DBRED.bit.DBRED = 10;
EALLOW;
resono_PWM_LEFT.HRCNFG.ALL = 0x0;
reson_PWM_LEFT.HRCNFG.bit.EDGMODE = HR_BEP;// 在两个边沿上进行 MEP 控制。
RESACON_PWM_LEFT.HRCNFG.bit.CTLMODE = HR_CMP;// CMPAHR 和 TBPRDHR 控制。
reson_PWM_LEFT.HRCNFG.bit.HRLOAD = HR_CTR_ZERO;// CTR 上的负载= 0 且 CTR = TBPRD
reson_PWM_LEFT.HRCNFG.bit.EDGMODEB = HR_BEP;// 在两个边沿上进行 MEP 控制
RESACON_PWM_LEFT.HRCNFG.bit.CTLMODEB = HR_CMP;// CMPBHR 和 TBPRDHR HR 控制
reson_PWM_LEFT.HRCNFG.bit.HRLOADB = HR_CTR_ZERO;// CTR 上的负载= 0 且 CTR = TBPRD
reson_PWM_LEFT.HRCNFG.bit.AUTOCONV = 1;//启用 HR 周期的自动转换
//reson_PWM_LEFT.HRPCTL.bit.TBPHSHRLOADE = 1;//启用 TBPHSHR 同步 (对于上数 HR 控制是必需的)
resono_PWM_LEFT.HRPCTL.bit.HRPE = 1;//打开高分辨 率周期控制。
EDIS;
}
void reson_right_pwm_setup (void)
{
int period = 800;
resono_PWM_right.TBCTL.bit.PRDLD = TB_SHADOW;//设置影子负载
resono_PWM_right.TBCTL.bit.PHSEN = TB_ENABLE;
RESONACE_PWM_RIGHT。TBPRD =周期-1;// PWM 频率= 1/(2 * TBPRD)
reson_PWM_right.cmpa.bit.cmpA =周期/ 2;//初始设置占空比50%
reson_PWM_right.cmpa.bit.cmpaHR =(1 << 8);//初始化 HRPWM 扩展
reson_PWM_right.CMPB.bit.CMPB =周期/ 2;//初始设置占空比50%
resono_PWM_right.CMPB.all |= 1;
RESONACE_PWM_RIGHT TBPHS.ALL = 0;
RESOON_PWM_RIGHT。TBCTR = 0;
reson_PWM_right.TBCTL.bit.CTRMODE = TB_COUNT_UP;//选择向上 计数模式
resono_PWM_right.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
RESACON_PWM_RIGHT。TBCTL.bit.HSPCLKDIV = TB_DIV1;
RESACON_PWM_RIV.TBCTL.BIT.CLKDIV = TB_DIV1;// TBCLK = SYSCLKOUT
resono_PWM_right.TBCTL.bit.free_soft = 11;
resocon_PWM_right.cmPCTL.bit.LOADAMODE = CC_CTR_ZERO;//在 CTR = 0上加载 CMPA
resono_PWM_right.cmPCTL.bit.LOADBMODE = CC_CTR_ZERO;
resocon_PWM_right.cmPCTL.bit.SHDWAMODE = CC_SHADOW;
resono_PWM_right.cmPCTL.bit.SHDWBMODE = CC_SHADOW;
resono_PWM_right.AQCTLA.bit.ZRO = AQ_CLEAR;// PWM 切换为高电平/低电平
resono_PWM_right.AQCTLA.bit.CAU = AQ_SET;
resono_PWM_right.AQCTLB.bit.ZRO = AQ_CLEAR;// PWM 切换为高电平/低电平
resono_PWM_right.AQCTLB.bit.CBU = AQ_SET;
reson_PWM_right.DBCTL.bit.out_mode = DB_full_enable;//启用死区模块
resono_PWM_right.DBCTL.bit.POLSEL = DB_ACTV_HIC;//活动高电平互补
reson_PWM_right.DBCTL.bit.in_mode = DBA_ALL;// EPWM1A 是两种延迟的源
resono_PWM_right.DBFED.bit.DBFED = 10;
resono_PWM_right.DBRED.bit.DBRED = 10;
EALLOW;
resono_PWM_right.HRCNFG.all = 0x0;
resone_PWM_right.HRCNFG.bit.EDGMODE = HR_BEP;//两个边沿上的 MEP 控制。
RESACON_PWM_RIGHT。HRCNFG.bit.CTLMODE = HR_CMP;// CMPAHR 和 TBPRDHR 控制。
resono_PWM_right.HRCNFG.bit.HRLOAD = HR_CTR_ZERO;// CTR 上的负载= 0 且 CTR = TBPRD
resone_PWM_right.HRCNFG.bit.EDGMODEB = HR_BEP;// 两个边沿上的 MEP 控制
RESACON_PWM_RIGHT。HRCNFG.bit.CTLMODEB = HR_CMP;// CMPBHR 和 TBPRDHR HR 控制
resono_PWM_right.HRCNFG.bit.HRLOADB = HR_CTR_ZERO;// CTR 上的负载= 0 且 CTR = TBPRD
resono_PWM_right.HRCNFG.bit.AUTOCONV = 1;//启用 HR 周期的自动转换
RESACON_PWM_RIGHT。HRPCTL.BIT.TBPHSHRLOADE = 1;//启用 TBPHSHR 同步 (对于上数 HR 控制是必需的)
resono_PWM_right.HRPCTL.bit.HRPE = 1;//打开高分辨 率周期控制。
EDIS;
}
void ADC_PWM_setup (void)
{
int period = 200;
ADC_PWM.ETSEL.bit.SOCAEN = 0;//禁用组上的 SOC
ADC_PWM.ETSEL.bit.SOCASEL = 4;//在递增计数时选择 SOC
ADC_PWM.ETPS.bit.SOCAPRD = 1;//在发生第一个事件时生成脉冲
ADC_PWM.TBCTL.bit.PRDLD = TB_SHADOW;//设置影子加载
ADC_PWM.TBCTL.bit.PHSEN = TB_ENABLE;
ADC_PWM.TBPRD =周期-1;// PWM 频率= 1/(2*TBPRD)
ADC_PWM.CMPA.bit.CMPA =周期/ 2;//初始设置占空比50%
ADC_PWM.CMPA.bit.CMPAHR =(0 << 8);//初始化 HRPWM 扩展
ADC_PWM.CMPB.bit.CMPB =周期/ 2;//初始设置占空比50%
ADC_PWM.CMPB.ALL |= 1;
ADC_PWM.TBPHS.ALL = 0;
ADC_PWM.TBCTR = 0;
ADC_PWM.TBCTL.bit.CTRMODE = TB_COUNT_UP;//选择向上计数模式
ADC_PWM.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
ADC_PWM.TBCTL.bit.HSPCLKDIV = TB_DIV1;
ADC_PWM.TBCTL.bit.CLKDIV = TB_DIV1;// TBCLK = SYSCLKOUT
//EPwm4Regs.TBCTL.bit.free_soft = 11;
ADC_PWM.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;//在 CTR = 0上加载 CMPA
ADC_PWM.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
ADC_PWM.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
ADC_PWM.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
ADC_PWM.AQCTLA.bit.ZRO = AQ_SET;// PWM 切换为高电平/低电平
ADC_PWM.AQCTLA.bit.CAU = AQ_CLEAR;
ADC_PWM.AQCTLB.bit.ZRO = AQ_SET;// PWM 切换为高电平/低电平
ADC_PWM.AQCTLB.bit.CBU = AQ_CLEAR;
ADC_PWM.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;//启用死区模块
ADC_PWM.DBCTL.bit.POLSEL = DB_ACTV_HIC;//活动高电平互补
ADC_PWM.DBCTL.bit.IN_MODE = DBA_ALL;// EPWM1A 是两个延迟的源
//EPwm4Regs.DBFED.bit.DBFED = 10;
//EPwm4Regs.DBRED.bit.DBRED = 10;
EALLOW;
ADC_PWM.HRCNFG.ALL = 0x0;
ADC_PWM.HRCNFG.bit.EDGMODE = HR_BEP;//在 两个边沿上进行 MEP 控制。
ADC_PWM.HRCNFG.bit.CTLMODE = HR_CMP;// CMPAHR 和 TBPRDHR 控制。
ADC_PWM.HRCNFG.bit.HRLOAD = HR_CTR_ZERO;// CTR = 0 且 CTR = TBPRD 上的负载
ADC_PWM.HRCNFG.bit.EDGMODEB = HR_BEP;//在 两个边沿上进行 MEP 控制
ADC_PWM.HRCNFG.bit.CTLMODEB = HR_CMP;// CMPBHR 和 TBPRDHR 控制
ADC_PWM.HRCNFG.bit.HRLOADB = HR_CTR_ZERO;// CTR = 0 且 CTR = TBPRD 上的负载
ADC_PWM.HRCNFG.bit.AUTOCONV = 1;//启用 HR 周期的自动转换
ADC_PWM.HRPCTL.bit.TBPHSHRLOADE = 1;//启用 TBPHSHR 同步 (上数 HR 控制需要)
ADC_PWM.HRPCTL.bit.HRPE = 1;//开启高分辨 率周期控制。
//ADC_PWM.TBCTL.bit.SWFSYNC = 1;
EDIS;
}