DSP

事件管理器――PWM

2019-07-13 11:16发布

事件管理器――PWM 
2011年02月15日  本文转载,原文地址:http://zj419zj.iteye.com/blog/1359333
  “简简单单DSP”系列学习活动―第七期事件管理器――PWM 
  四、 PWM电路 
  每一个事件管理器有三个比较单元,每一个比较单元有两个互补的PWM输出,这样三个比较单元就可以产生6路PWM,并且死区时间和输出极性可编程,能够被灵活的应用在电机控制、三相电源变换器中。 
  PWM单元电路包括如下功能单元: 
  A、 非对称/对称波形发生器 
  B、 可编程的死区单元 
  C、 输出逻辑 
  D、 空间矢量PWM状态机 
  PWM单元的存在就减少了CPU的开销,只要设置好就会自动产生PWM波形,就像DMA的存在一样,也同定时器工作一样。可以用到它的中断去改变占空比,如果是固定输出的配置好一切皆OK。对于EVA模块产生PWM用到的寄存器主要有:CMPRX、T1PR、T1CNT、T1CON、COMCONA、ACTRA、DBTCONA(死区控制寄存器),他用的时基单元是通用定时器1,参照上面说得比较单元的设置,因此还包括通用定时器1的基本设置。 
  使用比较单元以及相关电路产生PWM波形,需要对事件管理器的寄存器进行配置,具体步骤和C代码如下: 
  (1)时钟设置和通用定时器1的时钟设置操作一样,包括选择内部还是外部时钟以及与分频系数在设置这个之前要保证EVA的时钟开启; 
  SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;// EVA的时钟开启 
  EvaRegs.T1CON.bit.TCLKS10=0;//选择内部时钟 
  EvaRegs.T1CON.bit.TPS=3;//预分频8倍,如果HSPCLK=150M,那么通用定时器时钟频率是150/8M. 
  (2) 设置通用定时器1,参照上面的通用定时器设置,这里包括设置T1CNT,T1PR,通常T1CNT初始化设置为0,T1PR设置的是你的PWM的频率,根据自己的需要计算设置。 
  (3) 设置CMPRX,这个就是设置你的占空比 
  EvaRegs.CMPR1 = 0x0C00; 
  EvaRegs.CMPR2 = 0x3C00; 
  EvaRegs.CMPR3 = 0xFC00; 
  通用定时器计数器T1CNT一直与比较寄存器比较,当发生比较匹配后,输出PWM引脚就会根据您的设置跳变,通用定时器计数器T1CNT继续计数一直到与周期寄存器周期匹配后,PWM输出引脚再次跳变,这样一直循环下去。 
  (4) 设置ACTRA 
  比较方式控制寄存器就是控制输出引脚发生跳变时的极性,还有就是空间矢量PWM产生的设置,这里不作介绍。ACTRA后12位设置PWM输出跳变的极性,每两位设置一个PWM引脚,这里设置和比较产生PWM时一样,需要注意的是一个比较寄存器控制的互补输出的一对PWM设置要正好相反。 
  EvaRegs.ACTRA.all = 0x0666;//PWM1、PWM3、PWM5输出高有效,PWM2 PWM4 PWM6输出低有效 
  (5) 设置比较控制寄存器COMCONA 
  这个寄存器包括设置比较寄存器CMPRX重新装载条件、方式控制寄存器重新装载条件、空间矢量PWM模式使能、使能比较寄存器、全比较器输出使能,其他三个比较器输出使能。 
  具体设置如下: 
  (5)比较器控制寄存器COMCONA设置 
  A、设置CMPRX重载条件 
  EvaRegs.COMCONA.bit.CLD=0;//当T1CNT=0(下溢) 
  EvaRegs.COMCONA.bit.CLD=1;//当T1CNT=0或T1CNT =T1PR(下溢后周期匹配) 
  EvaRegs.COMCONA.bit.CLD=2;//立即 
  EvaRegs.COMCONA.bit.CLD=3;//保留,结果不可测) 
  B、方式控制寄存器ACTRA重载条件设置 
  EvaRegs.COMCONA.bit.ACTRLD=0;// 当T1CNT=0(下溢) 
  EvaRegs.COMCONA.bit.ACTRLD=1; 当T1CNT=0或T1CNT =T1PR(下溢后周期匹配) 
  EvaRegs.COMCONA.bit.ACTRLD=2;// 立即 
  EvaRegs.COMCONA.bit.ACTRLD=3;// 保留,结果不可测 
  E、 比较器使能位设置 
  EvaRegs.COMCONA.bit.CENABLE=0;//禁止比较操作,影子寄存器变透明 
  EvaRegs.COMCONA.bit.CENABLE=1;//使能 
  F、 单个比较器使能 
  EvaRegs.COMCONA.bit.FCMP1OE=0;//全比较器1禁止 
  EvaRegs.COMCONA.bit.FCMP1OE=1;// 全比较器使能 
  G、全比较器使能 
  EvaRegs.COMCONA.bit.FCOMPOE=0;// EVA的三个比较器都禁止 
  EvaRegs.COMCONA.bit.FCOMPOE=1;// EVA的三个比较器都使能 
  H、空间矢量PWM模式使能位 
  EvaRegs.COMCONA.bit.SVENABLE=0;// 空间矢量PWM模式禁止 
  EvaRegs.COMCONA.bit. SVENABLE =1;// 空间矢量PWM模式使能 
  (6) 死区控制寄存器DBTCONA 
  死区控制寄存器设置的是使能死区和死区时间。可编程的死区单元有以下特点: 
  A、 一个16位死区控制寄存器DBTCONA,可读写 
  B、 一个16位输入时钟预定标器,其实就是分频器 
  C、 CPU时钟输入 
  D、 3个4位减计数的定时器 
  E、 死区时间是由CPU时钟、分频系数和那个3个4位减计数器共同确定的,DBTCONA【4~2】分频系数,以2的DBTCONA【4~2】次方为系数,DBTCONA【11~8】为递减计数器的值。 
  死区配置如下: 
  EvaRegs.DBTCONA.bit.DBTPS=3;//2的3次方对CPU时钟8分频 
  EvaRegs.DBTCONA.bit.DBT=15;//递减计数器从15开始 
  /* / 
  EvaRegs.DBTCONA.bit.EDBT1=1;//死区定时器1使能 
  EvaRegs.DBTCONA.bit.EDBT2=1;//死区定时器2使能 
  EvaRegs.DBTCONA.bit.EDBT3=1;//死区定时器3使能 
  (7) 相应的GPIO设置 
  要使用它的比较输出PWM功能,相应的GPIO要设置为复用功能,在DSP281x_Gpio.c库函数中void InitGpio(void)子函数设置,在主函数中调用。 
  函数C代码如下: 
  void InitGpio(void) 
  { 
  EALLOW; 
  GpioMuxRegs.GPAMUX.bit.PWM1_GPIOA0=1; 
  GpioMuxRegs.GPAMUX.bit.PWM2_GPIOA1=1; 
  GpioMuxRegs.GPAMUX.bit.PWM3_GPIOA2=1; 
  GpioMuxRegs.GPAMUX.bit.PWM4_GPIOA3=1; 
  GpioMuxRegs.GPAMUX.bit.PWM5_GPIOA4=1; 
  GpioMuxRegs.GPAMUX.bit.PWM6_GPIOA5=1; 
  EDIS; 
  } 
  (8)配置的C代码如下,这些在DSP281x_Ev.c库函数的void InitEv(void)子函数中,在主函数初始化的时候调用即可。 
  void InitEv(void) 
  { 
  EvaRegs.T1CON.bit.TCLKS10=0;//选择内部时钟 
  EvaRegs.T1CON.bit.TPS=4;//预分频8倍,如果HSPCLK=150M,那么通用定时器时钟频率是150/8M. 
  EvaRegs.T1CON.bit.TMODE=2;//连续增计数模式 
  EvaRegs.T1CNT=0x0000; //计数器清0 
  EvaRegs.T1PR =20000; //周寄存器的值最大为65535 
  EvaRegs.CMPR1=10000;//设置比较寄存器1 
  EvaRegs.CMPR2=8000;//设置比较寄存器2 
  EvaRegs.CMPR3=5000;//设置比较寄存器3 
  EvaRegs.DBTCONA.bit.DBTPS=3;//2的3次方对CPU时钟8分频 
  EvaRegs.DBTCONA.bit.DBT=15;//递减计数器从15开始 
  EvaRegs.DBTCONA.bit.EDBT1=1;//死区定时器1使能 
  EvaRegs.DBTCONA.bit.EDBT2=1;//死区定时器2使能 
  EvaRegs.DBTCONA.bit.EDBT3=1;//死区定时器3使能 
  EvaRegs.ACTRA.all = 0x0666;//PWM1、PWM3、PWM5输出高有效,PWM2 PWM4 PWM6输出低有效 
  EvaRegs.COMCONA.bit.CLD=1;//当T1CNT=0或T1CNT =T1PR(下溢后周期匹配) 
  EvaRegs.COMCONA.bit.ACTRLD=1;// 当T1CNT=0或T1CNT =T1PR(下溢后周期匹配) 
  EvaRegs.COMCONA.bit.CENABLE=1;//使能 
  EvaRegs.COMCONA.bit.SVENABLE=0;// 空间矢量PWM模式禁止 
  EvaRegs.COMCONA.bit.FCOMPOE=1;// EVA的三个比较器都使能 
  EvaRegs.T1CON.bit.TENABLE=1;//使能定时器1 
  }