11.STC15W408AS单片机CCP/PCA/PWM应用

Posted 小猿猪哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了11.STC15W408AS单片机CCP/PCA/PWM应用相关的知识,希望对你有一定的参考价值。

STC15W408AS单片机集成了3路可编程计数器阵列(CCP/PCA)模块可用于软件定时器、外部脉冲的捕捉、高速脉冲输出以及脉宽调制(PWM)输出。

一、与CCP/PWM/PCA应用有关的特殊功能寄存器

STC15系列 1T 8051单片机 CCP/PCA/PWM特殊功能寄存器表 CCP/PCA/PWM SFRs

1.1PCA工作模式寄存器CMOD

PCA工作模式寄存器的格式如下:

CMOD : 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的时钟源, 应选择T0的益处作为CCP/PCA/PWM的时钟源,此时应让T0工作在1T模式,计 3个脉冲即产生溢出 用T0的溢出可对系统时钟进行1 ~ 65536级分频(T0工作在16位重装载模式)。

ECF:PCA计数溢出中断使能 。

当ECF = 0时,禁止寄存器CCON中CF位的中断;

当ECF = 1时,允许寄存器CCON中CF位的中断。

1.2 PCA控制寄存器CCON

PCA控制寄存器的格式如下:

CCON : PCA控制控制寄存器

CF:PCA计数器阵列溢出标志位。当PCA计数器溢出时 CF由硬件置位。如果CMOD寄存器

的ECF位置位, CF标志可用来产生中断。CF位可通过硬件或软件置位, 但只可通过软 件清零。

CR:PCA计数器阵列运行控制位。该位通过软件置位, 用来起动PCA计数器阵列计数。该位

通过软件清零, 用来关闭PCA计数器。

CCF2:PCA模块2中断标志。当出现匹配或捕获时该位由硬件置位。该位必须通过软件清零。

CCF1:PCA模块1中断标志。当出现匹配或捕获时该位由硬件置位。该位必须通过软件清零。

CCF0:PCA模块0中断标志。当出现匹配或捕获时该位由硬件置位。该位必须通过软件清零。

1.3 PCA比较/捕获寄存器CCAPM0、CCAPM1和CCAPM2

PCA模块0的比较/捕获寄存器的格式如下:

CCAPM0 : PCA模块0的比较/捕获寄存器

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分别是PCA1和PCA2模块的比较/捕获寄存器,功能了CCAPM0一样,这里不做说明了。

1.4 PCA的16位计数器 — 低8位CL和高8位CH

CL和CH地址分别为E9H和F9H,复位值均为00H,用于保存PCA的装载值。

1.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的捕捉/比较寄存器。

1.6 PCA模块PWM寄存器PCA_PWM0、PCA_PWM1和PCA_PWM2

PCA模块0的PWM寄存器的格式如下:

PCA_PWM0 : PCA模块0的PWM寄存器

EBS0_1 , EBS0_0:当PCA模块0工作于PWM模式时的功能选择位。

0 , 0 : PCA模块0工作于8位PWM功能;

0 , 1 : PCA模块0工作于7位PWM功能;

1 , 0 :PCA模块0工作于6位PWM功能;

1 , 1 :无效,PCA模块0仍工作于8位PWM模式.

EPC0H:在PWM模式下,与CCAP0H组成9位数。

EPC0L:在PWM模式下,与CCAP0L组成9位数。

PCA_PWM1和PCA_PWM2分别是PCA1和PCA2模块的PWM寄存器,功能了PCA_PWM0一样,这里不做说明了。

PCA模块的工作模式设定表入下表所示:

PCA模块工作模式设定 CCAPMn寄存器,n = 0,1,2)

二、CCP/PCA模块的工作模式

2.1 捕获模式

PCA 模块工作于捕获模式的结构图如下图所示。要使一个PCA模块工作在捕获模式,寄存器CCAPMn的两位(CAPNn和 CAPPn)或其中任何一位必须置1。 PCA模块工作于捕获模式时,对模块的外部CCPn CCP0/P1.1,CCP1/P1.0, CCP2/P3.7)的跳变进行采样。当采样到有效跳变时,PCA硬件就将PCA计数器阵列列寄存器(CH和CL)的值装载到模块的捕获寄存器中(CCAPnL和CCAPnH)。

PCA 捕获模式图

如果CCON特殊寄存器中的位CCFn和CCAPMn特殊功能寄存器的ECCFn位被置位,将产生中断。可在中断服务程序中判断哪一个模块产生了中断,并注意中断标志位的软件清零问题。

2.2 捕获模式测试程序

// PCA0 工作为 捕获模式
// 这个模式有点类似 外部中断或者计数器
#include "stc15.h"
int count = 0;
void PCAInit();
void main()
{
	PCAInit();
	EA = 1;    // CPU开放中断
	while (1);
}
// 捕获模式 初始化
void PCAInit()
{
	CMOD = 0x05;    // PCA 计数器时钟位 系统时钟  允许CCON中的CF位中断
	CCON = 0x00;    // 初始化 寄存器
	CCAPM0 = 0x11;  // 下降沿捕获  使能CCF0 中断
	CL = 0;
	CH = 0;         // 初始化  计数器
	CR = 1;         // 允许PCA 模块运行
}
// 中断服务程序
void PCA_isr() interrupt 7 
{
	CCF0 = 0;     // 清除中断标志位
	count ++;
	if(count == 100)
	{
		count = 0;
		P10 = !P10;   // P10 取反
	}
}

这里我采取的做法是,单片机的外部捕获引脚CCP0(P1.1)外接到示波器的校准输出端上面,在中断服务程序中计数100次,就把P1.0引脚输出取反,这样就把外部捕获到的信号缩小了200倍输出显示了。

2.3 高速脉冲输出模式

该模式中(下图),当PCA计数器的计数值与模块捕获寄存器的值相匹配时,PCA模块的CCPn输

出将发生翻转。要激活高速脉冲输出模式,CCAPMn寄存器的TOGn,MATn和ECOMn位必须都置位。

PCA 高速脉冲输出模式

CCAPnL的值决定了PCA模块n的输出脉冲频率。当PCA时钟源是SYSclk时,输出脉冲的频率F位:

f = SYSclk / ([CPS2,CPS0] *2 * CCAPnL)

其中,SYSclk为系统时钟频率。由此,可以得到CCAPnL的值CCAPnL = SYSclk / ( 2×f ).

如果计算出的结果不是整数,则进行四舍五入取整,即

CCAPnL = INT (SYSclk / ( 2×f ) + 0.5 )

其中,INT( )为取整运算,直接去掉小数。

2.4 高速脉冲输出模式测试程序

#include "stc15.h"
#define uint unsigned int
#define T1KHz 5530;  // SYSclk / ([CPS2,CPS0] *2 * CCAPnL)
uint value = 0;
void PCAInit();
void main()
{
	PCAInit();
	EA = 1;    // CPU开放中断
	while (1);
}
// 初始化PCA模块
void PCAInit()
{
	CMOD = 0x08;    // PCA 计数器时钟位 系统时钟  
	CCON = 0x00;    // 初始化 寄存器
	CL = 0;         //复位PCA计数器
	CH = 0;
	value = T1KHz;
	CCAP0L = value;  // 捕获比较寄存器
	CCAP0H = value >> 8;
	value += T1KHz;
	CCAPM0 = 0x4D;  // 允许比较器功能 
	CR = 1;         // 允许PCA 模块运行
}
// 中断服务程序
void PCA_isr() interrupt 7 
{
	CCF0 = 0; //清中断标志
	CCAP0L = value;  // 捕获比较寄存器
	CCAP0H = value >> 8;
	value += T1KHz;
}

在CCP0引脚通过示波器,测得如上图所示波形。

这里的PCA模块的频率为单片机时钟频率11.0592MHz,所以对外输出频率是:

11.0592MHz ÷ (2 * 5530) = 1KHz。

2.5 脉宽调节模式(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)

PCA PWM mode / 可调制脉冲宽度输出模式结构图(PCA模块工作于8位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位的时: PWM的频率=PCA时钟输入源频率/256。

2.6 脉宽调节模式(PWM)测试程序

// PCA 工作为 PWM模式

#include "stc15.h"
void PCAInit();
void main()
{
	PCAInit();
	EA = 1;    // CPU开放中断
	while (1);
}
// 初始化
void PCAInit()
{
	CMOD = 0x00;    // PCA 计数器时钟 系统时钟/12 
	CCON = 0x00;    // 初始化 寄存器
	CCAPM0 = 0x42;          //PCA模块0 PWM模式
	PCA_PWM0 = 0x00;        //PCA模块0 工作于8位PWM
	CCAP0H = CCAP0L = 0x20; //PWM0的占空比为87.5% ((100H-20H)/100H)
	CR = 1;                 // 允许PCA 模块运行
}

在CCP0引脚通过示波器,测得如上图所示波形。

PWM频率 = 11.0592MHz ÷ 12 ÷ 256 = 3.61KHz

PWM占空比 = (256 - [CCAP0H = CCAP0L]) ÷ 256

代码中注释的 100H = 256。

关乎16位软件定时器模式这里不做测试,其实就是高速脉冲输出的变种程序。

以上是关于11.STC15W408AS单片机CCP/PCA/PWM应用的主要内容,如果未能解决你的问题,请参考以下文章

11.STC15W408AS单片机CCP/PCA/PWM应用

11.STC15W408AS单片机CCP/PCA/PWM应用

STC15单片机利用PCA在扩展外部中断和定时器以及脉宽测量的应用示例

STC15系列CCP/PWM/PCA介绍

14.STC15W408AS单片机IIC驱动OLED

2.STC15W408AS单片机时钟