花開見佛
能:外中斷(3個(gè))、定時(shí)器(1個(gè))、時(shí)鐘輸出(3個(gè))、PWM脈寬調(diào)制輸出
(3個(gè))。
1,PCA模塊工作于捕獲模式時(shí),對外部輸入CCPn引腳的跳變進(jìn)行采樣,當(dāng)采樣到有效跳變 時(shí),置位CCON中的CCFn,如果CCAPMn中的ECCFn位為1,將產(chǎn)生中斷,可在中斷服務(wù)程序中 根據(jù)標(biāo)志CCF2、CCF1、CCF0和CF判斷是哪一個(gè)模塊產(chǎn)生了中斷或是定時(shí)器溢出中斷,并注 意中斷標(biāo)志位的軟件清0問題。
例8.1 利用PCA模塊擴(kuò)展3路外部中斷。 說明:將P1.0(PCA模塊1的外部輸入)擴(kuò)展為上升沿/下降沿都可觸發(fā)的外部中斷,當(dāng)中 斷產(chǎn)生時(shí)對P0.0取反,將P1.1(PCA模塊0的外部輸入)擴(kuò)展為下降沿觸發(fā)的外部中斷,當(dāng) 中斷產(chǎn)生時(shí)對P0.1 取反,將P3.7(PCA模塊2的外部輸入)擴(kuò)展為上升沿/下降沿都可觸發(fā) 的外部中斷,當(dāng)中斷產(chǎn)生時(shí)對P0.3 取反, P0.0 、P0.1和P0.2連接LED燈指示狀態(tài)。
sbit | LED_PCA0=P0^1; |
| // | PCA0對應(yīng)P1.1腳 |
sbit | LED_PCA1=P0^0; |
| // | PCA1對應(yīng)P1.0腳 |
sbit void | LED_PCA2=P0^2; main (void) |
| // | PCA2對應(yīng)P3.7腳 |
{ |
|
|
|
|
port_mode(); | // | 所有IO口設(shè)為準(zhǔn)雙向弱上拉方式。 |
CMOD=0x80; | // | 空閑模式下停止PCA 計(jì)數(shù)器工作 |
| // | PCA 時(shí)鐘源為SYSclk /12,禁止PCA 計(jì)數(shù)器溢出時(shí)中斷 |
CCON=0; | // | 清0 PCA計(jì)數(shù)器溢出中斷請求標(biāo)志位CF |
{
{
CCF0=0; // 清PCA模塊0中斷標(biāo)志
}
{
CCF1=0; // 清PCA模塊1中斷標(biāo)志
}
{
CCF2=0; // 清PCA模塊2中斷標(biāo)志
}
}
16位定時(shí)器模式的結(jié)構(gòu)如圖8-3所示,定時(shí)精度與16位自動重裝的通用定時(shí)器相 同,但為了得到需要的輸出頻率,通常要在中斷函數(shù)中修改CCAPnH、CCAPnL遞 增步長值,并且必須讓CPU反復(fù)中斷,使用不如通用定時(shí)器方便。
出頻率,通常要在中斷函數(shù)中修改CCAPnH、CCAPnL遞增步長值,因此需要置位ECCFn打開 中斷。PCA計(jì)數(shù)器[CH,CL]每隔一定時(shí)間自動加1,時(shí)間間隔取決于選擇的時(shí)鐘源。例如, 當(dāng)選擇的時(shí)鐘源為SYSclk/12時(shí),每12個(gè)時(shí)鐘周期[CH,CL]加1,當(dāng)[CH,CL]增加到等于捕 捉/比較寄存器[CCAPnH,CCAPnL] 的值時(shí),CCFn=1,產(chǎn)生中斷請求,如果每次PCA模塊中 斷后,在中斷服務(wù)程序中給[CCAPnH,CCAPnL]增加一個(gè)相同的數(shù)值,那么下一次中斷來臨 的間隔時(shí)間T也是相同的,從而實(shí)現(xiàn)了定時(shí)功能,PCA計(jì)數(shù)器計(jì)數(shù)值與定時(shí)時(shí)間的計(jì)算公 式如下:
PCA計(jì)數(shù)器計(jì)數(shù)值(CCAPnH、CCAPnL設(shè)置值或遞增步長值)= 定時(shí)時(shí)間/計(jì)數(shù)脈沖周期
= 定時(shí)時(shí)間*計(jì)數(shù)脈沖頻率 假設(shè),系統(tǒng)時(shí)鐘頻率SYSclk = 22.1184MHz,選擇的時(shí)鐘源為SYSclk/12,定時(shí)時(shí)間T為
5ms,則PCA計(jì)數(shù)器計(jì)數(shù)值為:T*(SYSclk/12)= 0.005*22118400/12=9216 = 2400H,也 就是說,PCA 計(jì)數(shù)器計(jì)數(shù)2400H次,定時(shí)時(shí)間就是5ms,這也就是每次給[CCAPnH,CCAPnL] 增加的數(shù)值(步長)。
出引腳CCPn將發(fā)生翻轉(zhuǎn),要激活高速輸出模式,CCAPMn寄存器的ECOMn、MATn、TOGn位必須 都置位,為了得到需要的輸出頻率,需要在中斷函數(shù)中修改CCAPnH、CCAPnL遞增步長值, 因此需要置位ECCFn打開中斷。
= 定時(shí)時(shí)間×計(jì)數(shù)脈沖頻率 = ((1/Fout)/2)×計(jì)數(shù)脈沖頻率 = 計(jì)數(shù)脈沖頻率/(2×Fout) 其中Fout表示PCA模塊n輸出時(shí)鐘頻率。比如系統(tǒng)時(shí)鐘頻率SYSclk = 22.1184MHz,選擇的時(shí) 鐘源是SYSclk/2時(shí),要求在CCPn引腳輸出100KHz的方波,CCAPnH_CCAPnL遞增步長值 = (22118400/2)/(2×100000)=55.296,四舍五入取整得55,即十六進(jìn)制37H。
PWM意為脈沖寬度調(diào)制,可用于調(diào)整輸出直流平均電壓,對于矩形波而言,輸出平均壓等 于峰值電壓×占空比,占空比是一個(gè)脈沖周期內(nèi)高電平時(shí)間與周期的比值,例如,峰值電 壓等于5V,占空比等于50%的方波信號平均電壓等于2.5V,也就是萬用表直流檔測量得到 的電壓值,8位PWM模式結(jié)構(gòu)如圖所示, PWM輸出不需要使用中斷。
{0,CL[7:0]}與[EPCnL,CCAPnL[7:0]]進(jìn)行比較,當(dāng){0,CL[7:0]}中的值小于
{EPCnL,CCAPnL[7:0]}時(shí),輸出為低,當(dāng){0,CL[7:0]}中的值等于或大于
{EPCnL,CCAPnL[7:0]}時(shí),輸出為高,當(dāng)EPCnL=0且CCAPnL=00H時(shí),PWM固定輸出高,當(dāng) EPCnL=1且CCAPnL=FFH 時(shí),PWM固定輸出低。
PCA時(shí)鐘輸入源可以從以下8種中選擇一種:SYSclk/12、SYSclk /8、SYSclk /6、 SYSclk /4、SYSclk /2、SYSclk、定時(shí)器0的溢出、ECI/P1.2輸入。
PWM輸出占空比由{EPCnL,CCAPnL[7:0]}確定。
8位PWM的周期 = 計(jì)數(shù)脈沖周期×256
8位PWM的頻率 = 計(jì)數(shù)脈沖頻率/256
8位PWM的脈寬時(shí)間(高電平時(shí)間)= 計(jì)數(shù)脈沖周期×(256-CCAPnL)
8位PWM的占空比 = 脈寬時(shí)間/PWM周期 = (1- CCAPnL/256) ×100% 如果要實(shí)現(xiàn)給定頻率的PWM輸出,可選擇定時(shí)器0的溢出作為PCA的時(shí)鐘輸入源。當(dāng)某個(gè) I/O 口作為PWM使用時(shí),該口自動切換到強(qiáng)推挽輸出模式。
說明:利用PCA模塊0實(shí)現(xiàn)在P1.1輸出占空比固定的PWM信號,假設(shè)R/C時(shí)鐘頻率Fosc = 22.1184MHz。
#include "STC15W4K.H" // 包含STC15W4K寄存器定義文件
void initPWM()
{
// 選擇PCA時(shí)鐘源為Fosc/12,禁止PCA計(jì)數(shù)器溢出時(shí)中斷 CCAPM0=0x42; // 設(shè)置PCA模塊為PWM輸出方式。
CR=1; // PCA計(jì)數(shù)器開始運(yùn)行
}
{
CCAP0H=0x20; // 脈寬控制
while(1); // 讓程序停在這里。
}
| 歡迎光臨 (http://www.raoushi.com/bbs/) | Powered by Discuz! X3.1 |