利用DSP中EWPM模块产生带死区PWM波来驱动IGBT开断进而控制电压

最近比较忙,许久未写博文,今天打算聊一下如何利用DSP中EWPM模块产生带死区PWM波来驱动IGBT开断进而控制电压(笔者这里利用TMS320F28377D的程序进行演示)。

先总述一个整个流程:
①先把GPIO配置为Epwm模式
②按datasheet里的寄存器进行配置(向上计数,向下计数,上-下计数,CMPA,CMPB值,动作触发,死区时间等)。
③通过对CMPACMPB进行调节进而改变PWM占空比

TI的C2000系列的EPWM模块由7个子模块组成:
①时间基准子模块TB
②计数比较子模块CC
③动作限定子模块AQ
④死区控制子模块DB
⑤PWM斩波子模块PC
⑥错误控制子模块TZ
⑦事件触发子模块ET

每个模块分别有对应的寄存器需要配置,他们各自的功能可以如下所简述:
①时间基准子模块TB:配置时钟,计数方式,同步与否,改相位。
②计数比较子模块CC:计数时进行值比较,有相同则触发信号
③动作限定子模块AQ:触发信号来了具体怎么做
④死区控制子模块DB:哪里加延时,延时多久
⑤PWM斩波子模块PC:需要高频信号来控制电子开关时,对信号进行再调制
⑥错误控制子模块TZ:用来响应外部错误或外部触发条件,当错误发生时,PWM 模块可以通过编程来响应这些问题。
⑦事件触发子模块ET:配置中断和ADC模块

以上的描述都是为了便于读者轻松读懂下面程序:

/*
 * EPWM.c
 *
 *  Created on: 2020年12月2日
 *  */
#include "F28x_Project.h"
void EPWM1_config()
{
    EALLOW;

      EPwm1Regs.TBPRD = 2000;              //设置周期值
      EPwm1Regs.TBPHS.bit.TBPHS = 0;        //设置相位,Phase Offset Register相位偏移寄存器
      EPwm1Regs.DBRED.bit.DBRED = 100;       //上升沿死区时间   us      rising edge
      EPwm1Regs.DBFED.bit.DBFED = 100;       //下降沿死区时间   us      falling edge

    EDIS;
}
void EPWM1_init()
{
    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;   //关闭时基时钟同步,也就是TBCLK暂时不会产生脉冲

    CpuSysRegs.PCLKCR2.bit.EPWM1 = 1;       //打开EPWM1的外设时钟
    EDIS;

    InitEPwm1Gpio();                        //将IO口配置成EPWM模式

    // Setup Sync设置时基子模块
    EPwm1Regs.TBPRD = 0xFFFF;              //设置周期值
    EPwm1Regs.TBPHS.bit.TBPHS = 0;        //设置相位,Phase Offset Register相位偏移寄存器
    EPwm1Regs.TBCTR = 0x0000;             //设置计数器的起始值, counter register清除计数器的值

    //设置计数模式
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;    //计数模式, 增减计数模式Count up
    EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;     //phase enable 配置是否使能改变起始相位,这里设置为禁止相位功能
    EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;              //使用映射功能,loaded from its shadow register
    EPwm1Regs.TBCTL.bit.SYNCOSEL = 0;//TB_CTR_ZERO;  //  Sync Output Select  选择同步信号为CTR=0

    EPwm1Regs.TBCTL.bit.HSPCLKDIV=TB_DIV1;      //High Speed Time Base Clock Pre-Scale Bits,这里暂时不分频
    EPwm1Regs.TBCTL.bit.CLKDIV=TB_DIV1;         //TBCLK = EPWMCLK / (HSPCLKDIV x CLKDIV)

    // Setup shadow register load on ZERO设置映射模式
    EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;         //CMPA采用映射模式
    EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;         //CMPB采用映射模式
    EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;       //CTR = 0时加载CMPA
    EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;       //CTR = 0时加载CMPB

    //设置比较寄存器的比较值
    EPwm1Regs.CMPA.bit.CMPA = 0;              // Set compare A value
    EPwm1Regs.CMPB.bit.CMPB = 0;              // Set Compare B value

    //Set actions配置波形方式     Action Qualifier Control Register For Output A 动作限定控制寄存器A
    EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;            // 当 TBCTR计数器 = 0时,使PWM1A拉高
    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;          // 当向上计数时,当TBCTR = CMPA时,使PWM1A置低

    EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET;            // 当 TBCTR计数器 = 0时,使PWM1B拉高
    EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR;          // 当向上计数时,当TBCTR = CMPA时,使PWM1B置低

    //设置死区模式
    EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;           //死区输出模式设置,将S1和S0的开关都打开        1 1
    EPwm1Regs.DBCTL.bit.POLSEL  =  DB_ACTV_HIC;           //polarity select 这里将EPWM2反向
    EPwm1Regs.DBCTL.bit.IN_MODE  = DBA_ALL;           //死区输入模式控制,这里设置为EPWM1A为上升沿的信号源,EPWM1B为下降沿的信号源

//    //初始化事件触发模块,配置ET寄存器.设置EPWM中断
//    //Event Trigger Selection Register
//    EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;     // Select INT on Zero event     中断事件 TBCTR= 0x0000
//    EPwm1Regs.ETSEL.bit.INTEN = 1;                // Enable INT使能EPWM1中断
//    EPwm1Regs.ETPS.bit.INTPRD = ET_1ST;           // Generate INT on 1st event每发生一次产生一次中断.开关频率10KHz,对应中断频率为10KHz
//    EPwm1Regs.ETCLR.bit.INT = 1;                  //清除中断标志位

    EALLOW;                                       //使能时基计数器时钟,保证同步
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;    // Start all the timers synced
    EDIS;
}


void EPWMxA_ratio_set(Uint16 PWM1)
{
    EPwm1Regs.CMPA.bit.CMPA = PWM1;  //设置占空比
 //   EPwm2Regs.CMPA.bit.CMPA = PWM2;  //设置占空比
}
void EPWMxB_ratio_set(Uint16 PWM1)
{
    EPwm1Regs.CMPB.bit.CMPB = PWM1;  //设置占空比
//    EPwm2Regs.CMPB.bit.CMPB = PWM2;  //设置占空比

}

最后,在主程序调用上面几个函数。即可在配置的管脚上用示波器测得下图带死区的PWM信号。

利用DSP中EWPM模块产生带死区PWM波来驱动IGBT开断进而控制电压_第1张图片

你可能感兴趣的:(DSP,带死区PWM,控制电压)