创建工程

  • 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总线表

测试示例

  1. 构造测试:在代码里把 DAC 的阈值设得很低(比如 0)。

  2. 观察现象:运行程序,此时比较器应该一直输出高电平。

  3. 测量波形:用示波器看 PWM 引脚,应该一直是低电平(因为 TZ 动作了)。

  4. 标志位检查:在 CCS 的 Register 窗口里观察 EPwm1Regs.TZFLG.bit.CBC,如果它置 1 了,说明保护逻辑成功触发!