1
控制/MCU
STC15W408AS单片机集成了3路可编程计数器阵列(CCP/PCA)模块可用于软件定时器、外部脉冲的捕捉、高速脉冲输出以及脉宽调制(PWM)输出。
STC15系列 1T 8051单片机 CCP/PCA/PWM特殊功能寄存器表 CCP/PCA/PWM SFRs
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,不用定时器0PWM的频率为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位的中断。
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模块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一样,这里不做说明了。
CL和CH地址分别为E9H和F9H,复位值均为00H,用于保存PCA的装载值。
当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的捕捉/比较寄存器。
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)
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位被置位,将产生中断。可在中断服务程序中判断哪一个模块产生了中断,并注意中断标志位的软件清零问题。
// 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倍输出显示了。
该模式中(下图),当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( )为取整运算,直接去掉小数。
#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。
脉宽调制(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。
// 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 模块运行
}
PWM频率 = 11.0592MHz ÷ 12 ÷ 256 = 3.61KHz
PWM占空比 = (256 - [CCAP0H = CCAP0L]) ÷ 256
代码中注释的 100H = 256。
关乎16位软件定时器模式这里不做测试,其实就是高速脉冲输出的变种程序。
全部0条评论
快来发表一下你的评论吧 !