嵌入式技术
52xxAD系列单片机的内部集成了两路可编程计数阵列模块(PCA),可用于软件定时器、外部脉冲的捕捉、高速输出和脉宽调制输出(PWM)。
这里主要是对PWM输出功能进行介绍。
首先要清楚与PCA/PWM应用有关的特殊功能寄存器
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);
}
全部0条评论
快来发表一下你的评论吧 !