目錄
STC15F2K60S2(IAP15也可以)中PWM產生的原理圖(PWM產生功能是集成在PCA功能模塊中的):
產生PWM是使用計數-->比較-->輸出的模式
定時器配置及PCA相關寄存器配置源代碼:
void Timer0_init(void)//1us作爲PCA計數器的計數單位
{
AUXR |= 0x80; //定時器時鐘1T模式
TMOD &= 0xF0; //設置定時器模式
TMOD |= 0x02; //設置定時器模式
TL0 = 0xF5; //設置定時初值
TH0 = 0xF5; //設置定時重載值
TF0 = 0; //清除TF0標誌
TR0 = 1; //定時器0開始計時
}
void PWM_EN()
{
CCAP0L = 0x80;//PCA0比較寄存器,使佔空比達到1:1
CCAP1L = 0x80;//PCA1比較寄存器
CCAP0H = 0x80;//設定PCA0比較寄存器重載值後八位
CCAP1H = 0x80;//設定PCA1比較寄存器重載值後八位
CL = 0;//PCA計數器清零
CH = 0;//PCA計數器清零
CMOD = 0x84; // 空閒模式下PCA計數器停止工作;定時器0溢出做PCA模塊的時鐘源
CCON= 0x00;
CCAPM0 = 0x42;//使能PWM0和比較器
CCAPM1 = 0x42;//使能PWM1和比較器
PCA_PWM0 = 0x00;//PCA0八位PWM模式,EPC0L(和比較寄存器組成9位數字)置零
PCA_PWM1 = 0x00;//PCA1八位PWM模式
CCON= 0x40;//使能PAC計數器
}
上面代碼實現的是CCP0和CCP1管腳輸出佔空比位爲1:1的PWM波:
代碼解析:
這裏的時鐘源採用的是定時器0產生的脈衝,並且不啓用PCA計數器的中斷
可通過字節操作使能計數器
在這裏使能比較器和脈衝寬度調製功能
計數器和比較器的寄存器
效果圖:
頻率爲3.9332KHZ,這個頻率和輸入的時鐘源的頻率有關。
也就是計數器溢出一次產生一個週期的PWM波