- 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)