PWM使用

 

一、    实验目的:

               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 模式时序图、

计时器数值达到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 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;

}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值