社区导航

 

搜索
查看: 11293|回复: 29

【玩转C2000 Launchpad】+EPWM模块实现SPWM波形输出

[复制链接]

1906

TA的帖子

0

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

发表于 2012-12-26 15:15 | 显示全部楼层 |阅读模式
       F2802X 的EPWM 模块内部由8 个小模块组成,这8 个模块可以相互配合,产生符合要求的PWM波形。其实,但是只需要利用TB(Time—base)、CC(Counter-compare)、AQ(Action-qualifier) 这三个子模块就能产生实验所需要的PWM 波形。
       先给初学者回顾一下SPWM:所谓SPWM,就是在PWM 的基础上改变了调制脉冲方式,脉冲占空比在时间轴上按正弦规率排列,这样输出波形经过适当的滤波可以做到正弦波输出。它广泛用于直流交流逆变器、电机细分等。具体实现方法为,用软件计算出按正弦规律变换的值,比如计算出64 个点的值,定时向CMPA 发送计算出来的变化值,发送完64 次后,完成了一个周期的正弦波输出,定时发送的时间由TBPRD 决定。那计算出来的正弦波周期为TBPRD*64。

#include "DSP28x_Project.h"   
#define PWM1_INT_ENABLE  1   
/**Description  ** 全局变量定义*/
volatile Uint16 temp;
int16 *sin_ptr = (int16 *)0x3fe001;//
//解释"int16 *sin_ptr = (int16 *)0x3fe001;"在 F2802X 的ROM 区域中,包含有产生正弦波和余弦波各512 点的数据表,存储空间 0X3FE000 开始,具体的存储空间可以参考它的数据手册。
/*Description  ** 函数定义*/
void InitEPwmTimer(void);              // EPWM模块初始化程序
void update_compare(void);             // 比较值定义
interrupt void epwm1_timer_isr(void);  // 中断服务程序

void main(void)
{
   InitSysCtrl();                      // 系统初始化函数

   InitEPwm1Gpio();                    // EPWM端口初始化
   DINT;                               // 关闭CPU中断

   InitPieCtrl();                      // PIE中断控制
   IER = 0x0000;                       // 关闭中断使能
   IFR = 0x0000;                       // 清除中断标志位

   InitPieVectTable();
   EALLOW;  
   PieVectTable.EPWM1_INT = &epwm1_timer_isr;//中断函数入口
   EDIS;                               // 赋值中断函数地址

   InitEPwmTimer();                    // 初始化EPWM模块

   IER |= M_INT3;                      // 使能CPU级第三组中断

   PieCtrlRegs.PIEIER3.bit.INTx1 = PWM1_INT_ENABLE;
                                       // 使能PIE3.1
   EINT;                                // 使能全局中断
   ERTM;                                //

   for(;;)
   {
       asm("          NOP");
   }

}

/*EPWM模块初始化函数*/
void InitEPwmTimer()
{

   EALLOW;
   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;        // 停止TB计数
   EDIS;

   EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;  
   EPwm1Regs.TBCTR = 0x0000;                     // 清除TB计数器
   EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;      // 系统时钟分频
   EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
   EPwm1Regs.TBCTL.bit.PHSEN = 0;
   EPwm1Regs.TBPHS.half.TBPHS = 0;
  
   EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
   EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
   EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
   EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
  
   EPwm1Regs.CMPA.half.CMPA = 0;                 //
   EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;            //
   EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;          //

   EPwm1Regs.TBPRD = 512;
   EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;    // 增计数模式
   EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;     // 中断使能选择
   EPwm1Regs.ETSEL.bit.INTEN = PWM1_INT_ENABLE;  // 使能中断
   EPwm1Regs.ETPS.bit.INTPRD = ET_1ST;           //


   EALLOW;
   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;         // TB时钟计数
   EDIS;

}


/*sina值更新函数*/
//主要更新CPMA的值
void update_compare()
{
       temp =   (((Uint16)((*sin_ptr)+16384))>>6);
    EPwm1Regs.CMPA.half.CMPA = temp;
    if(temp > 1024)
    {
         asm("   ESTOP0");
    }  
                  
    sin_ptr += 8;
    if(sin_ptr >= (int16 *)0x3fe401)
    {
      sin_ptr = (int16 *)0x3fe001;
    }
}


/*epwm1中断服务程序*/
//c2000的中断函数都要用“inerrupt”申明
interrupt void epwm1_timer_isr(void)
{
   update_compare();
   EPwm1Regs.ETCLR.bit.INT = 1;
   PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
}

回复

使用道具 举报

1906

TA的帖子

0

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

 楼主| 发表于 2012-12-27 16:45 | 显示全部楼层

回复 11楼 dontium 的帖子

“32-bit samples for one and a quarter period sine wave ”  意思是存放着一又四分之一的数据表。

回复

使用道具 举报

1906

TA的帖子

0

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

 楼主| 发表于 2012-12-26 15:24 | 显示全部楼层
我们用的是CPIO0的第二功能,这个在GPIO的初始化函数中完成设定。在它的输出端口接一个1uf的电容和一个1k的电阻再加一个103的电容接地就可以看到我们要的正弦波了。
话说淘了一台优利德示波器,秀一秀漂亮的波形。

UNIT01.BMP
波形参数:
UNIT02.BMP
双踪波形:
UNIT03.BMP
参数:
UNIT04.BMP

UNIT05.BMP
UNIT01.BMP
UNIT02.BMP

点评

示波器挺有意思 多少钱在哪淘的啊  详情 回复 发表于 2012-12-26 15:36

回复

使用道具 举报

305

TA的帖子

25

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2012-12-26 15:36 | 显示全部楼层

回复 沙发 IC爬虫 的帖子

示波器挺有意思 多少钱在哪淘的啊

点评

矿坛!:lol  详情 回复 发表于 2012-12-26 15:41

回复

使用道具 举报

1906

TA的帖子

0

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

 楼主| 发表于 2012-12-26 15:41 | 显示全部楼层

回复 板凳 7leaves 的帖子

矿坛!

点评

多少钱阿  详情 回复 发表于 2012-12-26 15:47

回复

使用道具 举报

305

TA的帖子

25

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2012-12-26 15:47 | 显示全部楼层

回复 4楼 IC爬虫 的帖子

多少钱阿

点评

不告诉你!:funk:  详情 回复 发表于 2012-12-26 15:48

回复

使用道具 举报

1906

TA的帖子

0

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

 楼主| 发表于 2012-12-26 15:48 | 显示全部楼层

回复 5楼 7leaves 的帖子

不告诉你!

点评

:puzzle:  详情 回复 发表于 2012-12-26 15:49

回复

使用道具 举报

305

TA的帖子

25

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2012-12-26 15:49 | 显示全部楼层

回复 6楼 IC爬虫 的帖子


回复

使用道具 举报

3365

TA的帖子

420

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

荣誉会员勋章

发表于 2012-12-26 15:49 | 显示全部楼层
....

回复

使用道具 举报

1万

TA的帖子

15

TA的资源

版主

Rank: 6Rank: 6

发表于 2012-12-26 16:24 | 显示全部楼层

楼主的示波器就是一般的示波器,只不过用反显功能

点评

这个示波器我已经很知足了。  详情 回复 发表于 2012-12-26 16:32
http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr

回复

使用道具 举报

1906

TA的帖子

0

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

 楼主| 发表于 2012-12-26 16:32 | 显示全部楼层

回复 9楼 ddllxxrr 的帖子

这个示波器我已经很知足了。

回复

使用道具 举报

1万

TA的帖子

33

TA的资源

版主

Rank: 6Rank: 6

发表于 2012-12-26 22:38 | 显示全部楼层
sin表长1282 (0x502),但楼主在偏移 0x401时就返回了,不知道这是怎么回事

Sine/Cosine Table, IQ Math Table
– Table size: 1282 words
– Q format: Q30
– Contents: 32-bit samples for one and a quarter period sine wave

点评

“32-bit samples for one and a quarter period sine wave ” 意思是存放着一又四分之一的数据表。  详情 回复 发表于 2012-12-27 16:45
F2802X 的ROM 区域中,包含有产生正弦波和余弦波各512 点的数据表  详情 回复 发表于 2012-12-27 16:16

回复

使用道具 举报

1906

TA的帖子

0

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

 楼主| 发表于 2012-12-27 16:16 | 显示全部楼层

回复 11楼 dontium 的帖子

F2802X 的ROM 区域中,包含有产生正弦波和余弦波各512 点的数据表

回复

使用道具 举报

1906

TA的帖子

0

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

 楼主| 发表于 2012-12-27 16:51 | 显示全部楼层
当在0x501时返回时的波形为。
UNIT06.BMP

当在0x441时返回时的波形为
UNIT08.BMP

这应该很容易理解了。

回复

使用道具 举报

1万

TA的帖子

33

TA的资源

版主

Rank: 6Rank: 6

发表于 2012-12-27 18:32 | 显示全部楼层
one and a quarter 这句没有注意到

谢谢楼主

点评

有人认真看我的帖子而且有所收获我很高兴!:)  详情 回复 发表于 2012-12-27 18:40

回复

使用道具 举报

1906

TA的帖子

0

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

 楼主| 发表于 2012-12-27 18:40 | 显示全部楼层

回复 15楼 dontium 的帖子

有人认真看我的帖子而且有所收获我很高兴!

回复

使用道具 举报

1万

TA的帖子

33

TA的资源

版主

Rank: 6Rank: 6

发表于 2012-12-27 18:45 | 显示全部楼层
1280才是 1又1/4,不知道多了两个word是不是它的“插头插座”?

点评

这个我也没搞懂  详情 回复 发表于 2012-12-27 18:52

回复

使用道具 举报

1906

TA的帖子

0

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

 楼主| 发表于 2012-12-27 18:52 | 显示全部楼层

回复 17楼 dontium 的帖子

这个我也没搞懂

回复

使用道具 举报

313

TA的帖子

2

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

发表于 2013-5-4 18:59 | 显示全部楼层
你好,用这种方法可以得到的正弦波,它的最高频率可以达到多少啊

回复

使用道具 举报

127

TA的帖子

35

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2013-7-17 17:48 | 显示全部楼层
好给力,赞一个!

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 /5 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-2-20 00:52 , Processed in 0.524656 second(s), 23 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表