51单片机PCA模块配置

本文介绍了51单片机的PCA模块,包括PCA的组成、基准时钟频率选择、模式选择寄存器PCA0MD的设置、控制寄存器PCA0CN的功能以及捕获/比较模块的工作模式。PCA模块包含1个16位定时器/计数器和5个捕获/比较模块,可用于定时、计数、捕获、比较、PWM和看门狗等功能。通过设置不同寄存器和标志位,可以实现各种复杂的定时任务和中断处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PCA模块是“可编程计数器阵列”的缩写,英文名称是“Programmable Counter Array”,以下的说明均以SILICON LAB生产的C8051系列微型控制器为例。

PCA包括1个16位“定时器/计数器”和5个“捕获/比较模块”。16位定时器/计数器包括1个高8位寄存器(PCA0H)和1个低8位寄存器(PCA0L),每个捕获/比较模块还有各自的16位“捕获/比较寄存器”。

PCA的定时器/计数器在运行时必须基于某个“基准时钟频率”,通过设置相应的寄存器,可以选择以下几种:

  1. 系统时钟频率
  2. 系统时钟频率的12分之一:f_osc/12
  3. 系统时钟频率的4分之一:f_osc/4
  4. 外部晶振时钟源频率的8分之一:external f_osc/8
  5. 由定时器/计数器0的溢出率所决定的频率
  6. 通过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模块设置的一些介绍,可能有理解不全面甚至错误的地方,希望各位同道指正。如果需要转发或者引用,还请注明出处。

 

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值