TI DSP TMS320F280025 Note16:EPWM的原理与使用

TMS320F280025 模数转换器(ADC)


`


在这里插入图片描述

在这里插入图片描述

每个EPWM模块都包含多个子模块:时基TB子模块、计数比较CC子模块、动作AQ子模块、死区DB子模块、斩波PC子模块、TZ子模块、数字比较DC子模块、中断ET子模块
时基TB子模块、计数比较CC子模块、动作AQ子模块三个模块就可以完成PWM波的输出,死区DB子模块、斩波PC子模块、TZ子模块、数字比较DC子模块、中断ET子模块这些模块只是PWM的优化,让PWM锦上添花

时基TB子模块

每个 ePWM 模块都有一个自己的时间基准单元(时基单元) , 用来决定该 ePWM模块相关的事件时序, 通过同步输入信号可以将所有的 ePWM 工作在同一时基信号下, 即所有的 ePWM 模块级联在一起, 处于同步状态, 在需要时, 可以看成是一个整体。
在这里插入图片描述

时基子模块主要功能如下:
•缩放时基时钟(TBCLK)相对于ePWM时钟(EPWMCLK)。
•配置PWM时基计数器(TBCTR)频率或周期。
•设置时基计数器模式:
—计数模式:用于非对称PWM
—计数模式:用于非对称PWM
—计数上下模式:用于对称PWM
•配置时基相位相对于其他ePWM模块。
•通过硬件或软件同步各模块间的时基计数器。
•配置同步事件发生后时基计数器的方向(向上或向下)。
•同时写入与EPWMXLINK上的配置相对应的所有PWM的TBPRD寄存器。
•配置当设备被模拟器停止时时基计数器的行为。
•指定ePWM模块的同步输出源•配置该模块的一次性和全局加载寄存器。

计数比较CC子模块

计数器比较模块是以时基计数器的值作为输入, 与比较寄存器 CMPA 和比较寄存器 CMPB 不断进行比较, 当时基计数器的值等于其中之一时, 就会产生相应的事件。
在这里插入图片描述

•指定输出EPWMxA和输出EPWMxB的PWM占空比
•指定EPWMxA或EPWMxB输出开关事件发生的时间
•指定带有额外比较器的中断和SOC生成的可编程延迟
•同时写入与EPWMXLINK上配置对应的所有PWM的CMPA, CMPB, CMPC, CMPD寄存器。
•在此模块中配置一次性和全局加载寄存器

计数器比较模块可以产生两个独立的比较事件, 对于向上(递增) 或者向下(递减) 计数模式来说, 在一个 PWM 周期内, 比较事件只发生一次。 而对于向上向下(先递增后递减) 计数器模式来说, 如果比较寄存器的值在 0-TBPRD 之间,在一个 PWM 周期内, 比较事件就会发生两次。 这些事件都会直接影响动作模块。计数器比较模块比较寄存器 CMPA、 CMPB 各自都有一个影子寄存器。 CMPA 影子寄存器通过清除 CMPCTL[SHDWAMODE]位使能, CMPB 影子寄存器通过清零CMPCTL[SHDWAMODE]位使能。 默认情况下, CMPA 和 CMPB 影子寄存器是使能的。

动作AQ子模块

动作限定模块在 PWM 波形形成过程中起到了关键作用, 它决定了相应事件发生时应该输出什么样的电平, 从而使 ePWMxA 和 ePWMxB 输出所需要的开关波形
在这里插入图片描述

•指定时间基反比较、跳闸子模块或比较器事件发生时所采取的行动类型:
—不采取行动—输出EPWMxA和EPWMxB高开关
—输出EPWMxA和EPWMxB低开关
—输出EPWMxA和EPWMxB切换
•通过软件控制强制PWM输出状态
•通过软件配置和控制PWM死区
•在该模块中配置一次性和全局加载寄存器。

死区DB子模块

死区模块主要作用就是让两个互补的对称的 PWM 波形中, 上升沿的发出滞后于 PWM 波的下降时间发出。 在实际编程或者实际情况中更灵活一些, 有可能管子是低电平状态开通, 所以延时的方式可以更灵活。 在动作限定模块中就可以产生死区, 但是如果要严格控制死区的边沿延时和极性, 则需要通过死区模块来实现。
在这里插入图片描述
在这里插入图片描述

死区控制其实就是设置寄存器DBCTL各个位来控制死区电路的开关开启或关闭,死区电路中的开关、反相器、延时器使输入死区电路的波形成为我们需要的互补带死区的波形
•控制传统的上下开关互补死带关系
•指定输出上升沿延迟值
•指定输出下降沿延迟值
•完全绕过死带模块。在这种情况下,PWM波形无需修改即可通过。
•选项,使半周期时钟的双重分辨率。
•允许ePWMxB相对于ePWMxA输出相移。
•在此模块中配置一次性和全局加载寄存器。

斩波PC子模块

PWM 斩波器模块通过高频信号来调制经由动作模块与死区模块产生的 PWM 波形, 这个功能在基于脉冲变压器的门极驱动型功率器件控制中很重要。
在这里插入图片描述

•创建斩波(载波)频率。
•斩波脉冲序列中第一个脉冲的脉宽。
•第二脉冲和后续脉冲的占空比。
•完全绕过PWM斩波模块。在这种情况下,PWM波形无需修改即可通过。

错误联防模块TZ子模块

每个 ePWM 模块都与 GPIO 多路复用引脚中的 6 个 TZn(TZ1-TZ6)信号脚以及数字比较器事件信号连接。这些信号脚用来响应外部错误或外部触发条件, 当错误发生时, PWM 模块可以通过编程来响应这些问题。
在这里插入图片描述

•配置ePWM模块对一个、全部或不响应行程区信号或数字比较事件。
•设置故障发生时的跳闸动作:—强制EPWMxA和EPWMxB为高阻状态—强制EPWMxA和EPWMxB为低阻状态—强制EPWMxA和EPWMxB为高阻状态—配置EPWMxA和EPWMxB忽略任何跳闸条件。
•配置ePWM响应每个trip-zone信号的频率:
—one -shot
—周期-周期
•使能trip-zone启动中断。
•完全绕过trip-zone模块。
•如果需要,独立配置时基计数器倒计时时所采取的跳闸动作。

①周期触发: 当周期错误联防事件发生时, TZCTL 寄存器中的动作立刻输出到 ePWMxA 和 ePWMxB 引脚上, 另外, 周期错误联防事件标志位(TZFLG[CBC]) 被
置位, 同时当 TZEINT 寄存器和 PIE 模块的中断使能时, ePWMx_TZINT 中断就会产生。
②单次触发: 当单次错误联防事件发生时, 同样 TZCTL 寄存器中的动作立刻输出到 ePWMxA 和 ePWMxB 引脚上, 另外单次错误联防事件标志位(TZFLG[OST])被置位, 同时当 TZEINT 寄存器和 PIE 模块的中断使能时, ePWMx_TZINT 中断就会产生的。
两种模式触发的区别在于周期错误联防事件标志可以自动清零, 但是单次错误联防事件标志需要软件清零。

数字比较DC子模块

•启用比较器(COMP)模块输出和行程区信号,使用输入X-BAR配置创建事件和过滤事件
•指定事件过滤选项捕获TBCTR计数器,生成消隐窗口,或在PWM输出或基于捕获值的时基计数器中插入延迟。
在这里插入图片描述

中断ET子模块

事件触发模块主要响应时基模块与计数比较模块的相关事件, 当这些事件发生时, PWM 事件触发模块产生相应的中断事件或 ADC 启动事件。
在这里插入图片描述

•使能触发中断的ePWM事件。
•启用触发ADC开始转换事件的ePWM事件。
•指定事件触发的频率(每次发生或每2次或最多15次)
•轮询,设置或清除事件标志

EPWM的使用

EPWMDriver.c

/*
 * EPWMDriver.c
 *
 *  Created on: 2024年8月8日
 *      Author: Paranoid
 */

#include "main.h"

//
// Globals
//
uint32_t epwm1TZIntCount;
uint32_t epwm2TZIntCount;

//
// Function Prototypes
//
__interrupt void epwm1TZISR(void);
__interrupt void epwm2TZISR(void);

void EPWM1Driver_Init(void)
{
   
    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;
    EDIS;

    EALLOW;
    //
    // EPWM1 -> myEPWM1 Pinmux
    //
    GpioCtrlRegs.GPAGMUX1.bit.GPIO0 = 0;
    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;
    GpioCtrlRegs.GPAODR.bit.GPIO0 = 0;
    GpioCtrlRegs.GPAPUD.bit.GPIO0 = 1;
    GpioCtrlRegs.GPAINV.bit.GPIO0 = 0;
    GpioCtrlRegs.GPAQSEL1.bit.GPIO0 = 0;

    //
    // EPWM2 -> myEPWM2 Pinmux
    //
    GpioCtrlRegs.GPAGMUX1.bit.GPIO1 = 0;
    GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1;
    GpioCtrlRegs.GPAODR.bit.GPIO1 = 0;
    GpioCtrlRegs.GPAPUD.bit.GPIO1 = 1;
    GpioCtrlRegs.GPAINV.bit.GPIO1 = 0;
    GpioCtrlRegs.GPAQSEL1.bit.GPIO1 = 0;

//    //GPIO11 Pinmux InputXbarRegs
//     GpioCtrlRegs.GPAGMUX1.bit.GPIO14 = 0;
//     GpioCtrlRegs.GPAMUX1.bit.GPIO14 = 0;
//     GpioCtrlRegs.GPAODR.bit.GPIO14 = 0;
//     GpioCtrlRegs.GPAPUD.bit.GPIO14 = 0;
//     GpioCtrlRegs.GPAINV.bit.GPIO14 = 0;
//     GpioCtrlRegs.GPAQSEL1.bit.GPIO14 = 3;
//     GpioCtrlRegs.GPADIR.bit.GPIO14 = 0;
//     EDIS;
//
//     EALLOW;
//     InputXbarRegs.INPUT1SELECT = 14;
//     EALLOW;

    EDIS;
    SyncSocRegs.SYNCSELECT.bit.SYNCOUT = SYSCTL_SYNC_OUT_SRC_EPWM1SYNCOUT;
    SyncSocRegs.ADCSOCOUTSELECT.all = 0;
    SyncSocRegs.ADCSOCOUTSELECT.all = 0;
    EDIS;

    //TBCLK = EPWMCLK / (HSPCLKDIV x CLKDIV)
    //EPWMCLK = 50M HZ
    //设置ePWM模块1的时钟分频器,使其时钟频率降低到原来的1/4
    EALLOW;
    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV4;     //010  4分频
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV4;  //010  4分频

    EPwm1Regs.TBPRD = 30000;            //设置ePWM模块1的时间基准周期为12000个时钟周期。
    EPwm1Regs.TBCTR = 0;                //将ePWM模块1的时间基准计数器初始化为0
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; //设置ePWM模块1的计数器模式为上计数然后下计数,形成周期性波形
    EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;      //禁用ePWM模块1的相位加载功能
    EPwm1Regs.TBPHS.bit.TBPHS = 0;      //设置ePWM模块1的相位偏移为0。

    EPwm1Regs.CMPA.bit.CMPA = 10000;     //设置ePWM模块1的比较值A为6000
    EPwm1Regs.CMPCTL.bit.LOADASYNC = 0;
    EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; //设置ePWM模块1的比较值A的阴影加载模式,当计数器为0时更新比较值
    EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; //

//    EPwm1Regs.CMPB.bit.CMPB = 10000;     //设置ePWM模块1的比较值A为6000
//    EPwm1Regs.CMPCTL.bit.LOADBSYNC = 0;
//    EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; //设置ePWM模块1的比较值B的阴影加载模式,当计数器为0时更新比较值
//    EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; //
    /*
     Uint16 ZRO:2;                       // 1:0 Action Counter = Zero
     Uint16 PRD:2;                       // 3:2 Action Counter = Period
     Uint16 CAU:2;                       // 5:4 Action Counter = Compare A Up
     Uint16 CAD:2;                       // 7:6 Action Counter = Compare A Down
     Uint16 CBU:2;                       // 9:8 Action Counter = Compare B Up
     Uint16 CBD:2;                       // 11:10 Action Counter = Compare B Down
     */
    EPwm1Regs.AQCTLA.bit.ZRO = AQ_NO_ACTION;
    EPwm1Regs.AQCTLA.bit.PRD = AQ_NO_ACTION;
    EPwm1Regs.AQCTLA.bit.CBU = AQ_NO_ACTION;
    EPwm1Regs.AQCTLA.bit.CBD = AQ_NO_ACTION;
    EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;
    EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;

    EPwm1Regs.AQCTLB.bit.ZRO = AQ_NO_ACTION;
    EPwm1Regs.AQCTLB.bit.PRD = AQ_NO_ACTION;
    EPwm1Regs.AQCTLB.bit.CBU = AQ_NO_ACTION;
    EPwm1Regs.AQCTLB.bit.CBD = AQ_NO_ACTION;
    EPwm1Regs.AQCTLB.bit.CAU = AQ_CLEAR;
    EPwm1Regs.AQCTLB.bit.CAD = AQ_SET;

    EPwm1Regs.DBCTL.bit.LOADREDMODE = CC_CTR_ZERO;
    EPwm1Regs.DBCTL.bit.SHDWDBREDMODE = CC_IMMEDIATE;

    EPwm1Regs.DBCTL.bit.LOADFEDMODE = CC_CTR_ZERO;
    EPwm1Regs.DBCTL.bit.SHDWDBFEDMODE = CC_IMMEDIATE;

//    //EPwm1Regs.TZCTL.bit.TZA = 0;
//    EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_HI;
//    EPwm1Regs.TZSEL.bit.OSHT1 = TZ_ENABLE; //TZ1
//    EPwm1Regs.TZEINT.bit.OST = TZ_ENABLE; //One-Shot 使能中断生成一次性trip事件会导致EPWMx_TZINT PIE中断
//    EDIS;
//
//    EALLOW;
//    PieVectTable.EPWM1_TZ_INT = &epwm1TZISR;
//
//    PieCtrlRegs.PIEIER2.bit.INTx1 = 1;  //使能PIE组2的EPWM1_TZ
//
//    IER |= M_INT2;                      // 使能CPU中断2(INT2)
//    EDIS;
//    //
//    // Turn on the module clock.
//    //
//    EALLOW;
//    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
//    EDIS;
//
//    //
//    // Enable Global Interrupt (INTM) and real time interrupt (DBGM)
//    //
//    EINT;
//    ERTM;
}

//
// epwm2TZISR - ePWM1 TZ ISR
//
__interrupt void epwm1TZISR(void)
{
   
    epwm1TZIntCount++;
    LED1_TOGGLE();
    //
    // Clear the flags - we will continue to take this interrupt until the TZ
    // pin goes high.
    //
    //EPWM_clearTripZoneFlag(EPWM1_BASE, (EPWM_TZ_INTERRUPT | EPWM_TZ_FLAG_CBC));

//    EALLOW;
//    EPwm1Regs.TZCLR.bit.INT = 1;
//    EPwm1Regs.TZCLR.bit.CBC = 1;
//    EDIS;

    //
    // Acknowledge this interrupt to receive more interrupts from group 2
    //
    PieCtrlRegs.PIEACK.bit.ACK2 = 1;
}

/*
 * 高分辨率
 */
void EPWM2Driver_Init(void)
{
   
    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;
    EDIS;

    EALLOW;
    //
    // EPWM2 -> myEPWM2 Pinmux
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苦梨甜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值