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