基于mega8的pwm控制输出(icc下).docVIP

  • 10
  • 0
  • 约3.05千字
  • 约 6页
  • 2017-08-11 发布于重庆
  • 举报
基于mega8的pwm控制输出(icc下)

一、设计内容 该设计是利用AVR mega8L内部的定时/计数器可输出PWM波以及LED灯器件,设计一个按键可调LED灯亮度的电路。设计的电路,通过两个按键,可以调节单片机输出PWM波的占空比,从而调节LED灯的亮度。 二、基本原理 PWM波是由mega8L的内部定时/计数器输出的。Mega8的快速PWM模式可用来产生高频的PWM波,在TCNT1里设置TOP值,再设置TCR1A的值用之与TCNT1的值匹配产生PWM。然后利用这个原理,改变TCR1A寄存器的值来调控PWM波的占空比,从而令一个周期内的高低电平产生变化,输出到LED灯上,LED灯的亮暗就会随着高低电平而变化。 三、系统硬件设计 1)电源系统: 此电源系统的功能是将AC220V经过整流,降压输出5V的DC供mega8的运行。在稳压部分用四个电容滤波,两个470u电解电容用于滤去高频波,两个0.1u贴片电容用于滤去低频波。 2)Avr mega8单片机系统: 此系统用于发生PWM波,按键1和2用于调节PWM的占空比。LED1用于检测调节PWM波是否成功。LED前选择330欧电阻用于限流,防止电流过大而容易引至LED灯烧坏。LED2位置的是总电压4.9V,4.9/330=0.015A=15mA,符合LED工作电流小于20mA的要求。 四、系统软件程序的设计 1)流程图: 2)C语言程序: #include iom8v.h #include macros.h void port_init(void) { PORTB = 0x02; //端口输出高电平 DDRB = 0x02; //初始化PB1为输出口 PORTC = 0x30; //内建上拉电阻打开 DDRC = 0x00; //初始化PC4、PC5为输入口 PORTD = 0x00; DDRD = 0x00; } void timer1_init(void) { TCCR1B = 0x00; //stop TCNT1 = 0x00ff; //setup //设置TOP值为0x00ff TCCR1A = 0 //COM1A1、COM1B1、WGM10置位 TCCR1B = 0 //WGM12、CS1置位 //设置T1计数寄存器为8位快速PWM模式;无预分频 } //call this routine to initialize all peripherals void init_devices(void) { //stop errant interrupts until set up CLI(); //disable all interrupts port_init(); timer1_init(); MCUCR = 0x00; GICR = 0x00; TIMSK = 0x00; //timer interrupt sources SEI(); //re-enable interrupts //all peripherals are now initialized } void dalaynms(unsigned int j) //延时程序 { unsigned char i; while(j0) //当输入j=500,延时约500ms { for(i=0;i187;i++) { asm(nop); //插入汇编空操作指令,目的是耗掉cpu的一个周期 } j--; } } void main() { unsigned char l=64; init_devices(); OCR1A = 64; while(1) //检测按键按下否 { if((PINC(1PC5))==0) //当键2按下,PWM波占空比减少 { dalaynms(500); //延时程序,防抖动 l-=6.4; OCR1A=l; if(l=6.4) { l=6.4; //当占空比等于十进制6.4之后,不再减少 OCR1A=l; } } if((PINC(1PC4))==0) //当键1按下,PWM波占空比增大 { dalaynms(500);

文档评论(0)

1亿VIP精品文档

相关文档