52xxAD系列單片機(jī)的內(nèi)部集成了兩路可編程計(jì)數(shù)陣列模塊(PCA),可用于軟件定時(shí)器、外部脈沖的捕捉、高速輸出和脈寬調(diào)制輸出(PWM)。
這里主要是對(duì)PWM輸出功能進(jìn)行介紹。
首先要清楚與PCA/PWM應(yīng)用有關(guān)的特殊功能寄存器
1、PCA工作模式寄存器CMOD
CIDL:空閑模式下是否停止PCA計(jì)數(shù)的控制位
當(dāng)CIDL=0時(shí),空閑模式下PCA計(jì)數(shù)器繼續(xù)工作
當(dāng)CIDL=1時(shí),空閑模式下PCA計(jì)數(shù)器停止工作
CPS2CPS1CPS0:pca計(jì)數(shù)器脈沖源選擇控制位。
0 0 0 0,系統(tǒng)時(shí)鐘SYSCLK/12
0 0 1 1,系統(tǒng)時(shí)鐘SYSCLK/2
0 1 0 2,定時(shí)器0的溢出脈沖。由于定時(shí)器0可以工作在1T模式,所以可以達(dá)到計(jì)一個(gè)時(shí)鐘就溢出,從而達(dá)到最高頻率CPU工作時(shí)時(shí)鐘SYSCLOCK,通過改變定時(shí)器0的溢出率,可以實(shí)現(xiàn)可調(diào)頻率的PWM輸出。
0 1 1 3,ECI/P1.2(或P1.4)腳輸入的外部時(shí)鐘(最大速率=SYSCLK/2)
1 0 0 4,系統(tǒng)時(shí)鐘 SYSCLK
1 0 1 5,系統(tǒng)時(shí)鐘/4,sysclk/4
1 1 0 6,系統(tǒng)時(shí)鐘/6,
1 1 1 7, 系統(tǒng)時(shí)鐘/8
2、PCA控制寄存器CCON
CF:PCA計(jì)數(shù)器陣列溢出標(biāo)志位。當(dāng)PCA計(jì)數(shù)器溢出時(shí),CF由硬件置位。如果CMOD寄存器的ECF位置位,則CF標(biāo)志可用來產(chǎn)生中斷。CF位可通過硬件或軟件置位,但只可通過軟件清零。
CR:PCA計(jì)數(shù)器陣列運(yùn)行控制位,該位通過軟件置位,用來啟動(dòng)計(jì)數(shù)器陣列計(jì)數(shù),通過軟件清零,用來關(guān)閉PCA計(jì)數(shù)器。
CCF1:pca模塊1中斷標(biāo)志。當(dāng)出現(xiàn)匹配或捕獲時(shí)該位由硬件置位,必須通過軟件清零
CCF0:PCA模塊0中斷標(biāo)志。
3、PCA比較/捕獲寄存器CCAPM0和CCAPM1
ECOM0:允許比較器功能控制位。為1,允許
CAPP0:正捕獲控制位。為1,允許
CAPN0:負(fù)捕獲控制位。為1,允許
MAT0:匹配控制位。
為1時(shí),PCA計(jì)數(shù)值與模塊的比較/捕獲寄存器的值的匹配將置位CCON寄存器的中斷標(biāo)志位CCF0。
TOG0:翻轉(zhuǎn)控制位。當(dāng)tog0=1時(shí),工作在PCA高速輸出模式,PCA計(jì)數(shù)器的值與模塊的比較/捕獲寄存器的值的匹配將使CEX0腳翻轉(zhuǎn)。(CCP0/PCA0/PWM0/P1.3)
PWM0:脈沖調(diào)節(jié)模式
當(dāng)PWM0=1時(shí),允許CEX0腳用作脈寬調(diào)節(jié)輸出(CCP0/PCA0/PWM0/P1.3)
ECCF0:時(shí)能CCF0中斷。使能寄存器CCON的比較/捕獲標(biāo)志CCF0,用來產(chǎn)生中斷。
4、PCA的16位寄存器——低8位CL和高8位CH
用于保存PCA的裝載值。
5、PCA捕捉/比較寄存器——CCAPnL(低位字節(jié))和CCAPnH(高位字節(jié))
當(dāng)PCA模塊用于捕獲或比較時(shí),它們用于保存各個(gè)模塊的16位捕捉計(jì)數(shù)值;當(dāng)PCA模塊用于PWM模式時(shí),它們用來控制輸出的占空比。其中,n=0、1,分別對(duì)應(yīng)模塊0和模塊1.復(fù)位值均為00H,對(duì)應(yīng)的地址分別為:
CCAP0_EAH CCAP0H_FAH:
CCAP1_EBHCCAP1H_FAH;
PCA模塊的工作模式設(shè)定表如下:
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輸出,由低變高可產(chǎn)生中斷
1 0 1 0 0 1 1 8位PWM輸出,由高變低可產(chǎn)生中斷
1 1 1 0 0 1 1 8位PWM輸出,由低變高或者有高變低均可產(chǎn)生中斷
X 1 0 0 0 0 x 16位捕獲模式,由CCPn/PCAn的上升沿觸發(fā)
X 0 1 0 0 0 x 16位捕獲模式,由CCPn/PCAn的下降沿觸發(fā)
X 1 1 0 0 0 x 16位捕獲模式,由CCPn/PCAn的跳變觸發(fā)
1 0 0 1 0 0 x 16位軟件定時(shí)器
1 0 0 1 1 0 x 16位高速輸出
6、 PCA的16位計(jì)數(shù)器——低8位CL和高8位CH
用于保存PCA的裝載值。
7、 PCA捕捉/比較寄存器CCAPnL(低位字節(jié))和CCAPnH(高位字節(jié))
當(dāng)PCA 模塊用于捕獲或比較時(shí),它們用于保存各個(gè)模塊的16位捕捉計(jì)數(shù)值;當(dāng)PCA模塊用于PWM模式時(shí),它們用來控制輸出的占空比。其中,n=0,1分別對(duì)應(yīng)模塊0和模塊1.復(fù)位值均為00H。它們對(duì)應(yīng)的地址分別為:
CCAP0L_EAH CCAP0H_FAH:模塊0的捕捉/比較寄存器
CCAP1L_EBH CCAP1H_FBH:模塊1的捕捉/比較寄存器。
脈寬調(diào)節(jié)模式
Plus width modulation 是一種使用程序來控制波形占空比、周期、相位波形的技術(shù),在三相電機(jī)驅(qū)動(dòng),D/A轉(zhuǎn)換等場(chǎng)合有廣泛的應(yīng)用。
STC12C5201AD系列的PCA模塊可以通過程序設(shè)定,使其工作于8位PWM模式。
由于所有的模塊共用僅有的PCA定時(shí)器,所有它們的輸出頻率相同。各個(gè)模塊的輸出占空比是獨(dú)立變化的,與使用的捕捉寄存器EPCnL,CCAPnL有關(guān)。當(dāng)寄存器CL的值小于EPCnL,CCAPnL時(shí),輸出為低;當(dāng)寄存器CL的值大于等于EPCnL,CCAPnL的值時(shí),輸出為高。當(dāng)CL得值由FF變?yōu)?0溢出時(shí),EPCnH,CCAPnH的內(nèi)容裝載到EPCnL,CCAPnL中,這樣就實(shí)現(xiàn)無干擾的更新PWM 。要使用PWM模式,模塊CCAPMn寄存器的PWMn和ECOMn位必須置位。
由于PWM是8位的,故PWM的頻率=PCA時(shí)鐘輸入源頻率/256
PCA時(shí)鐘輸入源可以從以下的幾種進(jìn)行選擇:SYSCLK SYSCLY/2SYSCLK/4SYSCLK/6 SYSCLK/8SYSCLK/12定時(shí)器0的溢出,ECI/P3.4的輸入。
如果要實(shí)現(xiàn)可調(diào)頻率的PWM 輸出,可選擇定時(shí)器0的溢出率或則ECI腳的輸入作為PCA/PWM的時(shí)鐘輸入源
當(dāng)EPCnL=0及CCAPnL-00H時(shí),PWM固定輸出高
當(dāng)EPCnL=1及CCAPnL=FFH時(shí),PWM固定輸出低
當(dāng)某個(gè)I/O口作為PWM使用時(shí),改口的狀態(tài)
PWM之前口的狀態(tài) PWM輸出時(shí)口的狀態(tài)
弱上拉/準(zhǔn)雙向強(qiáng)推挽輸出/強(qiáng)上拉輸出,要加輸出限流電阻1K-10K
強(qiáng)推挽輸出/強(qiáng)上拉輸出強(qiáng)推挽輸出/強(qiáng)上拉輸出,要加輸出限流電阻1K-10K
僅為輸入/高阻 PWM無效
開漏開漏
下面便是STC手冊(cè)中的一個(gè)C語(yǔ)言例子
#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);
}
評(píng)論
查看更多