一、 實驗目的:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
1、熟悉PWM的原理與特性;
2、掌握PWM的使用。
二、實驗儀器: MEGA16實驗板 一塊 PC機 一臺
三 實驗目的:輸出頻率固定,佔空比可調的方波,分別由按鍵控制佔空比的增加,每次增減量爲0.1。
四 、實驗原理:
利用MEGA16芯片內部8位定時器的快速工作模式產生可調的PWM,快速PWM 模式(WGM01:0 = 3) 可用來產生高頻的PWM 波形。快速PWM 模式與其他PWM模式的不同之處是其單斜坡工作方式。計數器從BOTTOM計到MAX,然後立即回到BOTTOM重新開始。對於普通的比較輸出模式,輸出比較引腳OC0在TCNT0與OCR0匹配時清零,在BOTTOM 時置位;對於反向比較輸出模式, OC0 的動作正好相反。由於使用了單斜坡模式,快速PWM 模式的工作頻率比使用雙斜坡的相位修正PWM 模式高一倍。此高頻操作特性使得快速PWM 模式十分適合於功率調節,整流和DAC 應用。高頻可以減小外部元器件( 電感,電容) 的物理尺寸,從而降低系統成本。工作於快速PWM 模式時,計數器的數值一直增加到MAX,然後在後面的一個時鐘週期清零。具體的時序圖爲Figure 32。圖中柱狀的TCNT0 表示這是單邊斜坡操作。方框圖同時包含了普通的PWM 輸出以及反向PWM 輸出。TCNT0 斜坡上的短水平線表示OCR0
和TCNT0 的比較匹配。
Figure 32. 快速PWM 模式時序圖、
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
計時器數值達到MAX 時T/C 溢出標誌TOV0 置位。如果中斷使能,在中斷服務程序可以更新比較值。工作於快速PWM 模式時,比較單元可以在OC0 引腳上輸出PWM 波形。設置COM01:0爲2 可以產生普通的PWM 信號;爲3 則可以產生反向PWM 波形。要想在引腳上得到輸出信號還必須將OC0 的數據方向設置爲輸出。產生PWM 波形的機理是OC0 寄存器在OCR0 與TCNT0 匹配時置位( 或清零),以及在計數器清零( 從MAX變爲BOTTOM) 的那一個定時器時鐘週期清零( 或置位)。輸出的PWM 頻率可以通過如下公式計算得到:
五 實驗程序
#include <iom16v.h>
#include <macros.h>
#define BOTTOM 0
unsigned char flag=0;
unsigned char X;
unsigned char i=0;
unsigned char Z=0;
//*******************延時 us
void delay_us(int t)
{
do
t--;
while(t>1);
}
//*******************延時 ms
void delay_ms(unsigned int t)
{
while(t!=0)
{
delay_us(1142);
t--;}
}
void time_init(void)
{
OCR0=128;
TCNT0=BOTTOM;
TCCR0|=(1<<CS01); //8MHZ .256分頻,輸出122hz
TCCR0|=(1<<WGM01)|(1<<WGM00); //快速PWM
TCCR0|=(1<<COM01); //比較匹配時OC<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />0A清零,TOP時置位
TIMSK|=(1<<TOIE0); //溢出中斷使能
}
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
TCNT0=BOTTOM;
}
void per(void)
{
if(PIND==0XFB) //加鍵
{
if(Z<10)
Z=Z+1;
}
if(PIND==0XF7) //減鍵
{
if(Z>0)
Z=Z-1;
}
}
void main(void)
{
DDRB=0XFF;
PORTB=0XFF;
DDRD=0X00;
PORTD=0XFF; //D2 鍵爲脈寬加鍵.D3 鍵爲脈寬減鍵,增量爲0.1
time_init();
SEI();
for(;;)
{
if(PIND!=0XFF)
delay_us(30);
if(PIND!=0XFF)
per();
X=(unsigned char)((Z*256)/10);
OCR0=X;
}
}