STC12C5A60S2的PCA模块输出PWM波

PCA是一个模块,是一个硬件结构,具体的如下图所示

STC12C5A60S2的PCA模块输出PWM波_第1张图片

16位PCA定时器/计数器相当于定时器0/1。每经过一个时钟周期会自动加1,时钟周期来源与下图几部分:

STC12C5A60S2的PCA模块输出PWM波_第2张图片

 

一个时钟周期可能为(SYSclk/1,SYSclk/2...),最后一个外部输入指的是给他外接的晶振源。


模块0/1是十六位的捕获/比较模块。这个模块的工作方式有四种:  1、上升/下降沿捕获    2、软件定时器   3、高速脉冲输出  4、克调制脉冲输出

至于要在哪一个模式下工作,可以通过配置寄存器来进行完成

STC12C5A60S2的PCA模块输出PWM波_第3张图片

在手册中有一个配置表格,我们按自己的要求来进行选择即可。例如我们选择  8位PWM,无中断模式


这是最简单的模式,去掉那些烦人的中断,对了虽然PCA模块可以配置成不同的模式,但是无论在什么模式下,所触发的任何中断,都只有一个中断入口。代号为7。

当将PCA模块配置成上述模式之后,再经过一些配置后,会出现在相应的引脚发出相应的PWM波形


下来以手册中例程来对PWM的生成过程进行一个分析。

CMOD = 0x02  //设置PCA的时钟源为SYSclk/2,并且禁止PCA定时器的溢出中断

CCAP0H=CCAP0L=0x80;   //设置占空比为50%

CCAPM0 = 0X42;       //设置PCA的工作模式为8位PWM并且不允许任何中断


为什么CCAP0H=CCAP0L=0X80 PWM的占空就为50%呢?下来看这幅图

STC12C5A60S2的PCA模块输出PWM波_第4张图片


CL是PCA模块中的定时器的低八位寄存器,他的变化范围为0~255,CCAP0L是PCA模块0的数据寄存器,他的值的取值范围为0~255,当CCAP0L=0X80时,即CCAP0L=128。

然后128和CL的值进行比较,CL比CCP0L小则,引脚输出低电平,反之,输出高电平。因为CL的值是每经过一个时钟周期加1,加到255时,溢出重新置0。

也就是说CL在0~128之前,CL都一直小于CCP0L,也就是引脚会一直低电平,一旦CL值超过128,引脚会输出高电平。128位256的一半,所以高电平的时间为整个PWM周期的一半,即占空比为50%。


当我们改变CCP0L的值,就会去改变PWM的占空比,这也就是所说的脉宽调制。

要改变PWM的周期,只能改变CL的取值范围,但是CL的取值范围是不可改变的,因为CL是一个8位寄存器。所以只能是改变CL每次加1的速度(原来CL加1用0.1s,现在要改为0.05s)也就是说我们要时钟源的频率。这种方法并没有被PCA模块所用,PCA模块所改变PWM频率的方法为,时钟源选择T0的溢出率,或者是选择外部时钟晶振源。


上述为个人理解,下图为手册中的流程

STC12C5A60S2的PCA模块输出PWM波_第5张图片













你可能感兴趣的:(51单片机)