历史上的今天
今天是:2025年01月29日(星期三)
2019年01月29日 | STC12C5A60S2的PCA模块输出PWM波
2019-01-29 来源:eefocus
PCA是一个模块,是一个硬件结构,具体的如下图所示

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

一个时钟周期可能为(SYSclk/1,SYSclk/2...),最后一个外部输入指的是给他外接的晶振源。
模块0/1是十六位的捕获/比较模块。这个模块的工作方式有四种: 1、上升/下降沿捕获 2、软件定时器 3、高速脉冲输出 4、克调制脉冲输出
至于要在哪一个模式下工作,可以通过配置寄存器来进行完成

在手册中有一个配置表格,我们按自己的要求来进行选择即可。例如我们选择 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%呢?下来看这幅图

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的溢出率,或者是选择外部时钟晶振源。
上述为个人理解,下图为手册中的流程

史海拾趣
|
企业虚拟化项目十个重要技术问题中国IDC圈 利用虚拟化技术,把软件从硬件当中抽取出来,创建灵活、动态的环境,这样的好处很吸引人。不过能 否成功实施该项技术则取决于所需技能、安全和管理工具以及业务驱动因素是否到位。因为,在有些情 况下 ...… 查看全部问答> |
|
大家好,我在往开发板里烧写NK文件的时候在到达99%的时候,超级终端出现了: OEMVerifyMemory FAILED !OEMVERIFYMEMORY: Invalid image 然后烧写进度就停留在了99%,请问是什么错误啊?应该如何修改呢?… 查看全部问答> |
|
【我给XILINX资源中心做贡献】设计小技巧--Xilinx公司内部资料 设计小技巧--Xilinx公司内部资料这是一个在设计中常犯的错误列表,这些错误使得你的设计不可靠或者速度较慢。为了提高你的设计性能和提高速度的可靠性,你必须确定你的设计通过所有的这些检查。… 查看全部问答> |
|
小弟刚接触stm32,图片上那个画红线的愣是没看懂,为什么给寄存器赋值先与运算一下呢?刚开始寄存器的值不是复位值么?那也就是全0,与运算一下后不都变成......先谢谢大家啦! [ 本帖最后由 九霄飞瀑 于 2012-3-8 23:51 编辑 ]… 查看全部问答> |




