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);
}
評論
查看更多