PWM使用

 

一、    實驗目的:<?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重新開始。對於普通的比較輸出模式,輸出比較引腳OC0TCNT0OCR0匹配時清零,在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:02 可以產生普通的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;

}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章