STC15F2K60S2的脉冲捕获应用
1.PCA工作模式寄存器CMOD
PCA工作模式寄存器的格式如下:
CMOD:PCA工作模式寄存器
SFR name |
Address |
bit |
B7 |
B6 |
B5 |
B4 |
B3 |
B2 |
B1 |
B0 |
CCON |
D9H |
name |
CIDL |
- |
- |
- |
CPS2 |
CPS1 |
CPS0 |
ECF |
CIDL:空闲模式下是否停止PCA计数的控制位。
当CIDL=0时,空闲模式下PCA计数器继续工作;
当CIDL=1时,空闲模式下PCA计数器停止工作。
CPS2、CPS1、CPS0:PCA计数脉冲源选择控制位。PCA计数脉冲选择如下表所示。
CPS2 |
CPS1 |
CPS0 |
选择PCA/PWM时钟源输入 |
0 |
0 |
0 |
0,系统时钟,SYSclk/12 |
0 |
0 |
1 |
1,系统时钟,SYSclk/2 |
0 |
1 |
0 |
2,定时器0的溢出脉冲。由于定时器0可以工作在T1模式,所以可以达到记一个时钟就溢出,从而达到最高频率CPU工作时钟SYSclk,通过改变定时器0的溢出率,可以实现可调频率的PWM输出 |
0 |
1 |
1 |
3,ECI/P1.2(或P4.1)脚输入的外部时钟(最大速率=SYSclk/2) |
1 |
0 |
0 |
4,系统时钟,SYSclk |
1 |
0 |
1 |
5,系统时钟/4,SYSclk/4 |
1 |
1 |
0 |
6,系统时钟/6,SYSclk/6 |
1 |
1 |
1 |
7,系统时钟/8,SYSclk/8 |
例如,CPS2/CPS1/CPS0=1/0/0时,PCA/PWM的时钟源是SYSclk,不用定时器0,PWM的频率为SYSclk/256
如果要用系统时钟/3来作为PCA的时钟源,应让T0工作在1T模式,计数3个脉冲即产生溢出。输出14K~19K频率的PWM。用T0的溢出可对系统时钟进行1~256级分频。
ECF:PCA计数溢出中断使能位。
当ECF=0时,禁止寄存器CCON中CF位的中断。
当ECF=1时,允许寄存器CCON中CF位的中断。
2.PCA控制寄存器CCON
PCA控制寄存器的格式如下:
CCON:PCA控制控制寄存器
SFR name |
Address |
bit |
B7 |
B6 |
B5 |
B4 |
B3 |
B2 |
B1 |
B0 |
CCON |
D8H |
name |
CF |
CR |
- |
- |
- |
- |
CCF1 |
CCF0 |
CF:PCA计数器阵列溢出标志位。当PCA计数器溢出时,CF由硬件置位。如果CMOD寄存器的ECF位置位,则CF标志可用来产生中断。CF位可通过硬件或软件置位,但只可通过软件清零。
CR:PCA计数器阵列运行控制位。该位通过软件置位,用来起动PCA计数器阵列计数。该位通过软件清零,用来关闭PCA计数器。
CCF1:PCA模块1中断标志。当出现匹配或捕获时该位有硬件置位。该位必须通过软件清零.
CCF0:PCA模块0中断标志。当出现匹配或捕获时改为由硬件置位。该位必须通过软件清零。
3.PCA比较/捕获寄存器CCAPM0和CCAPM1
PCA模块0的比较/捕获寄存器的格式如下:
CCAPM0:PCA模块0的比较、捕获寄存器
SFR name |
Address |
Bit |
B7 |
B6 |
B5 |
B4 |
B3 |
B2 |
B1 |
B0 |
CCAPM0 |
DAH |
name |
- |
ECOM0 |
CAPP0 |
CAPN0 |
MAT0 |
TOG0 |
PWM0 |
ECCF0 |
B7 :保留为将来之用。
ECOM0:允许比较器功能控制位。
当ECOM0 =1时,允许比较器功能。
CAPP0:正捕获控制位。
当CAPP0 = 1时,允许上升沿捕获。
CAPN0 :负捕获控制位。
当CAPN0 = 1时,允许下降沿捕获。
MAT0:匹配控制位。
当MAT0 = 1时,PCA计数值与模块的比较/捕获寄存器的值的匹配将置位CCON寄存器的中断段标志位CCF0.
TOG0:翻转控制位。
当TOG0 = 1时。工作在PCA高速输出模式,PCA计数器的值与模块的比较/捕获寄存器的值得匹配将使CEX0脚翻转。
(CEX0 / PCA0 / PWM0 / P1.3或CEX0 / PCA0/PWM 0 / P4.2)
PWM0:脉宽调节模式。
当PWM0 = 1时,允许CEX0脚用作脉宽调节输出。
(CEX0 / PCA0 /PWM0 / P1.3或CEX0/PCA0/PWM0 / P4.2)
ECCF0:使能CCF0 中断。使能寄存器CCON的比较 / 捕获标志CCF0,用来产生中断。
PCA模块1的比较 / 捕获寄存器的格式如下:
CCAPM1:PCA模块1的比较 / 捕获寄存器
SFR name |
Address |
Bit |
B7 |
B6 |
B5 |
B4 |
B3 |
B2 |
B1 |
B0 |
CCAPM1 |
DBH |
name |
- |
ECOM1 |
CAPP1 |
CAPN1 |
MAT1 |
TOG1 |
PWM1 |
ECCF1 |
B7:保留为将来之用。
ECOM1:允许比较器功能控制位。
当ECOM1=1时,允许比较器功能。
CAPP1:正捕获控制位。
当CAPP1 = 1时,允许上升沿捕获。
CAPN1:负捕获控制位。
当CAPN1= 1,允许下降沿捕获。
MAT1:匹配控制位。
当MAT1=1,PCA计数值与模块的比较 / 捕获寄存器的值得匹配将置位CCON寄存器的中断标志位CCF1。
TOG1翻转控制位。
当TOG1= 1时。工作在PCA高速输出模式,PCA计数器的值与模块的比较/捕获寄存器的值得匹配将使CEX1翻转。
(CEX1/ PCA1/ PWM1 P1.4或EX1 /CA1/WM 1/ P4.3
PWM1脉宽调节模式。
当PWM1= 1时,允许CEX1脚作脉宽调节输出。
(CEX1/ PCA1/PWM1/ P1.4或EX1/CA1/WM1/ P4.3
ECCF1:使能CCF0 中断。使能寄存器CCON的比较 / 捕获标志CCF1,用来产生中断。
PCA模块的工作模式设定表如下表所列:
PCA模块工作模式设定(CCAPMn寄存器,n=0,1)
- |
ECOMn |
CAPPn |
CAPNn |
MATn |
TOGn |
PWMn |
ECCFn |
模块功能 |
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
无此操作 |
|
1 |
0 |
0 |
0 |
0 |
1 |
0 |
8位PWM,无中断 |
|
1 |
1 |
0 |
0 |
0 |
1 |
1 |
8位PWM输出,由低变高产生中断 |
|
1 |
0 |
1 |
0 |
0 |
1 |
1 |
8位PWM输出,由高变低产生中断 |
|
1 |
1 |
1 |
0 |
0 |
1 |
1 |
8位PWM输出,由高变低或由低到高 |
|
X |
1 |
0 |
0 |
0 |
0 |
X |
16位捕获模式,由CEXn/PCAn的上升沿触发 |
|
X |
0 |
1 |
0 |
0 |
0 |
X |
16位捕获模式,由CEXn/PCAn的下降沿触发 |
|
X |
1 |
1 |
0 |
0 |
0 |
X |
16位捕获模式,由CEXn/PCAn的跳变触发 |
|
1 |
0 |
0 |
1 |
0 |
0 |
X |
16位软件定时器 |
|
1 |
0 |
0 |
1 |
1 |
0 |
X |
16位高速输出 |
PCA的16位计数器——低8位CL和8位CH
CL和CH地址分别为E9H和F9H,复位值均为00H,用于保存PCA的装载值。
PCA捕捉/比较寄存器——CCAPnL(低位字节)和CCAPnH(高位字节)
当PCA模块用于捕获或比较时,它们用于保存各个模块的16位捕捉计数值;当PCA模块用于PWM模式时,它们用于控制输出的占空比。其中,n = 0、1,分别对应模块0和模块1。复位值均为00H。它们对应的地址分别为:
CCAP0L——EAH、CCAP0H——FAH:模块0的捕捉/比较寄存器。
CCAP1L——EBH、CCAP1H——FBH:模块1的捕捉/比较寄存器。
PCA模块PWM寄存器PCA_PWM0和PCA_PWM1
PCA模块0的PWM寄存器的格式如下:
PCA_PWM0:PCA模块0的PWM寄存器
SFR name |
Address |
bit |
B7 |
B6 |
B5 |
B4 |
B3 |
B2 |
B1 |
B0 |
PCA_PWM0 |
F2H |
name |
- |
- |
- |
- |
- |
- |
EPC0H |
EPC0L |
EPC0H:在PWM模式下,与CCAP0H组成9位数。
EPC0L:在PWM模式下,与CCAP0L组成9位数。
PCA模块1的PWM寄存器的格式如下:
PCA_PWM1:PCA模块1的PWM寄存器
SFR name |
Address |
bit |
B7 |
B6 |
B5 |
B4 |
B3 |
B2 |
B1 |
B0 |
PCA_PWM1 |
F3H |
name |
- |
- |
- |
- |
- |
- |
EPC1H |
EPC1L |
EPC1H:在PWM模式下,与CCAP1H组成9位数。
EPC1L:在PWM模式下,与CCAP1L组成9位数。
PCA模块的工作模式
捕获模式:
要使一个PCA模块工作在捕获模式,寄存器CCAPMn的两位(CAPNn和CAPPn)或其中任何一位必须置1。PCA模块工作于捕获模式时,对模块的外部CCPn输入(CCP0/P1.3,CCP1/P1.4)的跳变进行采样。当采样到有效跳变时,PCA硬件就将PCA计数器阵列寄存器(CH和CL)的值装载到模块的捕获寄存器中(CCAPnL和CCAPnH)。
如果CCON特殊功能寄存器的位CCFn和CCAPMn特殊功能寄存器中的位ECCFn位被置位,将产生中断。可在中断服务程序中判断哪一个模块产生了中断,并注意中断标志位的软件清零问题。
位软件定时器模式
通过置位CCAPMn寄存器的ECOM和MAT位,可使PCA模块用作软件定时器(上图)。PCA定时器的值与模块捕获寄存器的值相比较,当两者相等时,如果位CCFn(在CCON特殊功能寄存器中)和位ECCFn(在CCAPMn特殊功能寄存器中)都置位,将产生中断。
[CH,CL]每隔一定的时间自动加1,时间间隔取决于选择的时钟源。例如,当选择的时钟源为SYSclk/12,每12个时钟周期[CH,CL]加1。当[CH,CL]增加到等于[CCAP nH,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]增加的数值(步长)。
脉宽调节模式(PWM)
脉宽调节模式(PWM, Pulse Width Modulation)是一种使用程序来控制波形占空比、周期、相位波形的技术,在三相电机驱动、D/A转换等场合有广泛的应用。STC12C5A60S2系列单片机的PCA模块可以通过程序设定,使其工作于8位PWM模式。PWM模式的结构如下图所示。
所有PCA模块都可用作PWM输出。输出频率取决于PCA定时器的时钟源。
由于所有模块共用仅有的PCA定时器,所有它们的输出频率相同。各个模块的输出占空比是独立变化的,与使用的捕获寄存器[EPCnL,CCAPn]有关。当寄存器CL的值小于{EPCNL,CCAPNL}时,输出为低;当寄存器CL的值等于或大于{ EPCnL,CCAPnL}时,输出为高。当CL的值由FF变为00溢出时,[EPCnH,CCQAPnH]的内容装载到{ EPCnL,CCAPnL }中。这样就可实现无干扰地更新PWM。要使能PWM模式,模块CCAPMn寄存器的PWMn和ECOMn位必须置位。
由于PWM是8位的,所以:PWM的频率=PCA时钟输入源频率 / 256
PCA时钟输入源可以从以下8种中选择一种:SYScLK,SYSclk/2,SYSclk/4,SYSclk/6, SYSclk/8,SYSclk/12,定时器0的溢出,ECI/P3.4输出入。
举例:要求PWM输出频率为38KHZ,选SYSclk为PCA/PWM时钟输入源,求出SYSclk的值
由计算公式38000=SYSclk/256,得到外部时钟频率SYSclk = 38000 x256 x 1=9728000
如果要实现可调频率的PWM输出,可选择定时器0的溢出率或者ECI脚的脚入作为PCA/PWM的时钟输入源
当EPCnL = 0及ECCAPnL= 00H时,PWM固定输出高
当EPCnL = 1及ECCAPnL = 0FFH时,PWM固定输出低
当某个I/O口作为PWM使用时,该口的状态:
PWM之前口的状态 |
PWM输出时的状态 |
弱上拉/准双向 |
强推挽输出/强上拉输出,要加输出限流电阻1K~10K |
强推挽输出/强上拉输出 |
强推挽输出/强上拉输出,要加输出限流电阻1K~10K |
仅为输入/高阻 |
PWM无效 |
开漏 |
开漏 |
4.程序:
#include
sfr CCON = 0xd8;
sfr CMOD = 0xd9; //PCA工作模式寄存器
sfr CCAPMO = 0xda;
sfr CCAPM1 = 0xdb;
sfr CCAPM2 = 0xdc;
sfr CL = 0xe9;
sfr CH = 0xF9;
sfr CCAP0L = 0xea;
sfr CCAP0H = 0xfa;
sfr CCAP1L = 0xeb;
sfr CCAP1H = 0xfb;
sfr CCAP2L = 0xec;
sfr CCAP2H = 0xfc;
code unsigned char seven_seg[] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned int cp;
unsigned int a,b,k;
sbit P3_4 = P3^4; //数码管位选
sbit P3_5 = P3^5;
sbit P3_6 = P3^6;
sbit P3_2 = P3^2; //PWM输出
bit P3_2_s; //状态变量
unsigned char i = 30,j;
void timer0_init(void)
{
TMOD= 0x01;
TH0= (65536 - 1000) / 256;
TL0= (65536 - 1000) % 256;
EA= 1;
ET0= 1; //设置中断优先次序寄存器IP中的PT0位,Timer0中断优先
TR0= 1;
}
void timer0_isr() interrupt 1
{
TH0= (65536 - 1000) / 256;
TL0= (65536 - 1000) % 256;
cp++;
if(cp>= 500) // 半秒
{
cp= 0;
k++;
}
if(P3_2== 0 && P3_2_s == 0)P3_2_s = 1; //记脉冲
if(P3_2== 1 && P3_2_s == 1)
{
P3_2_s= 0;
b++;
}
if(k>= 2) //1秒
{
k= 0;
a= b;
b= 0;
}
P2= 0xff;
P3= 0xff;
switch(j)
{
case0: P2 = seven_seg[a % 10]; P3_6 = 0;break;
case1: P2 = seven_seg[a / 10 %10]; P3_5 = 0;break;
case2: P2 = seven_seg[a / 100 % 10]; P3_4 = 0;break;
}
j++;
if(j>= 3) j = 0;
}
pwm_inti(void)
{
CCAPMO= 0x42; // PCA比较/捕获寄存器,允许比较器功能控制位,脉冲调节
CCAPM1= 0x42; //允许比较器功能,脉冲调节模式
CCAPM2= 0x42;
CL= 0; //reset PCA base timer
CH= 0;
CMOD= 0x0a; //PWM时钟源输入,系统时钟/4
CCON= 0X40; //通过软件置位,启动PCA计数器阵列计数
}
main(void)
{
pwm_inti();
timer0_init();
while(1)
{
if(CL== 0xff)
{
CCAP0L= 256 - i;
CCAP0H= 256 - i;
CCAP1L= 256 - i;
CCAP1H= 256 - i;
CCAP2L= 256 - i;
CCAP2H= 256 - i;
}
}
}