OK6410之PWM使用

来源:互联网 发布:linux关闭mysql服务 编辑:程序博客网 时间:2024/05/16 05:18

         s3c6410的PWM分别有两个定时器产生两路。PWM的时钟源可以自行选择来自于两个时钟分别是PCLK、XpwmEXLK外部时钟。从时钟源到定时器计数的过程我们看图1,如果时钟源来自于PCLK时钟线(一般频率为66MHz),那么时钟必须经过一个8位的分频计数器和多路复用模块,最终进入逻辑计数单元,通过对计数器的对比输出PWM波(如果没有设置死区时间)。如果使用外部时钟那么只要选择外部时钟源,则直接送给计数模块进行比较输出。这样就结束了分频和时钟源的选择。

          PWM的计数模块具有重载和单脉冲模式,并且支持DMA(这里暂时不提)。整个计数模块主要有两个寄存器TCNTBn(Timer Count Buffer register)和TCMPBn(Timer Count Observation register)。其中TCNTBn是一个向下计数的寄存器,TCMPBn这个寄存器一直与TCNTBn做比较。当TCNTBn>TCMPBn,PWMOUT=0,反之TCNTBn<=TCMPBn,PWMOUT=1.

                                                                 图1   PWM整体模块

          在计数当中难免会有突发的状态,比如修改计数值TCNTBn或者比较值TCMPBn。在寄存器名字命名的时候是否注意过Buffer register,Buffer即缓冲的意思,也就是说这种寄存器其实是有两个寄存器共用一个地址(可以叫做影子寄存器)。一个是我们可以操作的另一个是在工作我们无法操作的寄存器。我们在修改的时候修改的是一个可以修改的我们要进行一个触发才能将我们要修改的数据放到工作寄存器中去。但是放进去的时间是要等到工作寄存器这一周期完成。我们通过图2我们可以理解一下。

        其实产生PWM波很简单,配置的过程很简单,只要学过单片机的同学都能做到我就不讲了,涉及到pwm的寄存器也就几个。在这里需要提一下的是TCON(Timer Control Register)寄存器中的第1和第9位,分别是更新TCNTB0和TCMPB0这两个寄存器的位,当我们要修改数据时先修改数据然后更新数据当更新数据完成我们又要将它失能掉,防止不必要的修改错误产生。

原创粉丝点击