標題: 第8章 單片機CCP/PCA/PWM模塊(可用作DAC) [打印本頁]
作者: wul 時間: 2016-3-28 03:00
標題: 第8章 單片機CCP/PCA/PWM模塊(可用作DAC)
51單片機輕松入門—基于STC15W4K系列(C語言版)
李友全 編著:http://m.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%。可見理論計算與實際結果是一致的。
作者: chen1535556747 時間: 2019-4-15 13:13
急需的好資料
作者: quanquan12 時間: 2019-6-22 16:46
好資料
作者: xzc943793422 時間: 2019-7-24 19:44
好資料
作者: 楓樹566 時間: 2019-9-8 17:29
好資料
作者: ddjjcc 時間: 2019-12-9 08:02
真是好資料呀!
作者: baibaoyu 時間: 2020-2-19 16:32
高手啊,學習了了啊
作者: blue_sea 時間: 2020-4-14 19:16
謝謝 來試試
作者: hzm19640731 時間: 2023-4-15 18:05
我正想要好資料!!!
作者: Learn0 時間: 2024-3-27 16:50
太救急了!!!過幾天筆試這里看書真沒看明白
歡迎光臨 (http://m.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
黑人精品|
日韩免费在线观看视频
|
欧美精品久久久久
|
www.av在线
|
日韩精品免费
|
久久精品超碰
|
二区三区av|
www.99热.com
|
91久久久久久久久久久
|
久草在线在线精品观看
|
91av免费版
|
国产一区二区三区在线免费
|
盗摄精品av一区二区三区
|
久久久久久91|
在线观看国产h
|
日韩国产中文字幕
|
伊人久久综合
|
久久www免费人成看片高清
|
国产91视频免费
|
国产精品久久二区
|
亚洲欧美日韩国产综合
|
羞羞视频免费观
|
99精品国产一区二区青青牛奶
|
国产午夜精品一区二区三区四区
|
欧美精品91|
人人看人人搞
|
国产乱码精品一区二区三区忘忧草
|
国产成年人小视频
|
一级毛片在线看
|
日韩av手机在线观看
|
91精品久久久久久久久
|
国产精品99久久久久久动医院
|
国产99免费视频
|
日韩欧美在线免费观看
|
国产视频精品在线
|
日韩在线欧美
|
久久亚洲一区二区三区四区
|
国产女人与拘做视频免费
|
国产精品亚洲视频
|
日韩在线视频一区
|
一级日韩|