/*AVR快速PWM定时器0发生模式*/
/*PWM波的产生机理是定时器0的TCNT0不断地计数,当TCNT0=OCR0时在OC0引脚上出现低电平,当定时器0=TOP最大值时,*/
/*OC0引脚将会被拉高,同时产生溢出中断,可以再终端服务中修改OCR0的值,以改变占空比,比用引脚模拟要准确*/
/*另外值得说的是快速PWM很适合用在高速的场合,比如开关电源,和DA转换,整流等*/
/* 快速PWM实验 20110416 天津第四项目部宿舍 王均伟 */
#include <iom16v.h>
#define uchar unsigned char
#define uint unsigned int
#define set_bit(a,b) a|=(1<<b)
#define clr_bit(a,b) a&=~(1<<b)
#define get_bit(a,b) a&(1<<b)
uchar i;
#pragma interrupt_handler time0fistpwm_isr:10
void time0fistpwm_isr()//定时计数器0溢出中断
{
if(OCR0==255)
{OCR0=0;}//加这个语句是为了在OC0引脚上表现出电压越来越高,灯越来越亮的效果,
OCR0++; //OCR0越小则OC0引脚电压越低越,换句话说低电平时间越长。
}
void int_time0fistpwm()//定时器0用在快速PWM设置初始化
{
SREG=0x80;//开启全局中断
TCNT0=0;//
OCR0=0;;//
TCCR0=0x6D; //工作在快速PWM模式,当OCR0=TCNT0时,OC0脚拉低,此时计时器继续计数,当溢出时OC0拉高,并产生中断,可以在中断里设置下一次的低电平时间,OCR0越小低电平时间越长 OC0引脚(就是4脚),时钟1024分频,开启定时器
TIMSK=0x01;//开启定时器溢出中断
}
void main()
{
DDRC=0xff;
PORTC=0x00;
DDRB|=(1<<3);
PORTB|=(1<<3);
int_time0fistpwm();
while(1);
}
|