51單片機輕松入門—基于STC15W4K系列(C語言版)
李友全 編著:http://www.zg4o1577.cn/bbs/dpj-37954-1.html
第8章 CCP/PCA/PWM模塊(可用作DAC) 1 捕獲模式(用于擴展外中斷) 2 16位定時器模式 3 高速輸出模式 4 脈寬調節模式
花開見佛
CCP/PCA/PWM模塊其實是1個模塊,通過不同的軟件設置可實現4種不同的功
%E7%AC%AC8%E7%AB%A0--ccp_pca__pwm(%E5%8F%AF%E7%94%A8%E4%BD%9Cdac)-3.jpg (21.1 KB, 下載次數: 160)
下載附件
2016-3-28 03:01 上傳
能:外中斷(3個)、定時器(1個)、時鐘輸出(3個)、PWM脈寬調制輸出 (3個)。
%E7%AC%AC8%E7%AB%A0--ccp_pca__pwm(%E5%8F%AF%E7%94%A8%E4%BD%9Cdac)-5.jpg (47.05 KB, 下載次數: 168)
下載附件
2016-3-28 03:01 上傳
1 捕獲模式(用于擴展外中斷)
PCA模塊工作于捕獲模式的結構如圖所示。 要使PCA 模塊工作在捕獲模式,寄存器CCAPMn的兩位CAPPn和CAPNn中至少有一位必須置 1,PCA模塊工作于捕獲模式時,對外部輸入CCPn引腳的跳變進行采樣,當采樣到有效跳變 時,置位CCON中的CCFn,如果CCAPMn中的ECCFn位為1,將產生中斷,可在中斷服務程序中 根據標志CCF2、CCF1、CCF0和CF判斷是哪一個模塊產生了中斷或是定時器溢出中斷,并注 意中斷標志位的軟件清0問題。
例8.1 利用PCA模塊擴展3路外部中斷。 說明:將P1.0(PCA模塊1的外部輸入)擴展為上升沿/下降沿都可觸發的外部中斷,當中 斷產生時對P0.0取反,將P1.1(PCA模塊0的外部輸入)擴展為下降沿觸發的外部中斷,當 中斷產生時對P0.1 取反,將P3.7(PCA模塊2的外部輸入)擴展為上升沿/下降沿都可觸發 的外部中斷,當中斷產生時對P0.3 取反, P0.0 、P0.1和P0.2連接LED燈指示狀態。 #include "STC15W4K.H" // 包含STC15W4K寄存器定義文件 sbit | LED_PCA0=P0^1; |
| // | PCA0對應P1.1腳 | sbit | LED_PCA1=P0^0; |
| // | PCA1對應P1.0腳 | sbit void | LED_PCA2=P0^2; main (void) |
| // | PCA2對應P3.7腳 | { |
|
|
|
|
port_mode(); | // | 所有IO口設為準雙向弱上拉方式。 | CMOD=0x80; | // | 空閑模式下停止PCA 計數器工作 |
| // | PCA 時鐘源為SYSclk /12,禁止PCA 計數器溢出時中斷 | CCON=0; | // | 清0 PCA計數器溢出中斷請求標志位CF |
// CR = 0, 不允許PCA計數器計數;PCA各模塊中斷請求標志位CCFn清0 CL=0; // PCA 計數器清0 CH=0; CCAPM0=0x11; // 設置PCA模塊0下降沿觸發捕捉功能 CCAPM1=0x31; // 設置PCA模塊1上升/下降沿均可觸發捕捉功能 CCAPM2=0x31; // 設置PCA模塊2上升/下降沿均可觸發捕捉功能 EA=1; // 開整個單片機所有中斷共享的總中斷控制位 CR=1; // 啟動 PCA 計數器(CH,CL)計數 while(1); // 等待中斷 } void PCA(void) interrupt 7 // PCA中斷服務程序 { if(CCF0) // PCA模塊0中斷服務程序 { LED_PCA0=! LED_PCA0; // LED_PCA0取反,表示PCA模塊0發生了中斷 CCF0=0; // 清PCA模塊0中斷標志 } else if(CCF1) // PCA模塊1中斷服務程序 { LED_PCA1=!LED_PCA1; // LED_PCA1取反, 表示PCA模塊1發生了中斷 CCF1=0; // 清PCA模塊1中斷標志 } else if(CCF2) // PCA模塊2中斷服務程序 { LED_PCA2=!LED_PCA2; // LED_PCA2取反, 表示PCA模塊2發生了中斷 CCF2=0; // 清PCA模塊2中斷標志 } }
%E7%AC%AC8%E7%AB%A0--ccp_pca__pwm(%E5%8F%AF%E7%94%A8%E4%BD%9Cdac)-9.jpg (47.02 KB, 下載次數: 167)
下載附件
2016-3-28 03:01 上傳
2 16位定時器模式 16位定時器模式的結構如圖8-3所示,定時精度與16位自動重裝的通用定時器相 同,但為了得到需要的輸出頻率,通常要在中斷函數中修改CCAPnH、CCAPnL遞 增步長值,并且必須讓CPU反復中斷,使用不如通用定時器方便。
通過置位寄存器CCAPMn的ECOMn和MATn位,可使PCA模塊用作定時器,為了得到需要的輸 出頻率,通常要在中斷函數中修改CCAPnH、CCAPnL遞增步長值,因此需要置位ECCFn打開 中斷。PCA計數器[CH,CL]每隔一定時間自動加1,時間間隔取決于選擇的時鐘源。例如, 當選擇的時鐘源為SYSclk/12時,每12個時鐘周期[CH,CL]加1,當[CH,CL]增加到等于捕 捉/比較寄存器[CCAPnH,CCAPnL] 的值時,CCFn=1,產生中斷請求,如果每次PCA模塊中 斷后,在中斷服務程序中給[CCAPnH,CCAPnL]增加一個相同的數值,那么下一次中斷來臨 的間隔時間T也是相同的,從而實現了定時功能,PCA計數器計數值與定時時間的計算公 式如下: PCA計數器計數值(CCAPnH、CCAPnL設置值或遞增步長值)= 定時時間/計數脈沖周期 = 定時時間*計數脈沖頻率 假設,系統時鐘頻率SYSclk = 22.1184MHz,選擇的時鐘源為SYSclk/12,定時時間T為 5ms,則PCA計數器計數值為:T*(SYSclk/12)= 0.005*22118400/12=9216 = 2400H,也 就是說,PCA 計數器計數2400H次,定時時間就是5ms,這也就是每次給[CCAPnH,CCAPnL] 增加的數值(步長)。
%E7%AC%AC8%E7%AB%A0--ccp_pca__pwm(%E5%8F%AF%E7%94%A8%E4%BD%9Cdac)-12.jpg (46.24 KB, 下載次數: 169)
下載附件
2016-3-28 03:01 上傳
3 高速輸出模式 高速輸出模式的結構如圖8-5所示,原理與16位定時器模式幾乎完全相同。 當PCA計數器CH、CL的值與模塊捕捉/比較寄存器CCAPnH、CCAPnL的值相等時,PCA模塊的輸 出引腳CCPn將發生翻轉,要激活高速輸出模式,CCAPMn寄存器的ECOMn、MATn、TOGn位必須 都置位,為了得到需要的輸出頻率,需要在中斷函數中修改CCAPnH、CCAPnL遞增步長值, 因此需要置位ECCFn打開中斷。 PCA計數器計數值(CCAPnH、CCAPnL設置值或遞增步長值)= 定時時間/計數脈沖周期 = 定時時間×計數脈沖頻率 = ((1/Fout)/2)×計數脈沖頻率 = 計數脈沖頻率/(2×Fout) 其中Fout表示PCA模塊n輸出時鐘頻率。比如系統時鐘頻率SYSclk = 22.1184MHz,選擇的時 鐘源是SYSclk/2時,要求在CCPn引腳輸出100KHz的方波,CCAPnH_CCAPnL遞增步長值 = (22118400/2)/(2×100000)=55.296,四舍五入取整得55,即十六進制37H。
%E7%AC%AC8%E7%AB%A0--ccp_pca__pwm(%E5%8F%AF%E7%94%A8%E4%BD%9Cdac)-14.jpg (61.65 KB, 下載次數: 166)
下載附件
2016-3-28 03:01 上傳
4 脈寬調節模式
PWM意為脈沖寬度調制,可用于調整輸出直流平均電壓,對于矩形波而言,輸出平均壓等 于峰值電壓×占空比,占空比是一個脈沖周期內高電平時間與周期的比值,例如,峰值電 壓等于5V,占空比等于50%的方波信號平均電壓等于2.5V,也就是萬用表直流檔測量得到 的電壓值,8位PWM模式結構如圖所示, PWM輸出不需要使用中斷。 定時器CL確定輸出頻率
要使能PWM模式,模塊CCAPMn寄存器的ECOMn和PWMn位必須置位。 {0,CL[7:0]}與[EPCnL,CCAPnL[7:0]]進行比較,當{0,CL[7:0]}中的值小于 {EPCnL,CCAPnL[7:0]}時,輸出為低,當{0,CL[7:0]}中的值等于或大于 {EPCnL,CCAPnL[7:0]}時,輸出為高,當EPCnL=0且CCAPnL=00H時,PWM固定輸出高,當 EPCnL=1且CCAPnL=FFH 時,PWM固定輸出低。 PCA時鐘輸入源可以從以下8種中選擇一種:SYSclk/12、SYSclk /8、SYSclk /6、 SYSclk /4、SYSclk /2、SYSclk、定時器0的溢出、ECI/P1.2輸入。 PWM輸出占空比由{EPCnL,CCAPnL[7:0]}確定。 8位PWM的周期 = 計數脈沖周期×256 8位PWM的頻率 = 計數脈沖頻率/256 8位PWM的脈寬時間(高電平時間)= 計數脈沖周期×(256-CCAPnL) 8位PWM的占空比 = 脈寬時間/PWM周期 = (1- CCAPnL/256) ×100% 如果要實現給定頻率的PWM輸出,可選擇定時器0的溢出作為PCA的時鐘輸入源。當某個 I/O 口作為PWM使用時,該口自動切換到強推挽輸出模式。
例8.5 利用PCA 模塊實現占空比固定的PWM輸出。 說明:利用PCA模塊0實現在P1.1輸出占空比固定的PWM信號,假設R/C時鐘頻率Fosc = 22.1184MHz。 #include "STC15W4K.H" // 包含STC15W4K寄存器定義文件 void initPWM() { CMOD=0x80; // #10000000B 空閑模式下停止PCA計數器工作 // 選擇PCA時鐘源為Fosc/12,禁止PCA計數器溢出時中斷 CCAPM0=0x42; // 設置PCA模塊為PWM輸出方式。 CR=1; // PCA計數器開始運行 } void main() { initPWM(); CCAP0H=0x20; // 脈寬控制 while(1); // 讓程序停在這里。 } 實驗結果:用萬用表測量P1.1輸出頻率為7.210KHz,占空比為87.5%。理論計算P1.1頻率=計數脈沖 頻率/256 = 22118400/12/256=7.2 KHz,占空比=(1- CCAPnL/256) ×100%=(1-32/256) ×100%=87.5%。可見理論計算與實際結果是一致的。
|