PWM波模块由Time-Base(时基)、Counter-Compare(计数器比较)、Action-Qualifier(波形发生器)、Dead-Band(死区设置)、Trip-Zone(错误处理)、Event-Trigger(事件触发)、PWM-Chopper(PWM斩波器)、HRPWM(高分辨率脉宽调制器)、Digital Compare Event(数字比较事件)这些子模块组成

例程中输出一个PWM波只需要用到TB(Time-Base)、CC(Counter-Compare)、AQ(Action-Qualifier)、ET(Event-Trigger)模块

首先看TB模块包含的寄存器

TBPRD   决定时基计数器的周期(设置 PWM 频率)。

TBPHS    设置所选 ePWM 相对于提供同步输入信号的时基的时基计数器相位。

TBCTR    读取当前时基计数器值

TBCTL     控制时基行为

TBSTS

TBPRDHR(1)

TBPHSHR(1)

TBPRDHRM(1)

TBPRDM(1)

(1)该寄存器仅在包含高分辨率扩展 (HRPWM) 的 ePWM 实例上可用。 在不包含 HRPWM 的 ePWM 模块上,此位置是保留的。

 CC包含的寄存器

CMPCTL    控制计数器比较寄存器的工作模式、状态标志等

CMPA          CMPA 寄存器中的值不断与时基计数器 (TBCTR) 进行比较。 当值相等时,计 数器比较模块生成“时基计数器等于计数器比较 A”事件。 此事件被发送到动作限定符, 在那里它被限定并将其转换为一个或多个动作。 这些操作可应用于 EPWMxA 或 EPWMxB 输出,具体取决于 AQCTLA 和 AQCTLB 寄存器的配置。

CMPB同理

AQ包含的寄存器

 ET包含的寄存器

PWM模块各寄存器更详细的介绍我整理在了pdf里https://download.csdn.net/download/asbcddasds/20430625

例程中用PWM3模块,对应的引脚为gpio4、5。

 初始化程序

GPIO的初始化以及PWM模块的设定

void InitEPwm3Gpio(void)
{EALLOW;GpioCtrlRegs.GPAPUD.bit.GPIO4 = 1;    // Disable pull-up on GPIO4 (EPWM3A)GpioCtrlRegs.GPAPUD.bit.GPIO5 = 1;    // Disable pull-up on GPIO5 (EPWM3B)GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 1;   // Configure GPIO4 as EPWM3AGpioCtrlRegs.GPAMUX1.bit.GPIO5 = 1;   // Configure GPIO5 as EPWM3BEDIS;
}
void InitEPwm3Example(void)
{EALLOW;EPwm3Regs.TBPRD = 2000;       // Set timer period计数为2001(设置频率)// Setup TBEPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // 模式选择Count upEPwm3Regs.TBCTL.bit.PHSEN = TB_DISABLE;    // 禁用相位加载EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;   // Clock ratio to SYSCLKOUTEPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV1;      //分频设置EPwm3Regs.TBPHS.half.TBPHS = 0x0000;       // 相位设置为0EPwm3Regs.TBCTR = 0x0000;                  //清除时基计数器// Setup shadow register load on ZEROEPwm3Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; //计数器计较A寄存器工作在影子模式EPwm3Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; //计数器计较B寄存器工作在影子模式EPwm3Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;//计数器比较A从影子模式加载,时基计数器初始置零EPwm3Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;// Set Compare values确定占空比EPwm3Regs.CMPA.half.CMPA = 50;             // 设定比较值A为50EPwm3Regs.CMPB = 1950;                     // 设定比较值B为1950// Set ActionsEPwm3Regs.AQCTLA.bit.CAU = AQ_SET;         // 当计数器等于CMPA寄存器且计数器为递增时,强制epwm3a输出高电平    EPwm3Regs.AQCTLA.bit.CBU = AQ_SET; EPwm3Regs.AQCTLA.bit.ZRO = AQ_CLEAR;       // 当计数器为0时切换epwm3A的输出EPwm3Regs.AQCTLB.bit.ZRO = AQ_CLEAR;    // Interrupt where we will change the Compare ValuesEPwm3Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;  //使能事件计数器为零EPwm3Regs.ETSEL.bit.INTEN = 1;             //启用 ePWM 中断 (EPWMx_INT) 生成EPwm3Regs.ETPS.bit.INTPRD = ET_3RD;        //在 ETPS[INTCNT] = 1,1(第三个事件)上产生中断
EDIS;// Start by increasing the compare A and decreasing compare B}

PWM周期计算=(TBPRD+1)xTBCLK————TBCLK=SYSCLKOUT / (HSPCLKDIV × CLKDIV)

对于TMS28027来说SYSCLKOUT=60MHZ

例程中,HSPCLKDIV和CLKDIV都等于1,则TBCLK=60MHZ/1=16.67ns

周期为2001*16.67ns=33.4ms

占空比计算:

PWM3A通道占空比为(2000-50)/2000=97.5%

PWM3B同理

最后将函数导入主函数即可

TMS28027输出PWM波例程解析相关推荐

  1. STM32F103 PA8不能输出PWM波问题

    在调试STM32F103单片机输出PWM波时,单独测试PA8和PA11输出PWM波(也就是TIM1_CH1和TIM1_CH4),输出PWM波正常.然后用串口1输出数据时,发现一个问题,串口输出正常,但 ...

  2. STM32单片机:定时器TIM输出PWM波

    学习32单片机过程中使用的工具:MDK Keil5 + 正点原子精英版(STM32F103ZET6)+ STM32CubeMX + HAL开发 一.PWM的产生原理 关于PWM的产生原理网上有很多教程 ...

  3. 树莓派输出pwm波c语言,02树莓派4B—C语言编程——PWM

    01树莓派直接输出PWM波 -- 硬件PWM程序  (推荐使用) #include #include #include //必不可少 int main( void) { int pwm_gpio5 = ...

  4. STM32CubeMX——LED定时闪烁和输出PWM波

    简介 通过学习STM32CubeMX软件,掌握配置各个部件的基本方法:了解外部中断,定时器中断,PWM波产生等功能的原理,编写程序代码,实现相应的功能. 程序预期结果: LED初始设置间隔2秒闪烁一次 ...

  5. STM32f103C8定时器输出PWM波信号

    利用stm32高级定时器输出PWM,模拟呼吸灯的效果带刹车功能.由于没有示波器查看输出的pwm波形图,所以本次实验使用普通直流电机模拟的. 本文章为学习笔记,其中有些地方解释的不是那么的好,即本笔记可 ...

  6. stm32f4 输出pwm波_stm32的pwm输出代码及注释

    stm32是非常常用的单片机.脉冲宽度调制(PWM),是英文"Pulse WidthModulation"的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非 ...

  7. STM32H743+CubeMX-低功耗定时器LPTIM输出PWM波

    文章目录 一.前言 二.CubeMX 2.1.Clock Configuration 2.2.LPTIM2 Mode and Configuration 2.3.Parameter Settings ...

  8. 使用STM8S003定时器的PWM功能输出PWM波

    一.使用定时器TIM2的CH1.CH2.CH3通道PWM输出 1. 在使用stm8s系列的单片机的时候,使用的头文件大部分都是通用的stm8s.,第一步修改头文件: /* Uncomment the ...

  9. msp430g2553输出PWM波

    用msp430g2553的定时器timerA就可以实现PWM波,内容不难!设置下时钟源,定时器配置一下就可以了 仿真: 代码: TA1CTL:选时钟源,计数模式增 TA1CCR0(定时器寄存器)与频率 ...

最新文章

  1. JavaScript的编码规范
  2. ETL工具Kettle使用
  3. 读《三体Ⅱ · 黑暗森林》| 人能相互理解的前提是力量对等
  4. Python:eval的妙用和滥用
  5. 台积电:高雄地震对生产影响比预期略高
  6. 大数据学习笔记33:解决CentOS7上MySQL启动失败问题
  7. 2017.7.17数据类型
  8. 中国自主可免费使用的一站式 IoT 集成开发环境 RT-Thread Studio 发布!
  9. U 盘安装 CentOS的方法
  10. 学习笔记10--自动驾驶汽车软件架构
  11. 移动硬盘根目录里的msdia80.dll文件
  12. 不存在R上的连续函数f,它在无理数集R\Q上是一一映射,而在有理数集Q上不是一一映 射。
  13. 古墓丽影10linux,《古墓丽影:崛起》推出Linux系统版:Ubuntu 17.10可玩
  14. SveletJs学习——运动动画
  15. HTML5 drag和drop的亲手实践
  16. 满满的干货!传统备份vs CDP vs CDM
  17. latex画三线表模板
  18. 分享使用全自动引流脚本之前须知的五大要点
  19. 什么是“SCSI”硬盘
  20. 转载 揭穿号称内存占用极低的软件的诡计

热门文章

  1. C. Hilbert's Hotel
  2. Spring定时任务(计划任务)
  3. 项目管理:成为项目经理,是怎样的经历?
  4. Ltspice测量波形的相关数据
  5. 微信登录异常errcode:40029
  6. 总结python中的乱码问题
  7. Mac 安装zsh 以及powerlevel10k配置
  8. 【10. 信号量和管程】
  9. Ubuntu/Deepin下Python3.8出现SSL错误的解决方案
  10. emlog轩少资源网模板,整站数据源码