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

news2024/10/1 0:48:55

TMS320F280025 模数转换器(ADC)


`

文章目录

  • TMS320F280025 模数转换器(ADC)
  • 时基TB子模块
  • 计数比较CC子模块
  • 动作AQ子模块
  • 死区DB子模块
  • 斩波PC子模块
  • 错误联防模块TZ子模块
  • 数字比较DC子模块
  • 中断ET子模块
  • EPWM的使用
    • EPWMDriver.c
    • EPWMDriver.h


在这里插入图片描述

在这里插入图片描述

每个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
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2181151.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

系列二、案例实操

一、创建表空间 1.1、概述 在Oracle数据库中,表空间是一个逻辑存储单位,它是Oracle数据库中存储数据的地方。 1.2、超级管理员登录 sqlplus / as sysdba 1.3、创建表空间 create tablespace water_boss datafile C:\Programs\oracle11g\oradata\orcl\…

【NTN 卫星通信】基于NR的NTN RAN架构

1 引言 3GPP中,38.821协议中,研究了如何最大限度地减少对NG-RAN中新接口和协议的需求,以支持非地面网络。 研究了包括透传星和再生星的RAN架构。 2 基于透传星的NG-RAN架构 2.1 概述: 对于透传模式,卫星有效载荷在上行链路和下行链路方向上实现频率转换和射频放大器。它…

Python的异步编程

什么是协程? 协程不是计算机系统提供,程序员人为创造。 协程也可以被称为微线程,是一种用户态内的上下文切换技术。简而言之,其实就是通过一个线程实现代码块相互切换执行。 实现协程有那么几种方法: greenlet&…

推荐4个精准高效的录音转文字软件。

录音转文字在很多的场景中都能够为我们提供便利,比如:可以将课堂录音转换为文字,方便复习和整理笔记,可以将会议录音转换为文字,快速准确地记录内容,可以将采访录音转成文字,提高新闻稿件的撰写…

在VMware虚拟机上部署polardb

免密登录到我们的虚拟机之后,要在虚拟机上部署polardb数据库,首先第一步要先克隆源码: 为了进SSH协议进行传输源码需要先进行下面的步骤: 将宿主机上的私钥文件复制到虚拟机上 scp "C:\Users\waitw\.ssh\id_rsa" ann…

BCJR算法——卷积码的最大后验译码

定义:输入序列为 其中每比特,同时相应的输出序列为 其中每一码字的长度为n,定义在i时刻的编码器的状态为,对于时刻里有 表示输出码字和卷积码第i时刻的输入和第i-1时刻的状态有关(包括寄存器和输出部分)&am…

grafana全家桶-loki promtail收集k8s容器日志

loki是grafana旗下轻量级日志收集工具,为了减少loki对集群的影响,把loki的agent日志收集端promtail部署在k8s集群中,loki server部署在集群外面。这样简单做一个解耦,避免大量读写的应用影响到集群内业务服务。 一、promtail部署…

docker学习笔记(1.0)

docker命令 下载镜像相关命令 检索:docker search 比如:docker search nginx 是查看有没有nginx镜像 后面的OK表示是不是官方镜像,如果有就是官方镜像,如果没有就是第三方的。 下载:docker pull 比如&#xff1a…

USB 3.1 标准 A 型插头到 USB 3.1 Micro-B 型插头电缆组件的电线连接

电线分配 下表定义了电线编号和电线的信号分配: Unshielded twist pair:非屏蔽双绞线Shielded differential pair:屏蔽差分对Braid:编织层Cable external braid to be 360 terminated on to plug metal shell:电缆外部…

JAVA开源项目 大学生就业招聘系统 计算机毕业设计

本文项目编号 T 058 ,文末自助获取源码 \color{red}{T058,文末自助获取源码} T058,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 企…

21.1 k8s接口鉴权token认证和prometheus的实现

本节重点介绍 : k8s接口鉴权方式serviceaccount和token的关系手动curl访问metrics接口 k8s对象接口鉴权 以容器基础资源指标为例 对应就是访问node上的kubelet的/metrics/cadvisor接口,即访问https://nodeip:10250/metrics/cadvisor 直接curl访问 会报错&…

无人机在救灾方面的应用!

一、灾害监测与评估 实时监测与评估:无人机可以快速到达灾害现场,通过搭载的高清摄像头、红外热成像仪等设备,对灾区进行实时监测和灾情评估。根据捕捉到的受灾范围、火势大小、建筑物损坏情况等关键信息,为救援行动提供决策依据…

Matplotlib 使用 LaTeX 渲染图表中的文本、标题和数学公式

Matplotlib 使用 LaTeX 渲染图表中的文本、标题和数学公式 Matplotlib 是一个功能强大的 Python 库,用于绘制各种高质量的图表和图形。在许多科研和技术文档中,数学公式是不可或缺的一部分,LaTeX 提供了精美的数学公式渲染能力。Matplotlib …

TI DSP TMS320F280025 Note15:串口SCI的使用

TMS320F280025 串口SCI的使用 ` 文章目录 TMS320F280025 串口SCI的使用框图分析串口特点可编程数据格式SCI端口中断非FIFO/FIFO模式下SCI中断的操作/配置UartDriver.cUartDriver.h串口时钟由PCLKCR7控制使能,默认位系统时钟4分频 串口接收与发送都可以触发中断 串口使用的引脚…

uniapp微信小程序,获取上一页面路由

在进入当前页面的时候,判断是不是从某个页面跳转过来的(一般是当前页面为公共页面是出现的),比如 A-->B C-->B ,那么 要在 C跳转到B页面的时候多个提示语什么的 而在A跳转到B时不需要,那么就要判断 上一页面的…

HTML【知识改变命运】01基础介绍

网页的组成 1:网页三件套1:html(结构)2:css(表现)JavaScript(行为) 2小技巧3:html的介绍4:两种运行方式5:html的主体结构6:html的注意情况 1:网页三件套 1:html(结构&am…

系统架构设计师论文《论SOA在企业集成架构设计中的应用》精选试读

论文真题 企业应用集成(Enterprise Application Integration, EAI)是每个企业都必须要面对的实际问题。面向服务的企业应用集成是一种基于面向服务体系结构(Service-OrientedArchitecture,SOA)的新型企业应用集成技术,强调将企业和组织内部的资源和业务…

LSTM模型改进实现多步预测未来30天销售额

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有:中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等,曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝,拥有2篇国家级人工智能发明专利。 社区特色…

粉丝们得以一窥索菲亚罗兰奢华的90岁生日庆祝仪式! 她已完成了所有的遗愿清单 !

计划中索菲亚罗兰将与一小群亲友庆祝她的90岁生日,但有人给了她一个巨大的惊喜。乔治阿玛尼给了她惊喜。 认识索菲娅罗兰,那是在一部堪称经典的影片《卡桑德拉大桥》之中。那时候的我,正值青春年华,才 20 多岁,怀揣着…

Albert Koetsier X射线摄影图连发四案,这些图片都不能用

案件基本情况起诉时间:2024-9-18、2024-9-24案件号:24-cv-08568、24-cv-08574、24-cv-08817、24-cv-08824原告:Albert Koetsier原告律所:keith起诉地:伊利诺伊州北部法院品牌介绍Albert Koetsier 的X射线花卉艺术&…