打印

(转) F28335 ePWM模块使用总结

[复制链接]
6154|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
五谷道场|  楼主 | 2013-3-14 14:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  这几天用28335做一个逆变器,用到了28335 ePWM模块,刚开始对ePWM操作很模糊,无从下手,在网上也找了很多资料,发现看完了之后更加模糊,最后下定决心,看TI 28XX ePWM模块的英文文档,通过二天的努力,终于攻下了ePWM模块,现讲学习总结写出来,和学习28335的朋友们一起分享,也希望朋友们也把你们关于28335的一些好的学习心得写出来,大家相互交流下。28335在TI C2000系列DSP里面比较新的,有关资料基本上都是英文的,很不利于初学者,所以已经在学习或学习过28335的朋友可以相互帮助相互交流下,与人方便就是与己方便。
    言归正传,28335 ePWM模块总结如下:
    1、ePWM模块总共有7个模块:
   (1)时间基准模块   ----------TB   
     (2)计数器比较模块 ----------CC
     (3)动作限定模块   ----------AQ
     (4)死区控制模块   ----------DB
     (5)PWM斩波模块    ----------PC
     (6)错误控制模块   ----------TZ
     (7)事件触发模块   ----------EZ
      每个模块各自作用如下:
    TB :为输出PWM产生始终基准TBCLK,配置PWM的时钟基准计数器TBCTR,设置计数器的计数模式,配置硬件或软件同步时钟基准计数器,确定ePWM同步信号输出源;
    CC:确定PWM占空比,以及ePWM输出高低电平切换时间;
    AQ:确定计数器和比较寄存器匹配时产生动作,即ePWM 高低电平的切换;
    DB:配置输出PWM上升沿或下降沿延时时间,也可以将A、B两通道配置成互补模式,我做的逆变器就是将ePWM配置成互补模式。死区时间可以编程确定;
    PC:产生高频PWM载波信号;
    TZ:当外部有错误信号产生时,对PWM输出进行相应处理,比如全置高,或拉低,或置为高阻态,从而起到保护作用。当然该功能也可以通过软件强制产生;
    EZ:使能ePWM中断,使能ePWM触发ADC采样,确定事件产生触发的速度和清除相关事件标志位。
    ePWM模块的7个模块就像一条生产线,一级一级的经过,但DSP更高级,可以实现通过配置,使得ePWM只经过我选择的生产线,没有被选择上的就不要经过。例如,死区控制模块可以需要也可以不需要,这就看实际系统需不需要了。在实际使用ePWM时,正常的发出PWM波往往只要要配置TB、CC、AQ、DB、ET五个模块。
   
    2、试着阅读28335 各模块的英文资料,其实这些资料里面,详细的介绍了各模块的使用方法和原理,以及各模块所涉及到的寄存器的详细配置,“擒贼先擒王”,虽然英文资料阅读起来比较费劲,但打开Google,相信一般的都可以搞定,在结合自己的理解,会产生意想不到的收获。英文资料里面一写模块的框图,表格式很有用,这里面涵盖了该模块运行的逻辑关系,其实DSP就是块逻辑芯片,你只要通过寄存器的配置就可以让其完成各种指定的功能,所以不要把它想的太复杂。
   
    3、可以看看TI 例程里面各模块头文件的定义,里面有些地方会有注释,从而便于理解。另外,可以自己琢磨TI 各模块例程相关寄存器的配置,从而实际寄存器配置的用法。最后说明下,附件里面包括了:我从ePWM英文资料里面截下来的某些子模块的功能框图和配置表格;ePWM TI 英文资料;我之前在HELLO DSP论坛下的一个资料“发波配置说明”(在这里要感谢那位仁兄)。

相关帖子

沙发
huangfeng33| | 2013-3-14 15:19 | 只看该作者
最近也在用ePWM,进来取经来了,收下,感谢分享。

使用特权

评论回复
板凳
airwill| | 2013-3-14 20:03 | 只看该作者
那么多的文字的手册, 精练地浓缩成这么小的**, 还有感谢体会, 支持支持.

使用特权

评论回复
地板
holddreamair| | 2013-10-21 15:37 | 只看该作者
谢谢方便面!

使用特权

评论回复
5
zkybuaa| | 2013-10-21 21:03 | 只看该作者
支持楼主,正准备学习。

使用特权

评论回复
6
waitingf| | 2013-10-22 21:38 | 只看该作者
总结的很好 多谢分享

使用特权

评论回复
7
someonewho| | 2013-10-22 21:52 | 只看该作者
做项目就得是不断的总结才可以啊

使用特权

评论回复
8
specialfrin| | 2013-10-22 22:59 | 只看该作者
总结的很好 值得学习学习

使用特权

评论回复
9
someontime| | 2013-10-22 23:19 | 只看该作者
楼主辛苦了 很好很好

使用特权

评论回复
10
拿起书本| | 2014-2-13 22:06 | 只看该作者
不断上论坛,不断学习,不断总结,不断提高,顶起!

使用特权

评论回复
11
blessdxp| | 2014-5-23 11:09 | 只看该作者
谢谢,楼主

使用特权

评论回复
12
ap0408133| | 2014-5-23 14:14 | 只看该作者
过来取经

使用特权

评论回复
13
wanghui22| | 2014-5-24 16:40 | 只看该作者
谢谢楼主分享!

使用特权

评论回复
14
liuMath| | 2015-5-5 15:14 | 只看该作者
总结的不错

使用特权

评论回复
15
liuMath| | 2015-5-5 17:25 | 只看该作者
EALLOW;
   SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; // Enable ADC peripheral clock
   (*Device_cal)();
   SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 0; // Return ADC clock to original state
   EDIS;
这个是什么意思啊?   (*Device_cal)();在这里的作用是什么啊 ?

使用特权

评论回复
16
zhangmangui| | 2015-5-5 22:02 | 只看该作者
liuMath 发表于 2015-5-5 17:25
EALLOW;
   SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; // Enable ADC peripheral clock
   (*Device_cal)();

通过宏定义的方式使用函数指针对函数指定绝对地址(第一个类型转换是函数的返回值,其它的是函数的形式参数),如以下两个例子:

#define InitAnalogSystemClock (unsigned short (*) (unsigned short ClockDivider))0x0024021E

#define Device_Cal (void (*) (void)) 0x00240220

在源文件中使用通用方法定义该函数,然后在需要调用的源文件中,使用如下方式调用该函数:

unsigned short asysclk = (*InitAnalogSystemClock)(ACLKDIV4);

(*Device_Cal());

实际上,任何一个例程都有调用(*Device_Cal());这个函数,同时上面提供的链接文档中,也可以在摘要部分找到对应源代码的下载链接,里面也有类似的操作方式。

更通用一点的方法是(特别是当要实现在线升级程序时),将函数的跳转指定到一个Flash sector的最后部分,同时建立的工程应该有main函数,则它会自动通过该入口地址跳转到main执行。

如果还不够清楚,可以留下邮箱,我将一篇前段时间总结的文档和例程发给你。

使用特权

评论回复
17
caoxiaoge0314| | 2015-7-15 09:10 | 只看该作者
:P学习一下

使用特权

评论回复
18
shenmu2012| | 2015-7-15 19:51 | 只看该作者
  ePWM模块的7个模块就像一条生产线,一级一级的经过,但DSP更高级,可以实现通过配置,使得ePWM只经过我选择的生产线,没有被选择上的就不要经过。

使用特权

评论回复
19
firstblood| | 2015-7-15 22:01 | 只看该作者
TZ——当外部有错误信号产生时,对PWM输出进行相应处理,比如全置高,或拉低,或置为高阻态,从而起到保护作用。当然该功能也可以通过软件强制产生。

使用特权

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

本版积分规则

7647

主题

9805

帖子

11

粉丝