打印
[DSP编程]

PWM模块原理及使用

[复制链接]
5053|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
F280278PWM(四个模块),4HRPWM,特别对设计高精度电源提供了方便,每个PWM模块中又包括以下几个子模块:时基(Time-base)模块、计数比较(Counter-compare)模块、功能限定(Action-qualifier)模块、死区控制(Dead-band)模块、斩波(PWM-chopper)模块、事件触发(Event-trigger)模块、制动(Trip-zone)(不知道这样翻译恰当否)模块、数字比较(Digital Compare)模块。从这些模块的命名上看,用它来做个电源,是再恰当不过的了。
一、时基子模块(TB
每一个ePWM模块,都有自己的TB,它产生PWM的所有定时事件,且有同步逻辑,可以使多个PWM模块有序工作。
TBPRDPWM的计数周期寄存器。
TBPHS:相位控制寄存器,在多个PWM模块级联时,可以控制每路输出的相位。当时基模块的同步脉冲到来时,使计数器从TBPHS设置的值开始计数(丢弃当前计数值)。
TBCTLTB的控制寄存器,可以对相位方向(只在up-down时有用)控制,决定是上计数时同步(PHSDIR=1)还是下计数时同步(PHSDIR=0);决定TB输入时钟的分频系数;向下一级输出的同步脉冲的输出方式;计数值重装方式、计数方式、同步允许等控制。
TBCTR:计数寄存器。TB模块的当前计数值。
TBSTSTB的状态寄存器。
二、计数比较子模块(CC
此模块实现与TB的比较及控制。产生CMPACMPB比较事件;控制PWM的占空比。
CMPCTL:计数比较控制寄存器。决定是否使用影子寄存器及计数值的重装方法。
CMPA:计数比较值设定寄存器A
CMPAMCMPA的影子寄存器。
CMPB:计数比较值设定寄存器B
三、功能限定子模块(AQ
这个子模块主要对TBCC模块产生的事件,作出相应的响应,如计数器到达设定同期时、到达0时、到达CMPA时、到达CMPB时,相应的EPWMxAEPWMxB的输出状态。
AQCTLA:设定EPWMxA在以上事件时的输出
AQCTLB:设定EPWMxB在以上事件时的输出
四、死区控制子模块(DB
在同步整流及桥式电机驱动时,上下臂的控制开关(晶体管或MOS管)的导通与关闭会出现一定的延时,这有可能导致上下臂开关的同时导能现象。DB子模块可以有效地防止这种现象的发生。
DBCTLDB通用控制寄存器,主要产生死区控制的方法。
DBRED:上升沿延时控制寄存器,产生延迟的周期数。
DBFED:下降沿延时控制寄存器,产生延迟的周期数。
五、PWM斩波模块(PC
PWM的周期较长,用高频变压器作驱动器,就会达不到目的,并有可能烧坏器件。使用PC模块可以将PWM波经过“再调制”后的高频波作驱动就可以解决这个问题。
PCCTLPC控制寄存器,实现“再调制”波的duty控制、“调制”频率控制等。
六、制动子模块(TZ
TZ模块是当系统出现问题,或者发出制动信号时,达到所期望的系统响应。F280273TZ外部信号输入,TZ信号可以连接到任意一个PWM模块。当制动条件产生后,它可以使EPWMxA EPWMxB产生:高电平输出、低电平输出、高阻输出、不动作。可以一次性(one-shot)或逐周期(cycle-by-cycle)控制。可以受DC子模块控制等
TZSELTZ选择寄存器,用来选择TZ
TZCTLTZ控制寄存器,用来EPWMxAEPWMxB的输出。
TZEINTTZ中断允许寄存器。
TZDCSEL:数字比较事件选择寄存器。
七、事件触发子模块(ET
它由TBCCDC子模块触发源输入,产生CPU中断及触发ADC SOCstart of converter),
ETSEL:事件触发选择寄存器,选择触发源,SOC、中断允许控制,EPWMxSOCAEPWMxSOCB输出控制,
ETPS:触发事件分频寄存器,控制由n次事件产生后引发中断或响应。
ETFRC:强制触发寄存器。用于强制产生某一响应。
从以上可见,模块相互的作用及产生事件并不用CPU干预,这是实时控制所需要的,因为这样可以尽快地作为响应。如PWM输出后的某一时间产生ADC转换,都是由模块自己协调的,CPU只用设置好相应的寄存器就可以了。
八、程序示例
EPWM1A EPWM1B输出互补PWM波,并并使用TZ1TZ2对它作制动控制。例程中还用timer1控制PWM的占空比以作演示。
1InitEPwm1Gpio(),对IO口初始化
       ……
    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;   // Configure GPIO0 as EPWM1A
    GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1;   // Configure GPIO1 as EPWM1B
2InitTzGpio(),TZ口初始化
       ……
   GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 3;  // Asynch input GPIO12 (TZ1)
   GpioCtrlRegs.GPAQSEL2.bit.GPIO16 = 3;  // Asynch input GPIO16 (TZ2)
3PWM模块设置
    // Enable TZ1 and TZ2 as one shot trip sources
    EALLOW;
    EPwm1Regs.TZSEL.bit.OSHT1 = 1;
    EPwm1Regs.TZSEL.bit.OSHT2 = 1;
    // What do we want the TZ1 and TZ2 to do?
    EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_HI;
    EPwm1Regs.TZCTL.bit.TZB = TZ_FORCE_LO;
    // Enable TZ interrupt
    EPwm1Regs.TZEINT.bit.OST = 1;
    EDIS;
    EPwm1Regs.TBPRD = 6000;                         // Set timer period
    EPwm1Regs.TBPHS.half.TBPHS = 0x0000;          // Phase is 0
    EPwm1Regs.TBCTR = 0x0000;                       // Clear counter
    // Setup TBCLK
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;       // Count up
    EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;        // Disable phase loading
    EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW; //loaded from its shadow register
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;     // Clock ratio to SYSCLKOUT
    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
    EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;  // Load registers every ZERO
    EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
    EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
    EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
    // Setup compare
    EPwm1Regs.CMPA.half.CMPA = 3000;
    // Set actions
    EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;  //当计数值等于CMPA时,将PWM1A输出置高
    EPwm1Regs.AQCTLA.bit.PRD = AQ_CLEAR;
    EPwm1Regs.AQCTLB.bit.CAU = AQ_CLEAR;          // Set PWM1A on Zero
    EPwm1Regs.AQCTLB.bit.PRD = AQ_SET;
    // 触发ADC SOC
    //EPwm1Regs.ETSEL.bit.SOCAEN = 1;
……
4 ConfigCpuTimer(&CpuTimer1, 60, 1000);//设置Timer1
5Timer1中断:
interrupt void INT13_ISR(void)     // INT13 or CPU-Timer1
{
   GpioDataRegs.GPATOGGLE.bit.GPIO3 = 1;
   EPwm1Regs.CMPA.half.CMPA++;
   if ( EPwm1Regs.CMPA.half.CMPA > 5999 )
      EPwm1Regs.CMPA.half.CMPA =1;
   //PieCtrlRegs.PIEACK.all |= ;
}
九、编译运行
发现,接在EPWM1A EPWM1B的两个LED由暗至亮交替。

相关帖子

沙发
海中水| | 2015-7-17 09:03 | 只看该作者
辛苦了。这帖子真心的不错。

使用特权

评论回复
板凳
wmj_qp960524| | 2016-7-19 15:59 | 只看该作者
这个可以,新手路过

使用特权

评论回复
地板
zhengyu12| | 2016-7-30 10:36 | 只看该作者
我想问一下PWM到底干嘛的,我只知道它在通信里是配合d类功放的脉宽调制,但是在DSP中它是一个模块,麻烦您能言简意赅的告诉我它做什么用的吗

使用特权

评论回复
5
zhangmangui|  楼主 | 2016-7-31 20:58 | 只看该作者
zhengyu12 发表于 2016-7-30 10:36
我想问一下PWM到底干嘛的,我只知道它在通信里是配合d类功放的脉宽调制,但是在DSP中它是一个模块,麻烦您 ...

一般用于运动控制 或  电源等中
你可以将其理解为一个可以通过数字调制占空比值的一个等效模拟电压输出

使用特权

评论回复
6
llstarh| | 2016-8-3 13:46 | 只看该作者
辛苦,版主

使用特权

评论回复
7
zhangmangui|  楼主 | 2016-8-3 21:39 | 只看该作者

为人民服务

使用特权

评论回复
8
apple武| | 2017-7-20 17:20 | 只看该作者
我想请教下:我在用户指南中,关于TZ寄存器没有特别注明用到了保护,你怎么知道要加EALLOW的???谢谢大神的帖子,我在调故障捕获时,一直捕获不了,最后看完你的帖子加上EALLOW后就好了。

使用特权

评论回复
9
apple武| | 2017-7-20 17:27 | 只看该作者

刚又在那个系统控制和中断的那个文档里面看到了,好坑爹,那个pwm的文档上面都没有提了~~

使用特权

评论回复
10
zhangmangui|  楼主 | 2017-7-20 21:57 | 只看该作者
apple武 发表于 2017-7-20 17:27
刚又在那个系统控制和中断的那个文档里面看到了,好坑爹,那个pwm的文档上面都没有提了~~
...

要到讲寄存器的手册里查看

使用特权

评论回复
11
艾鸣之助| | 2020-8-25 21:35 | 只看该作者
点赞点赞

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:欢迎进入【TI DSP 论坛】 & 【DSP 技术】           TI忠诚粉丝!

935

主题

26376

帖子

589

粉丝