tag 标签: epwm

相关博文
  • 热度 22
    2014-2-23 12:37
    2621 次阅读|
    0 个评论
    看各位大神都在EDNchina上发表自己的技术博客,特权、王敏志大神是FPGA领域内大牛级别的人物,看他们的技术博客总能收获良多。夏宇闻老师的书加上这两位大神的博文让我在探索FPGA的世界中少走了很多弯路。自己也希望能有一天像他们那样,对某个技术既有全面的掌握,更有独到的见解。看他们写的那么优秀的博文,我甚至不敢在网站上去发表自己的见地,总觉得自己的想法是肤浅的,没有意义的。犹豫了很久,今天还是鼓起勇气来写一篇,是的,不敢暴露自己的错误就永远不会进步,不发表自己的观点,就无法得到高手的指正。记得那位写MSP430F147的软核的大牛说过一句:我写的这个东西不会拿来卖钱,只会起到抛砖引玉的作用,吸引更多的人进入到这个领域,同时引出真正的大神。 花了两天的时间,仔细把F2802x系列的ePWM模块的子模块看了一遍,没有强迫自己去记那些繁琐的寄存器,只是对各个模块的功能有了一些初步的印象,从官方的介绍中抽象出了便于自己理解的模型。这个系列的ePWM主要由以下几个子模块构成:时基模块(Time-base module)、计数比较模块(counter compare module)、动作限定模块(Action qualitier module),死区产生模块(Dead-band module),斩波模块(PWM chopper module),制动模块(Trip zone module),事件触发模块(Event trigger module),数字比较模块(Digital compare module)。 时基模块说的简单点就是一个计数器模块。了解PWM波产生机理的人都知道,PWM波产生就是一个计数器不断的循环计数,然后另外有一个比较模块,时刻将该计数器中的计数值与自己设定的某个值相比,当计数值与预设值相等时,则产生一个高脉冲,对应的动作模块在接受到这个高脉冲时就会产生拉高、拉低或翻转输出的动作,即实现PWM波产生。那么这个时基模块其实就是扮演的一个计数器的角色。这个计数器和大多数计数器一样,也可以进行增计数(up model)、减计数(down model)、增减计数(up-down model),不过,这个计数器比其它计数器高级一点的地方就在于它含有一个同步功能。比如有三个ePWM模块工作,那么就有三个这样的计数器。如果不进行同步,那么这三个计数器中的值之间的关系是不确定的,也就导致各个ePWM输出的PWM波的相位是不确定的。如果我们需要各个ePWM模块的输出有严格的相位关系(如相差180°),那么就可以采用这个同步功能,将各个计数器产生同步事件时的初始值进行设定,然后给出一个同步信号,那么各个计数器的值就会马上从设定的初始值处开始继续计数,通过这种方式,即可实现多路PWM波相位限定的功能。(PS:记得去年电赛假期培训时,用FPGA产生两路相位可调的PWM波,PWM波是出来了,可就是无法调整相位,采用了很多种方法都没能实现,最后不得不放弃改而用别的方案,这次看到这种设计方式,顿觉高明,那个没能实现的模块我想这次我会很快就能写出来了。也许这种设计在大神们眼中早已司空见惯,可对于我们这种摸着石头过河的本科僧来说,还是很有含金量的。) 当然,时基模块还会产生一系列的输出信号,如(计数值==0(CTR=0))、(计数值==PRD(CTR=PRD))以及计数器计数方向((CTR Dir)向上or向下,用于up-down模式中),这些信号作为其他模块的输入信号,后面会讲到。这里我也就不多说,所知甚浅嘛哈哈,再多说就是关公面前耍大刀了。 和时基模块有密切关系的另一个模块就是计数比较模块,这个模块在上面已经有提到。这里的计数比较模块主要实现的功能就是每个系统时钟到来时将预设比较值与时基模块中计数器的计数值进行比较,当计数值与比较器中预设值相等时则产生一个计数时钟周期的高脉冲,这个高脉冲则会触发动作限定模块产生对应的高低电平变化,即产生PWM波。每个计数比较模块都有两个比较通道,这两个比较通道产生的比较事件都可对两个输出(EPWMxA、EPWMxB)的状态进行控制。总体来说,这个比较模块就是一路输入,两路输出。输入是计数器中的计数值,输出是两个比较通道上的状态(CTR=CMPA,CTR=CMPB),预设值与计数值相等则输出高电平,不等则输出低电平。 动作限定模块就是决定当比较事件发生时输出上究竟作何变化的模块。这个模块有5个输入信号,其中(计数值==0(CTR=0))、(计数值==PRD(CTR=PRD))以及计数器计数方向((CTR Dir)向上or向下,用于up-down模式中)这三个信号来自时基模块,两个比较通道上的状态(CTR=CMPA,CTR=CMPB)来自计数比较模块。动作限定模块根据控制寄存器中的设定,对输入的5路信号进行反应,输入的CTR=0、CTR=PRD信号都可通过设置直接影响输出,当为增计数模式或减计数模式时,CTR=CMPA、CTR=CMPB都可通过设置直接影响输出,当为增减计数模式时,CTR=CMPA、CTR=CMPB则配合CTR Dir信号进行输出状态的控制。动作限定模块可通过设置,根据输入信号对输出产生拉高、拉低、翻转、保持四种动作。 死区产生模块的作用就是对来自动作限定模块的两路输出PWM波的上升沿和下降沿进行一定的延时,延时时间可设定。模块即可只对输入信号的上升沿或下降沿延时,也可对上升沿和下降沿都进行延时。 斩波模块的作用就是对加入死区后的PWM波用一个更高频率的载波进行二次调制,以得到更高的信号频率。斩波模块可对调制后的信号第一个脉冲宽度进行调制,并调制其后脉冲的占空比。这样做的目的是为了保证第一个脉冲能让被驱动的开关管有足够的驱动功率以便顺利开启。 制动模块的作用就是根据外部制动输入信号对PWM输出状态进行强制限定,已达到迅速关闭输出的效果。有6组输入制动信号,TZ1-TZ6,TZ1-TZ3由外部输入引脚供源,TZ4由EQEP1ERR供源,当然,这个信号并不是所有的器件都有,只有在包含EQEP1模块的器件中才有。TZ5被连接至系统时钟故障逻辑模块,TZ6被连接至CPU的EMUSTOP信号。数字比较信号也可被用作制动输入信号。所有的制动输入信号都可以被配置来产生单次或循环的制动动作。模块同时支持软件强制制动。 事件触发模块就是通过设置对来自时基模块,计数比较模块,数字比较模块的信号进行处理并触发中断或ADC转换的模块。 数字比较器模块就是将模拟比较器的输出和外部输入制动信号进行比较以产生制动信号。对于这两点,脑海中不是特别清晰,感觉理解有误,也就不敢多言,怕误导了大家。 补充一点,很多模块中的寄存器都有一个影子寄存器,计数比较模块的预设值寄存器CMPx有一个影子寄存器,动作限定模块中的AQCSFRC也有一个影子寄存器。所谓影子寄存器,其与活动寄存器地址相同,当使用影子寄存器时,对活动寄存器的读取并不是直接读到的活动寄存器中的值,而是影子寄存器中的值,同样的,对活动寄存器的写也并不是立即写到了活动寄存器中,而是先写在影子寄存器中。影子寄存器中的值只有在某个特定的事件产生时才会与活动寄存器进行同步,如时基计数器中的值等于0或PRD。即影子寄存器相当于对应活动寄存器的一个缓存,对活动寄存器的读写都是在对影子寄存器进行操作,影子寄存器每当一个周期性的事件到来时与活动寄存器进行一次同步。这样就有可能出现对寄存器的写并不能马上生效的问题,从而影响事件延迟发生。例如,当前计数器为增计数模式,影子寄存器与活动寄存器的同步事件设为当计数值=PRD时。某一时刻计数值为0x0080,而预设比较寄存器的值为0x007F,此刻给预设比较寄存器写入0x0090这个值,这个值并不会直接写入活动的预设比较值寄存器,而是写入了对应的影子寄存器,这样,活动的预设比较器中的值还是0x007F,当计数值增加到0x0090时并不会产生比较事件。只有当计数值达到PRD的值时,活动的预设比较寄存器的值从对应的影子寄存器中被更新为0x0090,只有当计数器下一轮计数到0x0090时才会产生比较事件。即某个突变的预设比较值的变化有可能会因为影子寄存器的存在而产生一个PRD的延迟。TI的TMS320x2802x, 2803x Piccolo Enhanced Pulse Width Modulator (ePWM) Module Reference Guide 提供了如何避免这种问题的详细解决方案。(参看P44。) 初次接触这个芯片,以前自己一直是搞硬件的(PCB,FPGA)。现在因工作需要开始学习DSP,难免储备不够,理解中有偏差,若有不对的地方,还劳烦各位大神指出,以便小弟学习更正。