比较基础简单的试验,适合新手入门老鸟就不用看了,呵呵!
ATMega48的定时器1工作在8位快速PWM模式,产生3906.25Hz的PWM波通过三极管来调整风扇的转速,风扇是CPU散热器上的直流12V风扇。程序是循环重低到高再到低来调整风扇转速。
代码如下:
/*************************************************************************
* Copyright (c) 2007 wormchen
* All rights reserved
* 文 件 名: main.c
* 说 明: PWM 调整风扇转速
*
* 主要硬件: AtemlMega48(内部1M)
* 编译环境: WinAVR 20070525
* 当前版本: 1.0
* 作 者: wormchen
* 完成日期: 2008年4月22日11:33:19
* 取代版本: 1.0
* 原作 者: wormchen
* 完成日期: 2008年4月22日11:33:23
************************************************************************/
#include
#include
#include
unsigned int uchPWM = 0;
/************************************************************************
* 名称: void DelayMS(unsigned int uiMS)
* 功能: 延时nms
* 参数: 无
* 返回: 无
************************************************************************/
void DelayMS(unsigned int uiMS)
{
while(uiMS--)
{
_delay_loop_2(250); // 延时1ms(粗略)
}
}
/*************************************************************************
* 名称: void PORT_Init(void)
* 功能: 端口初始化
* 参数: 无
* 返回: 无
*************************************************************************/
void PORT_Init(void)
{
PORTB &= ~((1 << PB1) | (1 << PB2));
DDRB = (1 << PB1) | (1 << PB2);
}
/*************************************************************************
* 名称: void Timer1_Init(void)
* 功能: TIMER1初始化
* 参数: 无
* 返回: 无
*************************************************************************/
void Timer1_Init(void)
{
//快速PWM模式频率3906.25Hz
TCNT1 = 0x0000;
OCR1A = 0x0000;
TCCR1A = (1 << COM1A1) | (1 << COM1B1) | (1 << WGM10);
//比较匹配清零TOP置位
TCCR1B = (1 << WGM12) | (1 << CS10);
//定时器1工作于8位快速PWM模式无分频
}
int main(void)
{
PORT_Init();
Timer1_Init();
while(1)
{
for(uchPWM = 0 ; uchPWM < 255; uchPWM++)
{
OCR1A = uchPWM;
if(uchPWM == 0)
{
DelayMS(2000);
}
else
{
DelayMS(100);
}
}
for(uchPWM = 255 ; uchPWM > 0; uchPWM--)
{
OCR1A = uchPWM;
if(uchPWM == 255)
{
DelayMS(2000);
}
else
{
DelayMS(100);
}
}
}
}
文章评论(0条评论)
登录后参与讨论