PCA模块是“可编程计数器阵列”的缩写,英文名称是“Programmable Counter Array”,以下的说明均以SILICON LAB生产的C8051系列微型控制器为例。
PCA包括1个16位“定时器/计数器”和5个“捕获/比较模块”。16位定时器/计数器包括1个高8位寄存器(PCA0H)和1个低8位寄存器(PCA0L),每个捕获/比较模块还有各自的16位“捕获/比较寄存器”。
PCA的定时器/计数器在运行时必须基于某个“基准时钟频率”,通过设置相应的寄存器,可以选择以下几种:
系统时钟频率
系统时钟频率的12分之一:f_osc/12
系统时钟频率的4分之一:f_osc/4
外部晶振时钟源频率的8分之一:external f_osc/8
由定时器/计数器0的溢出率所决定的频率
通过ECI输入管脚设定的外部时钟信号的频率
第一. 通过PCA的模式选择寄存器(PCA0MD)选择基准时钟频率,模式选择寄存器如下图
CIDL:设置PCA在CPU空闲模式下的模式
CIDL=0:PCA在CPU空闲模式下继续工作
CIDL=1:PCA在CPU空闲模式下停止工作
WDTE:设置看门狗模式
WDTE=0:看门狗模式关闭
WDTE=1:启动捕获/比较模块4作为看门狗定时器
WDLCK:看门狗锁定模式
WDLCK=0:看门狗解除锁定
WDLCK=1:看门狗被锁定,即看门狗有可能在下一次系统重置前不能屏蔽
CPS2、CPS1、CPS0:设置时钟基准频率
ECF:PCA定时器/计数器溢出中断使能标志
ECF=0:PCA定时器/计数器溢出时不产生中断
ECF=1:PCA定时器/计数器溢出标志位CF置1时产生中断
CPS2、CPS1、CPS0标志位配置表
第二. 通过PCA的控制寄存器(PCA0CN)可以对PCA的动作进行控制
CF:PCA定时器/计数器溢出标志位
当PCA定时器/计数器溢出时,CF自定被硬件置1,此时如果PCA0MD中的ECF设置为1时,CPU执行中断处理。注意:中断处理结束后CF不能由硬件置0,必须由软件置0
CR:定时器/计数器启停标志位
CR=0:定时器/计数器停止
CR=1:定时器/计数器启动
CCF4:捕获/比较模块4计数器中断标志位
当捕获/比较模块4执行匹配或者捕获指令成功时,此标志位被硬件自动置1,如果CCF4被允许中断时,CPU执行中断处理。注意:中断处理结束后CCF4不能由硬件置0,必须由软件置0
CCF3:捕获/比较模块3计数器中断标志位
功能同CCF4
CCF2:捕获/比较模块2计数器中断标志位
功能同CCF4
CCF1:捕获/比较模块1计数器中断标志位
功能同CCF4
CCF0:捕获/比较模块0计数器中断标志位
功能同CCF4
第三. 捕获/比较模块模式寄存器(PCA0CPMn)
n=0、1、2、3、4代表不同的模块
PWM16n:PWM位宽模式选择
PWM16n=0:8位PWM
PWM16n=1:16位PWM
ECOMn:比较器功能选择
ECOMn=0:比较器关闭
ECOMn=1:比较器启动
CAPPn:上升沿捕获功能选择
CAPPn=0:上升沿捕获功能关闭
CAPPn=1:上升沿捕获功能启动
CAPNn:下降沿捕获功能选择
CAPNn=0:下降沿捕获功能关闭
CAPNn=1:下降沿捕获功能启动
MATn:匹配功能选择,如果PCA计数器与捕获/比较寄存器的值匹配时,将PCA0CN中的CCFn置1
MATn=0:匹配功能关闭
MATn=1:匹配功能启动
TOGn:“翻转”功能选择,如果PCA计数器与捕获/比较寄存器的值匹配时,将管脚CEXn中逻辑电平翻转,当PWMn位同时设定为1时,模块将工作在“频率输出”模式下
TOGn=0:“翻转”功能关闭
TOGn=1:“翻转”功能启动
PWMn:脉宽模式选择,当PWM16n置0时,将输出8位脉宽信号,当PWM16n置1时,将输出16位脉宽信号
PWMn=0:脉宽模式关闭
PWMn=1:脉宽模式启动,在CEXn管脚输出PWM信号
ECCFn:捕获/比较中断标志位CFFn使能选择
ECCFn=0:CFFn中断功能关闭
ECCFn=1:CFFn中断功能启动
捕获/比较模块控制位功能表
第四. 捕获/比较模块 功能介绍
捕获功能:
信号由CEXn输入,通过设置CAPPn或者CAPNn可以实现在哪种信号状态(上升沿,下降沿,翻转)下触发捕获动作,当触发捕获动作时,PCA计数器的高8位(PCA0H)、低8位(PCA0L)值分别加载至相应模块的高8位(PCA0CPHn)、低8位(PCA0CPLn)寄存器当中,当捕获成功后,如果允许捕获中断(ECCFn设置为1),则PCA的控制寄存器(PCA0CN)中的CCF将置1从而触发中断程序。注意,捕获溢出标志位CCFn不会自动置零,需要软件置零
软件计时器功能:
使用PCA的计时器中的数值与捕获/比较模块寄存器中的数值比较,当匹配时,触发CCFn置1,如果允许捕获中断(ECCFn设置为1),则触发中断程序。注意1:捕获溢出标志位CCFn不会自动置零,需要软件置零。注意2:当向捕获/比较寄存器中写入数值时,需要先写入寄存器的低8位,然后在写入高8位,因为写入低8位后ECOMn置0,写入高8位后ECOMn置1
高速输出模式:
使用PCA的计时器中的数值与捕获/比较模块寄存器中的数值比较,当匹配时触发管脚CEXn电平进行翻转
频率输出模式:
使用PCA的计时器中的低8位与捕获/比较模块寄存器中的低8位进行比较,当匹配时,管脚CEXn电平进行翻转,同时将捕获/比较模块寄存器中的高8位与低8位数值相加,将结果存储在低8位中。
CEXn管脚可以输出指定频率的方波,频率为 F_pca/(2*PCA0CPHn) F_pca为模式选择寄存器PCA0MD中设置的基准频率;PCA0CPHn为捕获/比较模块寄存器中的高8位数值
PWM(脉宽调制)模式(8位)
PWM的频率与PCA定时器/计数器的频率相同,通过PCA的模式选择寄存器(PCA0MD)设定的频率可以实现固定频率(基于震荡频率)或者可调频率(基于定时器T0溢出或者ECI的输入频率)
PWM的“占空比(duty cycle)”与捕获/比较模块寄存器中高8位的设置有关。当PCA定时器/计数器的低8位(PCA0L)计数值与捕获/比较模块寄存器中低8位(PCA0CPLn)存储的数值相等时,CEXn管脚电平置1,当PCA定时器/计数器的低8位(PCA0L)溢出时,CEXn管脚电平置0,同时,将捕获/比较模块寄存器中高8位(PCA0CPHn)数值加载至捕获/比较模块寄存器中的低8位(PCA0CPLn)。
占空比 = (256-PCA0CPHn)/256
PWM(脉宽调制)模式(16位)
PWM的频率与PCA定时器/计数器的频率相同,通过PCA的模式选择寄存器(PCA0MD)设定的频率可以实现固定频率(基于震荡频率)或者可调频率(基于定时器T0溢出或者ECI的输入频率)
PWM的“占空比(duty cycle)”与捕获/比较模块寄存器中的数值设置有关。当PCA定时器/计数器的16位计数值与捕获/比较模块寄存器中的16位数值匹配时,CEXn管脚电平置1,当PCA定时器/计数器的16位计数值溢出时,CEXn管脚电平置0,同时,由于匹配执行中断程序,需要重新写入捕获/比较模块16位寄存器,注意2:当向捕获/比较寄存器中写入数值时,需要先写入寄存器的低8位,然后在写入高8位,因为写入低8位后ECOMn置0,写入高8位后ECOMn置1
占空比 = (65536-PCA0CPn)/65536
看门狗(Watch Dog)设置
看门狗的原理有些博主已经描述得很详细了,大家可以参考。引入看门狗的目的其实就是采用一种机制防止“程序陷入不可控制的‘疯狂’状态”,因此设定了一个定时器,也可以说是一个计数器,当计数器达到最大值发生“溢出”时,启动中断程序,在看门狗的应用中,这个中断程序就是“将程序复位”。
所以“看门狗”功能其实就是定时器/计数器与中断配合使用以实现某种功能的一种具体应用。
这款芯片的看门狗设置是这样的:当PCA的模式选择寄存器(PCA0MD)中的WDTE和WDLCK两个位置“1”时,启动看门狗功能。此时,PCA计数器启动,捕获/比较模块4进入“看门狗”模式,而对PCA计数器和捕获/比较模块4的模式寄存器(PCA0CPMn)的写入操作都被禁止,比较器用来比较PCA计数器高8位(PCA0H)中的数值与捕获/比较模块4计数器中的高8位(PCA0CPH4)数值以确定是否匹配,当PCA计数器低8位(PCA0L)溢出并且PCA计数器高8位(PCA0H)与捕获/比较模块4计数器的高8位(PCA0CPH4)
数值匹配时,看门狗重置程序,同时将PCA计数器高8位(PCA0H)中的数值与捕获/比较模块4计数器的低8位(PCA0CPL4)中的数值相加后再加载到捕获/比较模块4计数器的
高8位(PCA0CPH4)中。
这里解释一下为什么还要将两个计数器的值相加,其实PCA计数器和捕获/比较模块4计数器的高8位和低8位在“看门狗”模式中可以被看成是两个“独立”的单元,高8位(PCA0CPH4)是用来和PCA计数器高8位(PCA0H)进行比较用以判断是否溢出,低8位(PCA0CPL4)是用来设置一个溢出的数值,当溢出时将其加载到高8位(PCA0CPH4)中,其实可以理解为捕获/比较模块4计数器的高8位(PCA0CPH4)中的数值就等于低8位(PCA0CPL4)的数值。在实际操作中,应该根据想要设定的时间将低8位(PCA0CPL4)的数值设置好。
那么为什么要相加呢?原因就是PCA计数器高8位(PCA0H)中的数值不一定是0,所以如果PCA计数器高8位(PCA0H)中有数值,就一定要将其加上才能作为在捕获/比较模块4
计数器的高8位(PCA0CPH4)中的最终基准值,在实际使用中,PCA计数器高8位(PCA0H)中的数值默认为0,所以在捕获/比较模块4计数器的低8位(PCA0CPL4)中设定的值就是其高8位(PCA0CPH4)中的数值了。
在看门狗功能的使用时,计数器累加的是数字,可我们需要设定程序重置的时间,如何把两个单位进行统一呢?其实,计数器每计一个数就经过了一个机器时间,机器时间可以通过定时器/计数器模式寄存器进行设定,例如使用外部晶振频率为12M,那么可以设定一个机器时间频率为12分之一的晶振频率,那么一个机器时间就为1微秒,也就是计数器一次计数的时间就是1微秒。那么计数的次数和捕获/比较模块4计数器的低8位(PCA0CPL4)的设定值是什么关系呢,可以使用公式:
从开始计数到溢出时总共计数的次数 = (256 X PCA0CPL4) + (256 - PCA0L)
以上公式计算的次数也就是从程序运行到重置(看门狗起作用)所设置的时间
如果程序正常运行,就必须阻值看门狗起作用,所以在计数器溢出前需要“重新写入”捕获/比较模块4计数器的高8位(PCA0CPH4)数值,例如程序执行的总时间为30毫秒,
计数器溢出导致程序开始运行到重置的时间为65毫秒,那么需要在30毫秒至65毫秒之间重新写入PCA0CPH4中的数值,写入后看门狗更新使得PCA计数器重新计数。
计算看门狗重置程序的最大时间和程序设置的基准时间有关,可以参考下图
System Clock为系统频率,例如使用12兆赫兹的外部晶振,其系统频率就是12兆赫兹,如果设置了PCA0CPL4位255,当PCA计数器中的高8位PCA0H和低8位PCA0L均为0时,
根据公式,程序从开始计数到溢出时总共计数的次数 = (256 X 255) + (256 - 0) = 65536 次,因为计数器计一次数为一个机器时间即1微秒(由12兆赫兹决定),所以总共时间
即为65536微秒,就约等于65.5毫秒
以上就是关于51单片机PCA模块设置的一些介绍,可能有理解不全面甚至错误的地方,希望各位同道指正。如果需要转发或者引用,还请注明出处。
上一篇:51单片机串口中断功能的设置
下一篇:1602 液晶显示模块 + HD44780 控制芯片 使用指北
推荐阅读最新更新时间:2024-11-13 22:16
设计资源 培训 开发板 精华推荐
- LM399A 用于分离电源操作的精密电压基准的典型应用电路
- 具有 9V 至 12V、-12V 输出的 LTC1174-5 降压转换器的典型应用电路
- 基于51单片机电子万年历代码
- 使用 ON Semiconductor 的 CS51227 的参考设计
- 使用 Semtech 的 EZ1085I 的参考设计
- EVM-10L140,基于 XRS10L220 串行 ATA 端口倍增器的评估板
- LTC1261CS8 高电源电压、-5V 输出 GaAs FET 偏置发生器的典型应用电路
- LT3434IFE 演示板,具有突发模式的 60V 3A 200kHz 降压转换器,Vin = 4V 至 60V,Vout = 3.3V @ 2A
- 使用 Microchip Technology 的 TC323A 的参考设计
- STM32F411 system1