×
嵌入式 > 技术百科 > 详情

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

发布时间:2020-06-03 发布时间:
|
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/2 SYSCLK/4 SYSCLK/6 SYSCLK/8 SYSCLK/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);
}
 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
激光跟踪仪市场2023年有望达5.216亿美元