一、 实验目的:
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 模式时序图、
计时器数值达到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 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;
}
}