STC15W408AS單片機(jī)集成了3路可編程計(jì)數(shù)器陣列(CCP/PCA)模塊可用于軟件定時(shí)器、外部脈沖的捕捉、高速脈沖輸出以及脈寬調(diào)制(PWM)輸出。
一、與CCP/PWM/PCA應(yīng)用有關(guān)的特殊功能寄存器
STC15系列 1T 8051單片機(jī) CCP/PCA/PWM特殊功能寄存器表 CCP/PCA/PWM SFRs
1.1PCA工作模式寄存器CMOD
PCA工作模式寄存器的格式如下:
CMOD : PCA工作模式寄存器
CIDL:空閑模式下是否停止PCA計(jì)數(shù)的控制位。
當(dāng)CIDL=0時(shí), 空閑模式下PCA計(jì)數(shù)器繼續(xù)工作
當(dāng)CIDL=1時(shí), 空閑模式下PCA計(jì)數(shù)器停止工作。
CPS2、CPS1、CPS0:PCA計(jì)數(shù)脈沖源選擇控制位。PCA計(jì)數(shù)脈沖選擇如下表所示。
例如,CPS2/CPS1/CPS0 = 1/0/0時(shí),CCP/PCA/PWM的時(shí)鐘源是SYSclk,不用定時(shí)器0PWM的頻率為SYSclk/256。
如果要用系統(tǒng)時(shí)鐘/3來(lái)作為PCA的時(shí)鐘源, 應(yīng)選擇T0的益處作為CCP/PCA/PWM的時(shí)鐘源,此時(shí)應(yīng)讓T0工作在1T模式,計(jì) 3個(gè)脈沖即產(chǎn)生溢出 用T0的溢出可對(duì)系統(tǒng)時(shí)鐘進(jìn)行1 ~ 65536級(jí)分頻(T0工作在16位重裝載模式)。
ECF:PCA計(jì)數(shù)溢出中斷使能 。
當(dāng)ECF = 0時(shí),禁止寄存器CCON中CF位的中斷;
當(dāng)ECF = 1時(shí),允許寄存器CCON中CF位的中斷。
1.2 PCA控制寄存器CCON
PCA控制寄存器的格式如下:
CCON : PCA控制控制寄存器
CF:PCA計(jì)數(shù)器陣列溢出標(biāo)志位。當(dāng)PCA計(jì)數(shù)器溢出時(shí) CF由硬件置位。如果CMOD寄存器的ECF位置位, CF標(biāo)志可用來(lái)產(chǎn)生中斷。CF位可通過(guò)硬件或軟件置位, 但只可通過(guò)軟 件清零。
CR:PCA計(jì)數(shù)器陣列運(yùn)行控制位。該位通過(guò)軟件置位, 用來(lái)起動(dòng)PCA計(jì)數(shù)器陣列計(jì)數(shù)。該位通過(guò)軟件清零, 用來(lái)關(guān)閉PCA計(jì)數(shù)器。
CCF2:PCA模塊2中斷標(biāo)志。當(dāng)出現(xiàn)匹配或捕獲時(shí)該位由硬件置位。該位必須通過(guò)軟件清零。
CCF1:PCA模塊1中斷標(biāo)志。當(dāng)出現(xiàn)匹配或捕獲時(shí)該位由硬件置位。該位必須通過(guò)軟件清零。
CCF0:PCA模塊0中斷標(biāo)志。當(dāng)出現(xiàn)匹配或捕獲時(shí)該位由硬件置位。該位必須通過(guò)軟件清零。
1.3 PCA比較/捕獲寄存器CCAPM0、CCAPM1和CCAPM2
PCA模塊0的比較/捕獲寄存器的格式如下:
CCAPM0 : PCA模塊0的比較/捕獲寄存器
B7:保留為將來(lái)之用。
ECOM0:允許比較器功能控制位
當(dāng)ECOM0=1時(shí),允許比較器功能
CAPP0:正捕獲控制位
當(dāng)CAPP0=1時(shí),允許上升沿捕獲
CAPN0:負(fù)捕獲控制位
當(dāng)CAPN0=1時(shí),允許下降捕獲
MAT0:匹配控制位
當(dāng)MAT0=1時(shí),PCA計(jì)數(shù)值與模塊的比較/捕獲寄存器的值的匹配將置位CCON寄存器的中斷標(biāo)志位CCF0。
TOG0:翻轉(zhuǎn)控制位
當(dāng)TOG0=1時(shí),工作在PCA高速脈沖輸出 PCA計(jì)數(shù)器的值與模塊的比較/捕獲
寄存器的值的匹配將使CCP0腳翻轉(zhuǎn)。
(CCP0/PCA0/PWM0/P1.1或CCP0_2/PCA0/PWM0/P3.5或CCP0_3/PCA0/PWM0/P2.5)
PWM0:脈寬調(diào)節(jié)模式。
當(dāng)PWM0=1時(shí), CCP0腳用作脈寬調(diào)節(jié)輸出。
(CCP0/PCA0/PWM0/P1.1或CCP0_2/PCA0/PWM0/P3.5或CCP0_3/PCA0/PWM0/P2.5)
ECCF0:使能CCF0中斷。使能寄存器CCON的比較/捕獲標(biāo)志CCF0, 用來(lái)產(chǎn)生中斷。
CCAPM1和CCAPM2分別是PCA1和PCA2模塊的比較/捕獲寄存器,功能了CCAPM0一樣,這里不做說(shuō)明了。
1.4 PCA的16位計(jì)數(shù)器 — 低8位CL和高8位CH
CL和CH地址分別為E9H和F9H,復(fù)位值均為00H,用于保存PCA的裝載值。
1.5 PCA捕捉/比較寄存器 — CCAPnL(低位字節(jié))和CCAPnH(高位字節(jié))
當(dāng)PCA模塊用于捕獲或比較時(shí),它們用于保存各個(gè)模塊的16位捕捉計(jì)數(shù)值;當(dāng)PCA模塊用于PWM模式時(shí),它們用來(lái)控制輸出的占空比。其中,n=0、1、2,分別對(duì)應(yīng)模塊0、模塊1和模塊2。復(fù)位值均為00H。它們對(duì)應(yīng)的地址分別為:
CCAP0L — EAH、CCAP0H — FAH:模塊0的捕捉/比較寄存器。
CCAP1L — EBH、CCAP1H — FBH:模塊1的捕捉/比較寄存器。
CCAP2L — ECH、CCAP2H — FCH:模塊2的捕捉/比較寄存器。
1.6 PCA模塊PWM寄存器PCA_PWM0、PCA_PWM1和PCA_PWM2
PCA模塊0的PWM寄存器的格式如下:
PCA_PWM0 : PCA模塊0的PWM寄存器
EBS0_1 , EBS0_0:當(dāng)PCA模塊0工作于PWM模式時(shí)的功能選擇位。
0 , 0 : PCA模塊0工作于8位PWM功能;
0 , 1 : PCA模塊0工作于7位PWM功能;
1 , 0 :PCA模塊0工作于6位PWM功能;
1 , 1 :無(wú)效,PCA模塊0仍工作于8位PWM模式.
EPC0H:在PWM模式下,與CCAP0H組成9位數(shù)。
EPC0L:在PWM模式下,與CCAP0L組成9位數(shù)。
PCA_PWM1和PCA_PWM2分別是PCA1和PCA2模塊的PWM寄存器,功能了PCA_PWM0一樣,這里不做說(shuō)明了。
PCA模塊的工作模式設(shè)定表位下表所示:
PCA模塊工作模式設(shè)定 CCAPMn寄存器,n = 0,1,2)
二、CCP/PCA模塊的工作模式
2.1 捕獲模式
PCA 模塊工作于捕獲模式的結(jié)構(gòu)圖如下圖所示。要使一個(gè)PCA模塊工作在捕獲模式,寄存器CCAPMn的兩位(CAPNn和 CAPPn)或其中任何一位必須置1。PCA模塊工作于捕獲模式時(shí),對(duì)模塊的外部CCPn CCP0/P1.1,CCP1/P1.0, CCP2/P3.7)的跳變進(jìn)行采樣。當(dāng)采樣到有效跳變時(shí),PCA硬件就將PCA計(jì)數(shù)器陣列列寄存器(CH和CL)的值裝載到模塊的捕獲寄存器中(CCAPnL和CCAPnH)。
PCA 捕獲模式圖
如果CCON特殊寄存器中的位CCFn和CCAPMn特殊功能寄存器的ECCFn位被置位,將產(chǎn)生中斷。可在中斷服務(wù)程序中判斷哪一個(gè)模塊產(chǎn)生了中斷,并注意中斷標(biāo)志位的軟件清零問(wèn)題。
2.2 捕獲模式測(cè)試程序
// PCA0 工作為 捕獲模式
// 這個(gè)模式有點(diǎn)類似 外部中斷或者計(jì)數(shù)器
#include "stc15.h"
int count = 0;
void PCAInit();
void main()
{
PCAInit();
EA = 1; // CPU開(kāi)放中斷
while (1);
}
// 捕獲模式 初始化
void PCAInit()
{
CMOD = 0x05; // PCA 計(jì)數(shù)器時(shí)鐘位 系統(tǒng)時(shí)鐘 允許CCON中的CF位中斷
CCON = 0x00; // 初始化 寄存器
CCAPM0 = 0x11; // 下降沿捕獲 使能CCF0 中斷
CL = 0;
CH = 0; // 初始化 計(jì)數(shù)器
CR = 1; // 允許PCA 模塊運(yùn)行
}
// 中斷服務(wù)程序
void PCA_isr() interrupt 7
{
CCF0 = 0; // 清除中斷標(biāo)志位
count ++;
if(count == 100)
{
count = 0;
P10 = !P10; // P10 取反
}
}
這里我采取的做法是,單片機(jī)的外部捕獲引腳CCP0(P1.1)外接到示波器的校準(zhǔn)輸出端上面,在中斷服務(wù)程序中計(jì)數(shù)100次,就把P1.0引腳輸出取反,這樣就把外部捕獲到的信號(hào)縮小了200倍輸出顯示了。
2.3 高速脈沖輸出模式
該模式中(下圖),當(dāng)PCA計(jì)數(shù)器的計(jì)數(shù)值與模塊捕獲寄存器的值相匹配時(shí),PCA模塊的CCPn輸出將發(fā)生翻轉(zhuǎn)。要激活高速脈沖輸出模式,CCAPMn寄存器的TOGn,MATn和ECOMn位必須都置位。
PCA 高速脈沖輸出模式
CCAPnL的值決定了PCA模塊n的輸出脈沖頻率。當(dāng)PCA時(shí)鐘源是SYSclk時(shí),輸出脈沖的頻率F位:
f = SYSclk / ([CPS2,CPS0] *2 * CCAPnL)
其中,SYSclk為系統(tǒng)時(shí)鐘頻率。由此,可以得到CCAPnL的值CCAPnL = SYSclk / ( 2×f ).
如果計(jì)算出的結(jié)果不是整數(shù),則進(jìn)行四舍五入取整,即
CCAPnL = INT (SYSclk / ( 2×f ) + 0.5 )
其中,INT( )為取整運(yùn)算,直接去掉小數(shù)。
2.4 高速脈沖輸出模式測(cè)試程序
#include "stc15.h"
#define uint unsigned int
#define T1KHz 5530; // SYSclk / ([CPS2,CPS0] *2 * CCAPnL)
uint value = 0;
void PCAInit();
void main()
{
PCAInit();
EA = 1; // CPU開(kāi)放中斷
while (1);
}
// 初始化PCA模塊
void PCAInit()
{
CMOD = 0x08; // PCA 計(jì)數(shù)器時(shí)鐘位 系統(tǒng)時(shí)鐘
CCON = 0x00; // 初始化 寄存器
CL = 0; //復(fù)位PCA計(jì)數(shù)器
CH = 0;
value = T1KHz;
CCAP0L = value; // 捕獲比較寄存器
CCAP0H = value > > 8;
value += T1KHz;
CCAPM0 = 0x4D; // 允許比較器功能
CR = 1; // 允許PCA 模塊運(yùn)行
}
// 中斷服務(wù)程序
void PCA_isr() interrupt 7
{
CCF0 = 0; //清中斷標(biāo)志
CCAP0L = value; // 捕獲比較寄存器
CCAP0H = value > > 8;
value += T1KHz;
}
在CCP0引腳通過(guò)示波器,測(cè)得如上圖所示波形。
這里的PCA模塊的頻率為單片機(jī)時(shí)鐘頻率11.0592MHz,所以對(duì)外輸出鐘頻是:
11.0592MHz ÷ (2 * 5530) = 1KHz。
2.5 脈寬調(diào)節(jié)模式(PWM)
脈寬調(diào)制(PWM,Pulse Width Modulation)是一種使用程序來(lái)控制波形占空比、周期、相位波形的技術(shù),在三相電機(jī)驅(qū)動(dòng)、D/A轉(zhuǎn)換等場(chǎng)合有廣泛的應(yīng)用。
STC15系列單片機(jī)的PCA模塊可以通過(guò)設(shè)定各自的寄存器PCA_PWMn (n=0,1,2.下同)中的位EBSn_1/PCA_PWMn.7及EBSn_0/PCA_PWMn.6,使其工作于8位PWM或7位PWM或6位PWM模式。
8位脈寬調(diào)節(jié)模式(PWM)
PCA PWM mode / 可調(diào)制脈沖寬度輸出模式結(jié)構(gòu)圖(PCA模塊工作于8位PWM模式)
當(dāng)PCA模塊工作于8位PWM模式時(shí), 由于所有模塊公用僅有PCA定時(shí)器,所有它們的輸出頻率相同。各個(gè)模塊的輸出占空比是獨(dú)立變化的,與使用的捕獲寄存{EPCnL,CCAPnL[7:0]}
有關(guān)。當(dāng){0,CL[7:0]}的值小于{EPCnL,CCAPnL[7:0]}時(shí),輸出為低;{0,CL[7:0]}的值等于或大于{EPCnL,CCAPnL[7:0]}時(shí),輸出為高。當(dāng)CL的值由FF變?yōu)?0溢出時(shí){EPCnH,CCAPnH[7:0]}的內(nèi)容裝載到{EPCnL,CCAPnL[7:0]}中。這樣就可實(shí)現(xiàn)無(wú)干擾地更新PWM。要使能PWM模式,模塊CCAPMn寄存器的PWMn和ECOMn位必須置位。
當(dāng)PWM是8位的時(shí):PWM的頻率=PCA時(shí)鐘輸入源頻率/256。
2.6 脈寬調(diào)節(jié)模式(PWM)測(cè)試程序
// PCA 工作為 PWM模式
#include "stc15.h"
void PCAInit();
void main()
{
PCAInit();
EA = 1; // CPU開(kāi)放中斷
while (1);
}
// 初始化
void PCAInit()
{
CMOD = 0x00; // PCA 計(jì)數(shù)器時(shí)鐘 系統(tǒng)時(shí)鐘/12
CCON = 0x00; // 初始化 寄存器
CCAPM0 = 0x42; //PCA模塊0 PWM模式
PCA_PWM0 = 0x00; //PCA模塊0 工作于8位PWM
CCAP0H = CCAP0L = 0x20; //PWM0的占空比為87.5% ((100H-20H)/100H)
CR = 1; // 允許PCA 模塊運(yùn)行
}
PWM頻率 = 11.0592MHz ÷ 12 ÷ 256 = 3.61KHz
PWM占空比 = (256 - [CCAP0H = CCAP0L]) ÷ 256
代碼中注釋的 100H = 256。
關(guān)乎16位軟件定時(shí)器模式這里不做測(cè)試,其實(shí)就是高速脈沖輸出的變種程序。
評(píng)論