创建工程
app
cmd
FLASH
include
RAM
source
targetConfigs
user
GPIO
控制寄存器GpioCtrlRegs
输入/输出 GPBDIR
复用(复用表)GPAGMUX1
功能 GPBPUD上拉/
数据寄存器GpioDataRegs
上下拉 GPASET/GPACLEAR
Interrupts--CPUTimer
// 中断声明
__interrupt void CPUTIMER0_ISR(void);
{
InitCpuTimers(); // 初始化
// 中断注册
EALLOW;
PieVectTable.TIMER0_INT = &CPUTIMER0_ISR;
PieVectTable.EPWM1_INT = &EPWM1_CONFIG;
EDIS;
Timer0Init(100, 1000); // 自定义初始化
// 选择中断向量表
PieCtrlRegs.PIEIER1.bit.INTx7 = 1; // X选中(Cpu定时器)
IER |= M_INT1; // Y选中(Cpu定时器)
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // 没有这句,进不去中断
}
// 中断函数
__interrupt void CPUTIMER0_ISR(void)
{
flag_1ms = 1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // 一定要清除应答
}
EPWM
初始化前需要失能时基,初始化后需要使能时基(CpuSysRegs.PCLKCR0.bit.TBCLKSYNC)
TB寄存器
基础的同步/计数值/使能/模式/分频设置
CC寄存器
影子寄存器,RUN过程中可加载TBR
AQ寄存器
计数形式
DB寄存器
死区控制
HRPWM
工作原理:MEP
大刻度划分小刻度(与STM32的HRTIM不一样)

在EPWM的基础上多三个寄存器配置
HRCNFC寄存器
LOAD与EPWM的CC寄存器保持一致;控制模式&边缘模式与TB寄存器保持一致;AUTOCONV校准
HRCTL寄存器
失能/使能(使能HRTIM后CTRMODE不能用UP/DOWN计数)
HRCNFC2寄存器
CTLMODEBFED&CTLMODEBRED与CC寄存器LOADxMODE保持一致
EDGMODEDB与TB寄存器CTRMODE保持一致
DBFEDHR&DBREDHR与DB寄存器的DBFED&DBRED保持一致
HRPWM_CPM_Set
void HRPWM1_CPM_Set(Uint32 val)
{
Uint32 temp,temp1;
Uint16 CMPA_reg_val;
Uint16 CMPAHR_reg_val;
Uint16 CMPB_reg_val;
Uint16 CMPBHR_reg_val;
// Q15格式 最大为0x7FDF 0~327668 0~100
CMPA_reg_val = ((long)val * ((EPwm1Regs.TBPRD+1))) >> 15;
CMPB_reg_val = ((long)val * ((EPwm1Regs.TBPRD+1))) >> 15;
temp = ((long)val * ((EPwm1Regs.TBPRD+1)));
temp1 = ((long)val * ((EPwm1Regs.TBPRD+1)));
temp = temp - ((long)CMPA_reg_val << 15);
temp1 = temp1 - ((long)CMPA_reg_val << 15);
#if (AUTOCONVERT)
CMPAHR_reg_val = temp << 1; // convert to Q16
CMPBHR_reg_val = temp << 1; // convert to Q16
#else
CMPA_reg_val = ((temp * MEP_ScaleFactor) + (0x0080<<7)) >> 15;
CMPA_reg_val = CMPAHR_reg_val<<8;
CMPB_reg_val = ((temp1 * MEP_ScaleFactor) + (0x0080<<7)) >> 15;
CMPB_reg_val = CMPBHR_reg_val<<8;
#endif
EPwm1Regs.CMPA.all = ((long)CMPA_reg_val) << 16 | CMPAHR_reg_val;
EPwm1Regs.CMPB.all = ((long)CMPB_reg_val) << 16 | CMPBHR_reg_val;
}SOF
可以让占空比采用Q15格式
/* SFO相关内容 */
#define PWM_CH 5
#define STATUS_SUCCESS 1
#define STATUS_FAIL 0
volatile struct EPWM_REGS *ePWM[PWM_CH]={0, &EPwm1Regs,&EPwm2Regs,&EPwm3Regs,&EPwm4Regs};
Uint16 status = SFO_INCOMPLETE;
extern uint32_t MEP_ScaleFactor;
{
// SFO校验
status = SFO_INCOMPLETE;
status = SFO(); // 每5s/10s/1min执行一次
if(status == SFO_ERROR)
{
ESTOP0;
}
while(1)
{
if(flag_1s)
{
flag_1s = 0;
/*1s时基代码编写区*/
status = SFO_INCOMPLETE;
while(status == SFO_INCOMPLETE)
{
status = SFO();
}
if(status == 2)
{
/* 可以写处理,如禁用HRPWM */
ESTOP0;
}
/*1s时基代码结束*/
}
}
}ADC
设置参考电压

ADC的VREFLO必须接地
#define ADC_INTERNAL 0 // 内部
#define ADC_EXTERNAL 1 // 外部CTL2
设置分频数[3-0](频率=100/n)
CTL1
INTPULSEPOS设置中断脉冲延迟;ADCPWDNZ接通ADC电源,然后延迟1ms
ADC通道设置
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0; // A0
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 11;
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5;AIOs/ADC通道对应引脚


ADC中断触发设置
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 3; // EOC3触发中断(SOC3)
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1; // 中断使能
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // 清除中断标志位EOC对应SOC通道数量(即最后一个SOC数)
ADC的AdcxResultRegs寄存器
__interrupt void adcA1ISR()
{
A0 = AdcaResultRegs.ADCRESULT0;
A1 = AdcaResultRegs.ADCRESULT1;
A2 = AdcaResultRegs.ADCRESULT2;
A3 = AdcaResultRegs.ADCRESULT3;
C0 = AdcaResultRegs.ADCRESULT0;
C1 = AdcaResultRegs.ADCRESULT1;
C2 = AdcaResultRegs.ADCRESULT2;
C3 = AdcaResultRegs.ADCRESULT3;
TEMP = A0+A1+A2+A3+C0+C1+C2+C3;
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
AdcaRegs.ADCINTOVFCLR.bit.ADCINT1 = 1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}SCI
CCR通信寄存器
CTL1控制寄存器
CTL2控制寄存器
HBAUD&LBAUD
FIFO配置
CMPSS(TZ)
CMPSS内部简图

1.复位
CMPSS和ADC接口是共用的,ADC和CMPSS可以同时使用不冲突;其中F280049C有七个CMPSS可以使用
CMPSS复位表


有高比较器AnalogSubsysRegs.CMPHPMXSEL.bit.CMP1HPMXSEL 和低比较器AnalogSubsysRegs.CMPLPMXSEL.bit.CMP1LPMXSEL ,由于比较器极性可以设置,所以一般只使用高比较器
2.设置模拟前端CMPSS
考虑响应时间问题,一般只选择数字滤波,不进行锁存。
输入:模拟电压进入 CMPSS 正端,DAC 值在负端;输出不反向
处理:当
Vin > Vdac时,比较器输出高电平滤波:你配置了
CTRIPOUTHSEL = 2(Digital Filter),信号经过数字滤波器,去除了毛刺输出:信号命名为
CMPSS1.CTRIPH
迟滞特性

3.配置EPWM相关寄存器
一个EPWM只能链接两个通道(A & B)
3.1 数字比较子模块 (Digital Compare, DC)
作用:PWM 模块内部的“守门员”,决定谁是输入的跳闸源。
配置:如
EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL = 3;(TRIPIN4)结果:则EPwm1 的 DCAH (Digital Compare A High) 通道选中了 TRIP4(3+1)
DC_EVT1 / DC_EVT2 是 DC(Digital Compare)模块 的信号通道
3.2 跳闸区域子模块 (Trip Zone, TZ)
事件定义:
TZDCSEL.bit.DCAEVT2 = 2;(定义 Event2 = DCAH 为高电平时触发)动作模式:
TZSEL.bit.DCAEVT2 = 1;(设置为 CBC 模式,即 Cycle-By-Cycle)知识点:CBC 指过流消失后,下一个 PWM 周期自动恢复发波(一般使用CBC+计数);OSHT (One-Shot) 指一旦过流,永久锁死,必须软件复位。电源一般用 CBC 做限流,用 OSHT 做短路保护。
最终动作:
TZCTL.bit.TZA = TZ_FORCE_LO;(触发后,PWM 强制拉低)
OSHT (One-Shot) 和 CBC (Cycle-by-Cycle) 是 TZ(Trip Zone)模块
4.X-BAR链接CMPSS和EPWM
作用:这是一个大规模的信号交叉开关。
配置:
EPwmXbarRegs.TRIP4MUX0TO15CFG.bit.MUX0 = 0;结果:将
CMPSS1.CTRIPH信号连接到了 TRIP4 (EPwm1 的 DCAH)这根线上。此时,所有 PWM 模块都能看到 TRIP4 信号了。
XBAR总线表

测试示例
构造测试:在代码里把 DAC 的阈值设得很低(比如 0)。
观察现象:运行程序,此时比较器应该一直输出高电平。
测量波形:用示波器看 PWM 引脚,应该一直是低电平(因为 TZ 动作了)。
标志位检查:在 CCS 的 Register 窗口里观察
EPwm1Regs.TZFLG.bit.CBC,如果它置 1 了,说明保护逻辑成功触发!