51单片机PCA模块配置

2023-11-16

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模块设置的一些介绍,可能有理解不全面甚至错误的地方,希望各位同道指正。如果需要转发或者引用,还请注明出处。

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

51单片机PCA模块配置 的相关文章

  • ERROR! MySQL server PID file could not be found!解决方案

    首先怀疑是有僵尸mysqld的存在 首先查看进程 ps ef grep mysqld 然后用 kill 9 进程号杀死进程 重启mysql 但是问题并没有得到解决 再然后可以通过mysql的配置文件my cnf查看一下mysql的数据存储目
  • Python + ttkbootstrap 制作全网小说下载神器

    前言 ttkbootstrap是一个基于Python的开源库 用于创建漂亮且交互式的GUI应用程序 它是在Tkinter框架之上构建的 提供了一系列的Widget组件和样式 可以帮助开发者快速构建现代化的用户界面 今天做的是这个东西 蓝色的
  • Tensorflow 简单线性规划和逻辑回归

    Tensorflow 简单线性规划和逻辑回归 摘要 Tensorflow 中单变量线性回归 多变量的情况 用 tensorflow进行逻辑回归分类 参考文献 摘要 线性规划和逻辑回归分别是回归 regression 和分类 classifi
  • flask学习笔记(一)

    1 为什么要用web框架 稳定性和可扩展性强 可以降低开发难度 提升开发效率 总结 避免重复造轮子 2 Flask简介 Flask是轻量级web开发框架 Flask本身相当于一个内核 其框架核心包含 WSGI工具箱采用Werkzeug 路由
  • 基于ZYNQ FPGA的8路ADC数据采集与存储实现

    基于ZYNQ FPGA的8路ADC数据采集与存储实现 概述 在工程设计和科学研究中 数据采集与存储是一个重要的任务 为了满足高速 高精度和大容量的数据采集需求 本文将介绍如何基于ZYNQ FPGA平台实现8路ADC数据采集与存储 通过合理的

随机推荐

  • 如果android的广播注册后没有取消注册会发生什么?》,android – 我是否需要取消注册“匿名”BroadcastReceiver...

    我最近问了一个关于检查已发送短信状态的问题 给出的答案是一个代码片段 注册了两个 匿名内部 如果不正确 请更正我的术语 BroadcastReceivers监听短信发送 传送的广播 这些接收器只需要接收有关我的应用程序刚刚发送的SMS的数据
  • C/C++ 浮点数大小比较问题

    1 c 中浮点数注意 The important rule to remember is that powers of two and integer multiples thereof can be perfectly represent
  • ORACLE 造数脚本

    SELECT DBMS RANDOM VALUE FROM DUAL SELECT DBMS RANDOM VALUE 20 30 FROM DUAL SELECT DBMS RANDOM NORMAL FROM DUAL SELECT D
  • Base64编码(汇编版,未做过多优化,性能自认为还可以)

    感谢 DelphiGuy 于 2010 10 08 17 27 37 给出的提醒 function GetSizeCoder3To4 InputCount Integer Integer inline begin Result InputC
  • 本地映射到外网

    很多人做开发的苦恼 外网访问不了本地 很多调试进行不了 比如说微信开发 这个时候要用手机调试 但是服务器在自己电脑上 外网访问不了 这个时候我们可以用一些工具 使我们的内网ip映射到外网 让外网可以访问 一 使用ngrok让微信公众平台通过
  • POST请求常见错误及解决办法

    POST请求常见错误及解决办法 前后端分离 已经是web开发的主流 在前后端对接的过程中难免会碰到各式各样的问题 本文对近期项目中遇到的与 POST请求 有关的问题做了一个简要的汇总和分析 并列出了与之相关的解决办法 问题一 POST请求发
  • 区块链之java调用智能合约(二)部署智能合约

    前言 上一节 已经说过 如何的创建一个合约 如何编译合约 然后在java中调用 但是呢 这些还远远不够 那么还差哪些呢 现在就是如何将创建的智能合约部署的对应的共链 私链 测试链中了 需要部署后 才能真正的使用 现在就讲讲如何部署智能合约
  • linux下gcc的使用教程,Linux下GCC使用方法简介

    编译 第一步 是进行预编译 使用 E参数可以让GCC在预处理结束后停止编译过程 gcc E hello c o hello i 预处理的宏定义插入到hello i中 第二步 是将hello i编译为目标代码 这可以通过使用 c参数来完成 g
  • C++使用string的大数运算(6)模加模减模乘模幂

    本次项目目标 使用C 完成对于大数的相关运算 项目要点 1 大数指的是远超long long int的数据 2 将大数用矩阵进行存储 并通过矩阵实现运算 3 本人采用字符串进行存储 应注意char的特点 比如 char a 161 cout
  • 数据挖掘:银行评分卡制作——数据分箱、WOE、IV的意义

    在银行评分卡的项目中 通常都会需要把数据分箱 分箱后并不是对数据进行哑变量处理 而是用WOE值去替换 再放入模型中 学习的过程中会对这些操作有些疑问 比如 数据分箱有什么意义 WOE和IV值是干什么的 这里对这些数据处理的意义进行一个说明
  • [OpenAirInterface实战-6] :OAI在github中源代码的存放结构

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 OpenAirInterface实战 6 OAI在github中源代码的存放结构 文火冰糖 王文兵 的博客 CSDN博客 目录 第1章 基本
  • Zookeeper的常见面试题

    1 Zookeeper 1 1 Zookeeper基本概念 Zookeeper作为一个优秀高效且可靠的分布式协调框架 ZooKeeper 在解决分布式数据一致性问题时并没有直接使用Paxos算法 而是专门定制了一致性协议叫做 ZAB Zoo
  • 芯片低功耗设计原则

    原则1 按照自顶向下 从架构级到门级 的方法 在不同设计层次上对功耗进行优化 设计层次越高 优化所能达到的效果越好 原则2 从系统级着眼全局 从细节处精打细算 从产品解决方案角度而不局限于芯片本身来进行功耗预算 并根据功耗的分析结果 优化系
  • xxl-job任务详解

    文章目录 任务管理 新增任务页面字段释义 1 1 路由策略 1 2 运行模式 BEAN模式 GLUE模式 1 3 阻塞处理策略 1 4 子任务ID 1 5 JobHandler 1 6 Cron 1 7 任务超时时间 任务操作 任务管理 新
  • labview与matlab接口,LabVIEW Comms与MATLAB®的互联接口

    为了复用现有的MATLAB 代码 LabVIEW Communications System Design Suite LabVIEW Comms 新增了MATLAB专用接口的功能 无线原型的开发者可使用已有的MATLAB函数或脚本 将其连
  • 图片占位符在线工具

    简介 在前端的开发中 有时需要加载各种尺寸的图片 而在开发阶段 这些真实的图片可能并未制作完成 因此 我们可以使用图片占位符工具生成假的图片进行替代 本文介绍一款十分灵活的图片占位符工具 您只需在调用API服务时修改图片尺寸参数就可以生成不
  • 机器学习入门教学——可解释性

    1 前言 近年来 机器学习模型被广泛地应用到现实生活中的一些重要领域 如面部识别 自动驾驶 语言处理和智慧医疗等 然而 机器学习模型就像一个黑盒子 给予一个输入 就能得到一个决策结果 但是我们并不知道模型是如何做决策的 因此 可解释性旨在帮
  • Struts2标签与jsp页面Java代码的值相互使用

    业务需求 Struts标签使用Jsp页面中的list的值 java代码使用Struts传来的值
  • 从ChatGPT与New Bing看程序员为什么要学习算法?

    文章目录 为什么要学习数据结构和算法 ChatGPT与NEW Bing 的回答 想要通关大厂面试 就不能让数据结构和算法拖了后腿 业务开发工程师 你真的愿意做一辈子CRUD boy吗 对编程还有追求 不想被行业淘汰 那就不要只会写凑合能用的
  • 51单片机PCA模块配置

    PCA模块是 可编程计数器阵列 的缩写 英文名称是 Programmable Counter Array 以下的说明均以SILICON LAB生产的C8051系列微型控制器为例 PCA包括1个16位 定时器 计数器 和5个 捕获 比较模块