利用AT89C52定时器输出可调PWM
利用AT89C52定時器輸出可調PWM
知識儲備:
PWM即是脈寬沖寬度調制,也稱脈寬調制,其意義就是通過微處理器的數字輸出來對模擬電路進行調制的一種有效技術。
由于單片機只能輸出高電平(1),或者低電平(0),因此對于類似正弦曲波等無法直接輸出。因此需要通過控制高低電平的有效時間,用等效面積的方式輸出曲波。
PWM:
- 通過改變脈沖列的周期可以調頻;
- 改變脈沖的寬度或占空比可以調壓
1.定時器:
51單片機中內置定時器有定時器0和定時器1,通過采用定時器中斷的方式輸出PWM波形,可不必占用CPU的內存。
定時器配置:
//若使用函數方式初始化,記得在主函數中調用一遍
void Time0_Init(void) { TMOD=0x01; //采用方式1進行定時 TH0=(65536-1000)/256; //定時器計數值高位寫入 TL0=(65536-1000)%256; //低位寫入 ET0=1; //使能定時器0中斷允許位 TR0=1; //使能定時器0 EA=1; //使能中斷允許位 }
如若是定時器1配置:
只需將其中的:
TH0換為TH1
TL0換為TL1
ET0換為ET1
TR0換為TR1
方式零計數:13位計數器 2^13=8192
方式一計數:16位計數器2^16=65536
寫入計數值:
51單片機的晶振是12Mhz,因此機械周期是1us,即是說定時每1us計數一次,因此當我們要寫入計數值是可以這樣:
定時器(例選用方式一計數)計數到上限值時溢出(65536),因此假設我們要每1ms進入中斷一次,則可以:
1ms/1us=1000(次)------計數器要計數1000次
寫入定時器的值就為(65536-1000),定時器將會從會從(65536-1000)這個數每1us自加1,累積1000次后剛好溢出65536,從而進入中斷。
2.輸出PWM波形
要想輸入PWM波形要確定兩個值:周期和閾值
在固定周期內,低于閾值時間輸出高(低電平),高于閾值時間輸出低(高)電平,從而形成一定的矩形脈沖
通過調節閾值的大小即可確定高(低)電平的占空比
配置:
unsigned char variable; //時間t變量
unsigned char threshold; //設置的閾值
sbit output=P2^1; //輸出PWM波形的管教
if(variable<threshold) { output=0; } else if(variable>=threshold1) { output=1; } //將上述步驟通過函數實現
while(variable==100) { variable=0; }
3.定時器中斷服務函數的編寫
通過2中所述如何實現輸出PWM的方式,將其封裝進定時器函數
編寫定時器中斷服務函數前需要知道中斷號:
中斷號: 定時器0:1
? 定時器1:3
void Time0(void) interrupt 1 //不用調用 { TH0=(65536-1000)/256; //每次進入定時期中斷都會更新定時值 TL0=(65536-1000)%256; if(variable<threshold) { output=0; } else if(variable>=threshold1) { output=1; }
while(variable==100) { variable=0; } }
輸出PWM的大體函數編寫完畢,具體使用功能請各位自行編寫~~
總結
以上是生活随笔為你收集整理的利用AT89C52定时器输出可调PWM的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拉梅系数以及雅克比行列式
- 下一篇: 中国教育在于农村