STC12C5201AD单片机的PWM功能的应用总结

嵌入式技术

1329人已加入

描述

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);

}

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分