STC15系列CCP/PWM/PCA介绍
Posted perseverance52
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STC15系列CCP/PWM/PCA介绍相关的知识,希望对你有一定的参考价值。
STC15系列CCP/PWM/PCA介绍
- CCP:是英文单词的缩写Capture(捕获),Compare(比较),PWM(脉宽调制)
STC15系列部分单片机集成了3路可编程计数器阵列(CCP/PCA)模块,可用于软件定时器
、外部脉冲的捕捉
、高速脉冲输出
以及脉宽调制(PWM)输出
。
与CCP/PWM/PCA应用有关的特殊功能寄存器
- STC15系列 1T 8051单片机 CCP/PCA/PWM特殊功能寄存器表
PCA控制寄存器:CCON
- PCA控制寄存器
- CF:PCA计数器阵列溢出标志位。当PCA计数器溢出时 CF由硬件置位。如果CMOD寄存器
的ECF位置位, CF标志可用来产生中断。CF位可通过硬件或软件置位, 但只可通过软件清零。 - CR:PCA计数器阵列 位通过软件置位, 用来起动PCA计数器阵列计数。该位通过软件清零, 用来关闭PCA计数器。
- CCF2:PCA模块2中断标志。当出现匹配或捕获时该位由硬件置位。该位必须通过软件清零。
- CCF1:PCA模块1中断标志。当出现匹配或捕获时该位由硬件置位。该位必须通过软件清零。
- CCF0:PCA模块0中断标志。当出现匹配或捕获时该位由硬件置位。该位必须通过软件清零。
PCA工作模式寄存器:CMOD
- PCA工作模式寄存器(PCA时钟源设置寄存器)
- CIDL:空闲模式下是否停止PCA计数的控制位。
当CIDL=0时, 空闲模式下PCA计数器继续工作
当CIDL=1时,空闲模式下 PCA计数器停止工作。
- CPS2、CPS1、CPS0:PCA计数脉冲源选择控制位。PCA计数脉冲选择如下表所示。
- 例如,CPS2/CPS1/CPS0 = 1/0/0时,CCP/PCA/PWM的时钟源是SYSclk,不用定时器0,PWM的频率为SYSclk/256.
- 如果要用系统时钟/3来作为PCA的时钟源,应选择TO的溢出作为CCP/PCA/PWM的时钟源,此时应让T0工作在1T模式,计数3个脉冲即产生溢出。用TO的溢出可对系统时钟进行1~65536级分频(T0工作在16位重装载模式)。
- ECF:PCA计数溢出中断使能 。
当ECF = 0时,禁止寄存器CCON中CF位的中断;
当ECF = 1时,允许寄存器CCON中CF位的中断.
3.PCA比较/捕获寄存器CCAPM0、CCAPM1和CCAPM2
- B7:保留为将来之用。
- ECOM0:允许比较器功能控制位
当ECOM0=1时,允许 - CAPP0: 正捕获控制位
当CAPP0=1时,允许 - CAPN0:负捕获控制位
当CAPN0=1时 下降 - MAT0: 匹配控制位
当MAT0=1时,PCA计数值与模块的比较/捕获寄存器的值的匹配将置位CCON寄存器的中断标志位CCF0。 - TOG0: 翻转控制位
当TOG0=1时,工作在PCA高速脉冲输出 PCA计数器的值与模块的比较/捕获
寄存器的值的匹配将使CCP0脚翻转。
(CCP0/PCA0/PWM0/P1.1或CCP0_2/PCA0/PWM0/P3.5或CCP0_3/PCA0/PWM0/P2.5) - PWM0: 脉宽调节模式。
当PWM0=1时, CCP0脚用作脉宽调节输出。
(CCP0/PCA0/PWM0/P1.1或CCP0_2/PCA0/PWM0/P3.5或CCP0_3/PCA0/PWM0/P2.5)
ECCF0: 使能CCF0中断。使能寄存器CCON的比较/捕获标志CCF0, 用来产生中断。
还有 CCAPM1 ,CCAPM2与上面的CCAPM0差不多
4. PCA的16位计数器 — 低8位CL和高8位CH
- CL和CH地址分别为E9H和F9H,复位值均为00H,用于保存PCA的装载值。
5. PCA捕捉/比较寄存器 — CCAPnL(低位字节)和CCAPnH(高位字节)
当PCA模块用于捕获或比较时,它们用于保存各个模块的16位捕捉计数值;当PCA模块用
于PWM模式时,它们用来控制输出的占空比。其中,n=0、1、2,分别对应模块0、模块1和模
块2。复位值均为00H。它们对应的地址分别为:
CCAP0L — EAH、CCAP0H — FAH:模块0的捕捉/比较寄存器。
CCAP1L — EBH、CCAP1H — FBH:模块1的捕捉/比较寄存器。
CCAP2L — ECH、CCAP2H — FCH:模块2的捕捉/比较寄存器。
6. PCA模块PWM寄存器PCA_PWM0、PCA_PWM1和PCA_PWM2
- EPC0H:在PWM模式下,与CCAP0H组成9位数。
- EPC0L:在PWM模式下,与CCAP0L组成9位数。
PCA模块的工作模式设定表如下表所列:
将单片机的CCP/PWM/PCA功能在3组管脚之间切换的寄存器AUXR1(P_SW1)
- 辅助寄存器1的格式
CCP/PWM/PCA模块的结构
- STC15系列部分单片机有3路可编程计数器阵列CCP/PCA/PWM(通过AUXR1/P_SW1寄存器可以设置CCP/PCA/PWM从P1口切换到P2口切换到P3口)。
- PCA含有一个特殊的16位定时器,有3个16位的捕获/比较模块与之相连 ,如下图所示。
- 每个模块可编程工作在4种模式下:上升/下降沿捕获、软件定时器,高速脉冲输出或可调制脉冲输出。
- 寄存器CH和CL的内容是正在自由递增计数的16位PCA定时器的值。PCA定时器是3个模块的公共时间基准,可通过编程工作在:1/12系统时钟、1/8系统时钟、1/6系统时钟、1/4系统时钟、1/2系统时钟、系统时钟、定时器0溢出或ECI脚的输入(STC15W4K60S4系列在P1.2或P2.4或P3.4口)。定时器的计数源由CMOD特殊功能寄存器中的CPS2,CPS1和CPS0位来确定(见CMOD特殊功能寄存器说明)。
- CMOD特殊功能寄存器还有2个位与PCA相关。它们分别是:CIDL,空闲模式下允许停止PCA;ECF,置位时,使能PCA中断,当PCA定时器溢出将PCA计数溢出标志CF(CC0ON.7)置位。
- CCON特殊功能寄存器包含PCA的运行控制位(CR)和PCA定时器标志(CF)以及各个模块的标志(CCF2/CCF1/CCFO)。通过软件置位CR位(CCON.6)来运行PCA。CR位被清零时PCA关闭。
- 当PCA计数器溢出时,CF位(CCON.7)置位,如果CMOD寄存器的ECF位置位,就产生中断。CF位只可通过软件清除。CCON寄存器的位0~2是PCA各个模块的标志(位0对应模块0,位1对应模块1,位2对应模块2),当发生匹配或比较时由硬件置位。这些标志也只能通过软件清除。所有模块共用一个中断向量。PCA的中断系统如图所示。
- PCA的每个模块都对应一个特殊功能寄存器。它们分别是:模块0对应CCAPMO,模块1对应CCAPM1,模块2对应CCAPM2,特殊功能寄存器包含了相应模块的工作模式控制位。
- 当模块发生匹配或比较时,ECCFn位(CCAPMn.0,n=0,1,2由工作的模块决定)使能CCON特殊功能寄存器的CCFn标志来产生中断。
- PWM(CCAPMn.1)用来使能脉宽调制模式。
- 当PCA计数值与模块的捕获/比较寄存器的值相匹配时,如果T0G位(CCAPMn.2)置位,模块的CCPn输出将发生翻转。
- 当PCA计数值与模块的捕获/比较寄存器的值相匹配时,如果匹配位MATn(CCAPlMn.3)置位,CCON寄存器的CCFn位将被置位。
- CAPNn(CCAPMn.4)和CAPPn(CCAPMn.5)用来设置捕获输入的有效沿。CAPNn位使能下降沿有效,CAPPn位使能上升沿有效。如果两位都置位,则两种跳变沿都被使能,捕获可在两种跳变沿产生。
- 通过置位CCAPMn寄存器的ECOMn位(CCAPMn.6)来使能比较器功能。
- 每个PCA模块还对应另外两个寄存器,CCAPnH和CCAPnL。当出现捕获或比较时,它们用来保存16位的计数值。当PCA模块用在PWM模式中时,它们用来控制输出的占空比。
CCP/PCA模块的工作模式
捕获模式
PCA模块工作于捕获模式的结构图如下图所示。要使一个PCA模块工作在捕获模式,寄存器CCAPMn的两位(CAPNn和CAPPn)或其中任何一位必须置1。PCA模块工作于捕获模式时,对模块的外部CCPn输入(CCPO/P1.1,CCP1/P1.0,CCP2/P3.7)的跳变进行采样。当采样到有效跳变时,PCA硬件就将PCA计数器阵列寄存器(CH和CL)的值装载到模块的捕获寄存器中(CCAPnL和CCAPnH)。
如果CCON特殊功能寄存器中的位CCFn和CCAPMn特殊功能寄存器中的位ECCFn位被置位,将产生中断。可在中断服务程序中判断哪一个模块产生了中断,并注意中断标志位的软件清零问题。
16位软件定时器模式
通过置位CCAPMn寄存器的ECOM和MAT位,可使PCA模块用作软件定时器(上图)。PCA定时器的值与模块捕获寄存器的值相比较,当两者相等时,如果位CCFn(在CCON特殊功能寄存器中)和位ECCFn(在CCAPMn特殊功能寄存器中)都置位,将产生中断。
[CH,CL]每隔一定的时间自动加1,时间间隔取决于选择的时钟源。例如,当选择的时
钟源为SYSclk/12,每12个时钟周期[CH,CL]加1。当[CH,CL]增加到等于[CCAPnH, CCAPnL]
时,CCFn=1,产生中断请求。如果每次PCA模块中断后,在中断服务程序中断给[CCAPnH,
CCAPnL]增加一个相同的数值,那么下次中断来临的间隔时间T也是相同的,从而实现了定时
功能。定时时间的长短取决于时钟源的选择以及PCA计数器计数值的设置。下面举例说明PCA
计数器计数值的计算方法。
假设,系统时钟频率SYSclk = 18.432MHz,选择的时钟源为SYSclk/12,定时时间T为5ms,则
PCA计数器计数值为:
PCA计数器的计数值 = T / (( 1 / SYSclk )×12 ) = 0.005 / (( 1 / 18432000)×12 ) = 7680 (10进制数)
= 1E00H (16进制数)
也就是说,PCA计数器计数1E00H次,定时时间才是5ms,这也就是每次给[CCAPnH,
CCAPnL]增加的数值(步长)。
高速脉冲输出模式
该模式中(下图),当PCA计数器的计数值与模块捕获寄存器的值相匹配时,PCA模块的CCPn输出将发生翻转。要激活高速脉冲输出模式,CCAPMn寄存器的TOGn,MATn和ECOMn位必须都置位。
CCAPnL的值决定了PCA模块n的输出脉冲频率。当PCA时钟源是SYSclk/2时,输出脉冲的
频率F为:
f = SYSclk / ( 4×CCAPnL )
其中,SYSclk为系统时钟频率。由此,可以得到CCAPnL的值CCAPnL = SYSclk / ( 4×f ).
如果计算出的结果不是整数,则进行四舍五入取整,即
CCAPnL = INT (SYSclk / ( 4×f ) + 0.5 )
其中,INT( )为取整运算,直接去掉小数。例如,假设SYSclk = 20MHz,要求PCA高速脉
冲输出125kHz的方波,则CCAPnL中的值应为:
CCAPnL = INT (20000000 / ( 4×125000 ) + 0.5 ) = INT ( 40 + 0.5 ) = 40 = 28H
脉宽调节模式(PWM)
- 脉宽调制(PWM,Pulse Width Modulation)是一种使用程序来控制波形占空比、周期、相位
波形的技术,在三相电机驱动、D/A转换等场合有广泛的应用。
STC15系列单片机的PCA模块可以通过设定各自的寄存器PCA_PWMn (n=0,1,2.下同)中的位EBSn_1/PCA_PWMn.7及EBSn_0/PCA_PWMn.6,使其工作于8位PWM或7位PWM或6位PWM模式。
- 8位脉宽调节模式(PWM)
当[EBSn_1,EBSn_0]=[0,0]或[1,1]时,PCA模块n工作于8位PWM模式,此时将0,CL[7:0]与捕获寄存器[EPCnL,CCAPnL[7:0]]进行比较。PWM模式的结构如下图所示。
- 当PCA模块工作于8位PWM模式时,由于所有模块共用仅有的PCA定时器,所有它们的输出频率相同。各个模块的输出占空比是独立变化的,与使用的捕获寄存器EPCnL,CCAPnL[7:0]有关。当0,CL[7:0]的值小于EPCnL,CCAPnL[7:0]时,输出为低; 0,CL[7:0]的值等于或大于EPCnL,CCAPnL[7:0]时,输出为高。当CL的值由FF变为00溢出时,EPCnH,CCAPnH[7:0]的内容装载到EPCnL,CCAPnL[7:0]中。这样就可实现无干扰地更新PWM。要使能PWM模式,模块CCAPMn寄存器的PWMn和ECOMn位必须置位。
- 当PWM是8位的时:
PCA时钟输入源可以从以下8种中选择一种:SYSclk, SYSclk/2, SYSclk/4,SYSclk/6,
SYSclk/8,SYSclk/12,定时器0的溢出,ECI/P1.2输入
举例: PCA模块工作于8位PWM模式。 PWM输出频率为38KHz,选SYSclk为PCA/
PWM时钟输入源,求出SYSclk的值
由计算公式38000=SYSclk/256 ,得到外部时钟频率SYSclk=38000 x 256 x 1=9,728,000
如果要实现可调频率的PWM输出,可选择定时器0的溢出率或者ECI脚的输入作为PCA/PWM
的时钟输入源。
-
当EPCnL = 0及CCAPnL = 00H时,PWM固定输出高
-
当EPCnL = 1及CCAPnL = FFH时,PWM固定输出低
-
当某个I/O口作为PWM使用时,该口的状态:
-
7位脉宽调节模式(PWM)
当[EBSn_1,EBSn_0]=[0,1]时,PCA模块n工作于7位PWM模式,此时将0,CL[6:0]与捕获寄存器[EPCnL,CCAPnL[6:0]]进行比较。PWM模式的结构如下图所示。
当PCA模块工作于7位PWM模式时,由于所有模块共用仅有的PCA定时器,所有它们的输出频率相同。各个模块的输出占空比是独立变化的,与使用的捕获寄存器EPCnL,CCAPnL[6:0]有关。当0,CL[6:0]的值小于EPCnL,CCAPnL[6:0]时,输出为低; 0,CL[6:0]的值等于或大于EPCnL,CCAPnL[6:0]时,输出为高。当CL的值由7F变为00溢出时,
EPCnH,CCAPnH[6:0]的内容装载到EPCnL,CCAPnL[6:0]中。这样就可实现无干扰地更新PWM。要使能PWM模式,模块CCAPMn寄存器的PWMn和ECOMn位必须置位。
- 当PWM是7位的时:
PCA时钟输入源可以从以下8种中选择一种:SYSclk, SYSclk/2, SYSclk/4,SYSclk/6,
SYSclk/8,SYSclk/12,定时器0的溢出,ECI/P1.2输入。
举例:设PCA模块工作于7位PWM模式。要求PWM输出频率为38KHz,选SYSclk为PCA/
PWM时钟输入源,求出SYSclk的值。
由计算公式38000=SYSclk/128,得到外部时钟频率SYSclk=38000×128×1=4,864,000如果要实现可调频率的PWM输出,可选择定时器0的溢出率或者ECI脚的输入作为PCA/PWM的时钟输入源
当EPCnL=0及CCAPnL=80H时,PWM固定输出高当EPCnL=1及CCAPnL=OFFH时,PWM固定输出低
- 6位脉宽调节模式(PWM)
当[EBSn_1,EBSn_0]=[1,0]时,PCA模块n工作于6位PWM模式,此时将0,CL[5:0]与捕获寄存器[EPCnL,CCAPnL[5:0]]进行比较。PWM模式的结构如下图所示。
当PCA模块工作于6位PWM模式时,由于所有模块共用仅有的PCA定时器,所有它们的输出频率相同。各个模块的输出占空比是独立变化的,与使用的捕获寄存器EPCnL,CCAPnL[5:0]有关。当0,CL[5:0]的值小于EPCnL,CCAPnL[5:0]时,输出为低; 0,CL[5:0]的值等于或大于EPCnL,CCAPnL[5:0]时,输出为高。当CL的值由3F变为00溢出时,
EPCnH,CCAPnH[5:0]的内容装载到EPCnL,CCAPnL[5:0]中。这样就可实现无干扰地更新PWM。要使能PWM模式,模块CCAPMn寄存器的PWMn和ECOMn位必须置位。
- 当PWM是6位的时:
- PCA时钟输入源可以从以下8种中选择一种:SYSclk,SYSclk/2,SYSclk/4,SYSclk/6,SYSclk/8,SYSclk/12,定时器0的溢出,ECI/P1.2输入。
举例:设PCA模块工作于6位PWM模式。要求PWM输出频率为38KHz,选SYSclk为PCA/PWM时钟输入源,求出SYSclk的值。
由计算公式38000=SYSclk/64,得到外部时钟频率SYSclk=38000×64x1=2,432,000如果要实现可调频率的PWM输出,可选择定时器0的溢出率或者ECI脚的输入作为PCA/PWM的时钟输入源
- 当EPCnL=0及CCAPnL=0C0H时,PWM固定输出高当EPCnL=1及CCAPnL=0FFH时,PWM固定输出低。
示例程序
用CCP/PCA功能扩展外部中断的测试程序
//假定测试芯片的工作频率为18.432MHz
#include "reg51.h"
#include "intrins.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
sfr P_SW1 = 0xA2; //外设功能切换寄存器1
#define CCP_S0 0x10 //P_SW1.4
#define CCP_S1 0x20 //P_SW1.5
sfr CCON = 0xD8; //PCA控制寄存器
sbit CCF0 = CCON^0; //PCA模块0中断标志
sbit CCF1 = CCON^1; //PCA模块1中断标志
sbit CR = CCON^6; //PCA定时器运行控制位
sbit CF = CCON^7; //PCA定时器溢出标志
sfr CMOD = 0xD9; //PCA模式寄存器
sfr CL = 0xE9; //PCA定时器低字节
sfr CH = 0xF9; //PCA定时器高字节
sfr CCAPM0 = 0xDA; //PCA模块0模式寄存器
sfr CCAP0L = 0xEA; //PCA模块0捕获寄存器 LOW
sfr CCAP0H = 0xFA; //PCA模块0捕获寄存器 HIGH
sfr CCAPM1 = 0xDB; //PCA模块1模式寄存器
sfr CCAP1L = 0xEB; //PCA模块1捕获寄存器 LOW
sfr CCAP1H = 0xFB; //PCA模块1捕获寄存器 HIGH
sfr PCAPWM0 = 0xf2;
sfr PCAPWM1 = 0xf3;
sbit PCA_LED = P1^0; //PCA测试LED
void PCA_isr() interrupt 7 using 1
CCF0 = 0; //清中断标志
PCA_LED = !PCA_LED; //测试LED取反
void main()
ACC = P_SW1;
ACC &= ~(CCP_S0 | CCP_S1); //CCP_S0=0 CCP_S1=0
P_SW1 = ACC; //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2)
// ACC = P_SW1;
// ACC &= ~(CCP_S0 | CCP_S1); //CCP_S0=1 CCP_S1=0
// ACC |= CCP_S0; //(P3.4/ECI_2, P3.5/CCP0_2, P3.6/CCP1_2, P3.7/CCP2_2)
// P_SW1 = ACC;
// ACC = P_SW1;
// ACC &= ~(CCP_S0 | CCP_S1); //CCP_S0=0 CCP_S1=1
// ACC |= CCP_S1; //(P2.4/ECI_3, P2.5/CCP0_3, P2.6/CCP1_3, P2.7/CCP2_3)
// P_SW1 = ACC;
CCON = 0; //初始化PCA控制寄存器
//PCA定时器停止
//清除CF标志
//清除模块中断标志
CL = 0; //复位PCA寄存器
CH = 0;
CMOD = 0x00; //设置PCA时钟源
//禁止PCA定时器溢出中断
CCAPM0 = 0x11; //PCA模块0为下降沿触发
// CCAPM0 = 0x21; //PCA模块0为上升沿沿触发
// CCAPM0 = 0x31; //PCA模块0为上升沿/下降沿触发
CR = 1; //PCA定时器开始工作
EA = 1;
while (1);
以上是关于STC15系列CCP/PWM/PCA介绍的主要内容,如果未能解决你的问题,请参考以下文章
11.STC15W408AS单片机CCP/PCA/PWM应用
11.STC15W408AS单片机CCP/PCA/PWM应用
11.STC15W408AS单片机CCP/PCA/PWM应用