PWM模块原理及使用F28027有8路PWM(四个模块),4路HRPWM,特别对设计高精度电源提供了方便,每个PWM模块中又包括以下几个子模块:时基(Time-base)模块、计数比较(Counter-compare)模块、功能限定(Action-qualifier)模块、死区控制(Dead-band)模块、斩波(PWM-chopper)模块、事件触发(Event-trigger)模块、制动(Trip-zone)(不知道这样翻译恰当否)模块、数字比较(DigitalCompare)模块。从这些模块的命名上看,用它来做个电源,是再恰当不过的了。一、时基子模块(TB)每一个ePWM模块,都有自己的TB,它产生PWM的所有定时事件,且有同步逻辑,可以使多个PWM模块有序工作。TBPRD:PWM的计数周期寄存器。TBPHS:相位控制寄存器,在多个PWM模块级联时,可以控制每路输出的相位。当时基模块的同步脉冲到来时,使计数器从TBPHS设置的值开始计数(丢弃当前计数值)。TBCTL:TB的控制寄存器,可以对相位方向(只在up-down时有用)控制,决定是上计数时同步(PHSDIR=1)还是下计数时同步(PHSDIR=0);决定TB输入时钟的分频系数;向下一级输出的同步脉冲的输出方式;计数值重装方式、计数方式、同步允许等控制。TBCTR:计数寄存器。TB模块的当前计数值。TBSTS:TB的状态寄存器。二、计数比较子模块(CC)此模块实现与TB的比较及控制。产生CMPA、CMPB比较事件;控制PWM的占空比。CMPCTL:计数比较控制寄存器。决定是否使用影子寄存器及计数值的重装方法。CMPA:计数比较值设定寄存器ACMPAM:CMPA的影子寄存器。CMPB:计数比较值设定寄存器B三、功能限定子模块(AQ)这个子模块主要对TB及CC模块产生的事件,作出相应的响应,如计数器到达设定同期时、到达0时、到达CMPA时、到达CMPB时,相应的EPWMxA、EPWMxB的输出状态。AQCTLA:设定EPWMxA在以上事件时的输出AQCTLB:设定EPWMxB在以上事件时的输出四、死区控制子模块(DB)在同步整流及桥式电机驱动时,上下臂的控制开关(晶体管或MOS管)的导通与关闭会出现一定的延时,这有可能导致上下臂开关的同时导能现象。DB子模块可以有效地防止这种现象的发生。DBCTL:DB通用控制寄存器,主要产生死区控制的方法。DBRED:上升沿延时控制寄存器,产生延迟的周期数。DBFED:下降沿延时控制寄存器,产生延迟的周期数。五、PWM斩波模块(PC)当PWM的周期较长,用高频变压器作驱动器,就会达不到目的,并有可能烧坏器件。使用PC模块可以将PWM波经过“再调制”后的高频波作驱动就可以解决这个问题。PCCTL:PC控制寄存器,实现“再调制”波的duty控制、“调制”频率控制等。六、制动子模块(TZ)TZ模块是当系统出现问题,或者发出制动信号时,达到所期望的系统响应。F28027有3个TZ外部信号输入,TZ信号可以连接到任意一个PWM模块。当制动条件产生后,它可以使EPWMxA和EPWMxB产生:高电平输出、低电平输出、高阻输出、不动作。可以一次性(one-shot)或逐周期(cycle-by-cycle)控制。可以受DC子模块控制等TZSEL:TZ选择寄存器,用来选择TZ源TZCTL:TZ控制寄存器,用来EPWMxA、EPWMxB的输出。TZEINT:TZ中断允许寄存器。TZDCSEL:数字比较事件选择寄存器。七、事件触发子模块(ET)它由TB、CC、DC子模块触发源输入,产生CPU中断及触发ADCSOC(startofconverter),ETSEL:事件触发选择寄存器,选择触发源,SOC、中断允许控制,EPWMxSOCA、EPWMxSOCB输出控制,ETPS:触发事件分频寄存器,控制由n次事件产生后引发中断或响应。ETFRC:强制触发寄存器。用于强制产生某一响应。从以上可见,模块相互的作用及产生事件并不用CPU干预,这是实时控制所需要的,因为这样可以尽快地作为响应。如PWM输出后的某一时间产生ADC转换,都是由模块自己协调的,CPU只用设置好相应的寄存器就可以了。八、程序示例由EPWM1A和EPWM1B输出互补PWM波,并并使用TZ1及TZ2对它作制动控制。例程中还用timer1控制PWM的占空比以作演示。1、InitEPwm1Gpio(),对IO口初始化……GpioCtrlRegs.GPAMUX1.bit.GPIO0=1;//ConfigureGPIO0asEPWM1AGpioCtrlRegs.GPAMUX1.bit.GPIO1=1;//ConfigureGPIO1asEPWM1B2、InitTzGpio(),TZ口初始化……GpioCtrlRegs.GPAQSEL1.bit.GPIO12=3;//AsynchinputGPIO12(TZ1)GpioCtrlRegs.GPAQSEL2.bit.GPIO16=3;//AsynchinputGPIO16(TZ2)3、PWM模块设置//EnableTZ1andTZ2asoneshottripsourcesEALLOW;EPwm1Regs.TZSEL.bit.OSHT1=1;EPwm1Regs.TZSEL.bit.OSHT2=1;//WhatdowewanttheTZ1andTZ2todo?EPwm1Regs.TZCTL.bit.TZA=TZ_FORCE_HI;EPwm1Regs.TZCTL.bit.TZB=TZ_FORCE_LO;//EnableTZinterruptEPwm1Regs.TZEINT.bit.OST=1;EDIS;EPwm1Regs.TBPRD=6000;//SettimerperiodEPwm1Regs.TBPHS.half.TBPHS=0x0000;//Phaseis0EPwm1Regs.TBCTR=0x0000;//Clearcounter//SetupTBCLKEPwm1Regs.TBCTL.bit.CTRMODE=TB_COUNT_UP;//CountupEPwm1Regs.TBCTL.bit.PHSEN=TB_DISABLE;//DisablephaseloadingEPwm1Regs.TBCTL.bit.PRDLD=TB_SHADOW;//loadedfromitsshadowregisterEPwm1Regs.TBCTL.bit.HSPCLKDIV=TB_DIV1;//ClockratiotoSYSCLKOUTEPwm1Regs.TBCTL.bit.CLKDIV=TB_DIV1;EPwm1Regs.CMPCTL.bit.SHDWAMODE=CC_SHADOW;//LoadregisterseveryZEROEPwm1Regs.CMPCTL.bit.SHDWBMODE=CC_SHADOW;EPwm1Regs.CMPCTL.bit.LOADAMODE=CC_CTR_ZERO;EPwm1Regs.CMPCTL.bit.LOADBMODE=CC_CTR_ZERO;//SetupcompareEPwm1Regs.CMPA.half.CMPA=3000;//SetactionsEPwm1Regs.AQCTLA.bit.CAU=AQ_SET;//当计数值等于CMPA时,将PWM1A输出置高EPwm1Regs.AQCTLA.bit.PRD=AQ_CLEAR;EPwm1Regs.AQCTLB.bit.CAU=AQ_CLEAR;//SetPWM1AonZeroEPwm1Regs.AQCTLB.bit.PRD=AQ_SET;//触发ADCSOC//EPwm1Regs.ETSEL.bit.SOCAEN=1;……4、ConfigCpuTimer(&CpuTimer1,60,1000);//设置Timer15、Timer1中断:interruptvoidINT13_ISR(void)//INT13orCPU-Timer1{GpioDataRegs.GPATOGGLE.bit.GPIO3=1;EPwm1Regs.CMPA.half.CMPA++;if(EPwm1Regs.CMPA.half.CMPA5999)EPwm1Regs.CMPA.half.CMPA=1;//PieCtrlRegs.PIEACK.all|=;}九、编译运行发现,接在EPWM1A和EPWM1B的两个LED由暗至亮交替。