52xxAD系列单片机的内部集成了两路可编程计数阵列模块(PCA),可用于软件定时器、外部脉冲的捕捉、高速输出和脉宽调制输出(PWM)。
这儿主要是对PWM输出功用进行介绍。
首先要清楚与PCA/PWM运用有关的特别功用寄存器
符号
|
描绘
|
地址
|
位地址及其符号
|
复位值
|
|||||||
B7
|
B6
|
B5
|
B4
|
B3
|
B2
|
B1
|
B0
|
||||
CCON
|
PCA control register
|
D8H
|
CF
|
CR
|
CCF1
|
CCF0
|
00xx,xx00
|
||||
CMOD
|
PCA mode register
|
D9H
|
CIDL
|
CPS2
|
CPS1
|
CPS0
|
ECF
|
0xxx,0000
|
|||
CCAPM0
|
PCA module 0 mode register
|
DAH
|
ECOM0
|
CAPP0
|
CAPN0
|
MAT0
|
TOG0
|
PWM0
|
ECCF0
|
X000,0000
|
|
CCAPM1
|
PCA module 1 mode register
|
DBH
|
ECOM1
|
CAPP1
|
CAPN1
|
MAT1
|
TOG1
|
PWM1
|
ECCF1
|
X000,0000
|
|
CL
|
PCA base time low
|
E9H
|
0000,0000
|
||||||||
CH
|
PCA base time high
|
F9H
|
0000,0000
|
||||||||
CCAP0L
|
PCA module_0 captureregister low
|
EAH
|
0000,0000
|
||||||||
CCAP0H
|
PCA module0 capture register high
|
FAH
|
|||||||||
CCAP1L
|
PCA module_1 capture register low
|
EBH
|
0000,0000
|
||||||||
CCAP1H
|
PCA module_1 capture register high
|
FBH
|
0000,0000
|
||||||||
PCA_PWM0
|
PCA PWM mode auxiliary register 0
|
F2H
|
EPC0H
|
EPC0L
|
Xxxx,xx00
|
||||||
PCA_PWM1
|
PCA PWM mode auxilia
|
F3H
|
EPC1H
|
EPC1L
|
Xxxx,xx00
|
1、PCA作业形式寄存器CMOD
CIDL:闲暇形式下是否中止PCA计数的操控位
当CIDL=0时,闲暇形式下PCA计数器持续作业
当CIDL=1时,闲暇形式下PCA计数器中止作业
CPS2CPS1CPS0:pca计数器脉冲源挑选操控位。
0 0 0 0,体系时钟SYSCLK/12
0 0 1 1,体系时钟SYSCLK/2
0 1 0 2,定时器0的溢出脉冲。因为定时器0能够作业在1T形式,所以能够到达计一个时钟就溢出,然后到达最高频率CPU作业时时钟SYSCLOCK,经过改动定时器0的溢出率,能够完成可调频率的PWM输出。
0 1 1 3,ECI/P1.2(或P1.4)脚输入的外部时钟(最大速率=SYSCLK/2)
1 0 0 4,体系时钟 SYSCLK
1 0 1 5,体系时钟/4,sysclk/4
1 1 0 6,体系时钟/6,
1 1 1 7, 体系时钟/8
2、PCA操控寄存器CCON
CF:PCA计数器阵列溢出标志位。当PCA计数器溢出时,CF由硬件置位。假如CMOD寄存器的ECF方位位,则CF标志可用来发生中止。CF位可经过硬件或软件置位,但只可经过软件清零。
CR:PCA计数器阵列运转操控位,该位经过软件置位,用来发动计数器阵列计数,经过软件清零,用来封闭PCA计数器。
CCF1:pca模块1中止标志。当呈现匹配或捕获时该位由硬件置位,有必要经过软件清零
CCF0:PCA模块0中止标志。
3、PCA比较/捕获寄存器CCAPM0和CCAPM1
ECOM0:答应比较器功用操控位。为1,答应
CAPP0:正捕获操控位。为1,答应
CAPN0:负捕获操控位。为1,答应
MAT0:匹配操控位。
为1时,PCA计数值与模块的比较/捕获寄存器的值的匹配将置位CCON寄存器的中止标志位CCF0。
TOG0:翻转操控位。当tog0=1时,作业在PCA高速输出形式,PCA计数器的值与模块的比较/捕获寄存器的值的匹配将使CEX0脚翻转。(CCP0/PCA0/PWM0/P1.3)
PWM0:脉冲调理形式
当PWM0=1时,答应CEX0脚用作脉宽调理输出(CCP0/PCA0/PWM0/P1.3)
ECCF0:时能CCF0中止。使能寄存器CCON的比较/捕获标志CCF0,用来发生中止。
4、PCA的16位寄存器——低8位CL和高8位CH
用于保存PCA的装载值。
5、PCA捕捉/比较寄存器——CCAPnL(低位字节)和CCAPnH(高位字节)
当PCA模块用于捕获或比较时,它们用于保存各个模块的16位捕捉计数值;当PCA模块用于PWM形式时,它们用来操控输出的占空比。其间,n=0、1,别离对应模块0和模块1.复位值均为00H,对应的地址别离为:
CCAP0_EAH CCAP0H_FAH:
CCAP1_EBHCCAP1H_FAH;
PCA模块的作业形式设定表如下:
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位捕获形式,由CCPn/PCAn的上升沿触发
X 0 1 0 0 0 x 16位捕获形式,由CCPn/PCAn的下降沿触发
X 1 1 0 0 0 x 16位捕获形式,由CCPn/PCAn的跳变触发
1 0 0 1 0 0 x 16位软件定时器
1 0 0 1 1 0 x 16位高速输出
6、 PCA的16位计数器——低8位CL和高8位CH
用于保存PCA的装载值。
7、 PCA捕捉/比较寄存器CCAPnL(低位字节)和CCAPnH(高位字节)
当PCA 模块用于捕获或比较时,它们用于保存各个模块的16位捕捉计数值;当PCA模块用于PWM形式时,它们用来操控输出的占空比。其间,n=0,1别离对应模块0和模块1.复位值均为00H。它们对应的地址别离为:
CCAP0L_EAH CCAP0H_FAH:模块0的捕捉/比较寄存器
CCAP1L_EBH CCAP1H_FBH:模块1的捕捉/比较寄存器。
脉宽调理形式
Plus width modulation 是一种运用程序来操控波形占空比、周期、相位波形的技能,在三相电机驱动,D/A转化等场合有广泛的运用。
STC12C5201AD系列的PCA模块能够经过程序设定,使其作业于8位PWM形式。
因为一切的模块共用仅有的PCA定时器,一切它们的输出频率相同。各个模块的输出占空比是独立改变的,与运用的捕捉寄存器EPCnL,CCAPnL有关。当寄存器CL的值小于EPCnL,CCAPnL时,输出为低;当寄存器CL的值大于等于EPCnL,CCAPnL的值时,输出为高。当CL得值由FF变为00溢出时,EPCnH,CCAPnH的内容装载到EPCnL,CCAPnL中,这样就完成无搅扰的更新PWM 。要运用PWM形式,模块CCAPMn寄存器的PWMn和ECOMn位有必要置位。
因为PWM是8位的,故PWM的频率=PCA时钟输入源频率/256
PCA时钟输入源能够从以下的几种进行挑选:SYSCLK SYSCLY/2SYSCLK/4SYSCLK/6 SYSCLK/8SYSCLK/12定时器0的溢出,ECI/P3.4的输入。
假如要完成可调频率的PWM 输出,可挑选定时器0的溢出率或则ECI脚的输入作为PCA/PWM的时钟输入源
当EPCnL=0及CCAPnL-00H时,PWM固定输出高
当EPCnL=1及CCAPnL=FFH时,PWM固定输出低
当某个I/O口作为PWM运用时,改口的状况
PWM之前口的状况 PWM输出时口的状况
弱上拉/准双向强推挽输出/强上拉输出,要加输出限流电阻1K-10K
强推挽输出/强上拉输出强推挽输出/强上拉输出,要加输出限流电阻1K-10K
仅为输入/高阻 PWM无效
开漏开漏
下面就是STC手册中的一个C言语比如
#include
#include “intrins.h”
#define FOSC 12000000L
Typedef unsigned int WORD;
Typedef unsigned char BYTE;
sfr CCON=0xd8;//PCA control register
sbit CCF0=CCON^0;//PCA module_0 interrupt flag
sbit CCF1=CCON^1;//pca module_1 interrupt flag
sbit CR=CCON^6;//pca time run control bit
sbit CF=CCON^7;//PCA timer overflow flag
sfr CMOD=0xd9;//pca mode register
sfr CL=0xe9;//PCA base time low
sfr CH=0xf9;//PCA base time high
sfr CCAPM0=0XDA;//PCA module_0 mode register
sfr CCAP0L=0XEA;//PCA module_0 capture register low
sfr CCAP0H=0XFA;//PCA module_0 capture register high
sfr CCAPM1=0XDB;//PCA module_1 mode register
sfr CCAP1L=0xeb;//PCA module_1 capture register low
sfr CCAP1H=0XFB,//PCA module_1 capture register high
sfr PCAPWM0=0XF2;
sfr PCAPWM1=0XF3;
void main()
{
CCON=0;//initial PCA control register
//PCA timer stop running
//clear CF flag
//clear all module interrupt flag
CL=0;//reset PCA base timer
CH=0;
CMOD=0X02;//set PCA time clock source as fosc/2
//disable PCA timer overflow interrupt
CCAP0H=CCAP0L=0X80;//PWM0 port output 50% duty cycle sequare wave
CCAPM0=0X42;//PCA module_0 work in 8_bit PWM mode
// and no PCA interrupt
CCAP1H=CCAP1L=0XFF;//pwm1 port output 0% duty cycle square wave
PCAPWM1=0X03;//
CCAPM1=0X42;//PCA module_1 work in 8_bit PWM mode and no PCA interrupt
CR=1;//PCA timer start run
While(1);
}