大家好,我是遠方,這一章我們來學習下STC8G1K12的PWM應用。
STC8G 系列單片機內部集成了 3 組可編程計數器陣列(PCA/CCP/PWM)模塊,可用於軟件定時器、外部脈衝捕獲、高速脈衝輸出和 PWM 脈寬調製輸出。 我們今天主要學習下PWM的輸出。
我們開始配置寄存器:
PCA 控制寄存器 CCON ,我們需要啟動 PCA 計數 ,所以CR位需要寫1。
PCA 模式寄存器 CMOD,空閒模式下 PCA 繼續計數 ,該位寫0,
CPS[2:0]:PCA 計數脈衝源選擇位 選擇系統時鐘。設置為100。
PCA 計數器寄存器 CL CH,每來一個時鐘 16 位計數器自動加 1。
PCA 模塊模式控制寄存器 ,我們這次使用的是CCAPM0的PWM0。大家這裡要注意,使用PWM輸出必須 同時使能 ECOM0 和 PWM0。所以這二位都要寫1。
PCA 模塊模式捕獲值/比較值寄存器 ,在作為PWM輸出時,大家只需知道這裡的寄存器是用來調佔空比的。
PCA 模塊 PWM 模式控制寄存器 PCA_PWM0 ,這裡主要設置PWM的位數。如果需要分辨率高一點,就把位數設置大點。
今天我們以PWM0,時鐘源選擇系統時鐘11.0592MHz,6 位PWM模式 最大值40H,輸出50%的佔空比 來測試一下。
大家可能會問,那頻率是多少?大家記住下面這個公式。
頻率=PWM時鐘除以(2的(PWM位數)次方)
也就是6位PWM,就是除以2的6次方。
我們開始寫代碼。
全部工程代碼如下:
#include "STC8.H"
sbit LED = P1^1;
void main(void)
{
//使用內部時鐘 燒錄軟件會幫我們配置好 如不懂 參考前面第3章系統設置學習。
// 燒錄軟件設置11.0592MHz為系統時鐘。以後我們的學習都是這個時鐘頻率。
P_SW2 |= (1<<7);
CKSEL = 0x00; //選擇內部 IRC ( 默認 )
P_SW2 &= ~(1<<7);
//配置端口 對於控制我們系統板的LED,配置準雙向口和推輓輸出都可以。
//只要是做為輸出,我建議全部設置為推輓輸出。
/*
PnM1.x PnM0.x Pn.x 口工作模式
0 0 準雙向口
0 1 推輓輸出
1 0 高阻輸入
1 1 開漏輸出
*/
P1M1 &= ~(1<<1); P1M0 |= (1<<1); //設置為推輓輸出
P_SW2 |= (1<<7);
P1PU = 0x00;//禁止P1端口內部的 3.7K 上拉電阻
P1NCS = 0xFF; //禁止P1端口的施密特觸發功能。
P_SW2 &= ~(1<<7);
P_SW1 &= ~(1 << 5);P_SW1 &= ~(1 << 4);//默認引腳功能 P1.1 P1.0 P3.7
CCON = 0x00; //停止PCA計數
CMOD = 0x08; //PCA時鐘為系統時鐘 11.0592MHz 頻率=PWM時鐘/2的(PWM位數)次方
CL = 0x00;
CH = 0x00;//PCA 計數器清零
CCAPM0 = 0x42; //PCA 模塊 0 為 PWM 工作模式
PCA_PWM0 = 0x80; //PCA 模塊 0 輸出 6 位 PWM
CCAP0L = 0x20; //PWM 佔空比為 50%[(40H-20H)/40H]
CCAP0H = 0x20;
CCON |= (1 << 6); //啟動PCA計時器
while (1);
}
我們把程序編譯好,燒錄到板子裡面。連接示波器查看。
我們的PWM頻率是 11.0592MHZ除以64等於172.8K。硬件接口是P1.1.
。佔空比位50%。
通過示波器查看波形,證明我們的軟件測試沒問題。
好了這章就講到這裡。希望大家多多關注我的原創文章。謝謝。
閱讀更多 深漂遠方 的文章