// -----------------------------------------------------------------------------
// Project Name : M8 PWM 参考程序
// Crystal : 16Mhz
// Target Setting : ATMaga8
// Power : 5V
// Date : Dec.21.2006
// File Version : 1.0
// Author :
// -----------------------------------------------------------------------------
#include <iom8v.h>
#include <macros.h>
// ------------------ 频率定义 --------------------------
#define HZ_5K 0x0640
#define HZ_10K 0x0320
// -----------------------------------------------------------------------------
// 函数说明 :配置PWM的输出 管脚 OC1A (PB1)
//
// -----------------------------------------------------------------------------
void port_init(void)
{
PORTB |= 0x02;
DDRB |= 0x02;
}
// -----------------------------------------------------------------------------
// 函数说明 :配置T1的PWM
// 产生频率 :5KHz 误差 5.00048KHz (0.0%)
// -----------------------------------------------------------------------------
void timer1_init(void)
{
//TCCR1A|=(1<<COM1A1)|(1<<COM1A0); //当计时器往TOP计数时若TCNT1与OCR1A匹配OC1A
//将清零为低电平
//在计时器往BOTTOM计数时TCNT1与OCR1A匹配OC1A
//将置位为高电平
TCCR1A|=(1<<COM1A1)|(0<<COM1A0); //当计时器往TOP计数时若TCNT1与OCR1A匹配OC1A
//将清零为高电平
//在计时器往BOTTOM计数时TCNT1与OCR1A匹配OC1A
//将置位为低电平
TCCR1B|=(1<<WGM13); //设置T1为相位与频率修正PWM模式 TOP值为ICR1
}
// -----------------------------------------------------------------------------
// 函数说明 : 开启 PWM
//
// -----------------------------------------------------------------------------
void StartPwm(void)
{
TCCR1B|=(1<<CS10); //启动T1 不分频 即启动PWM输出
}
// -----------------------------------------------------------------------------
// 函数说明 : 关闭 PWM
//
// -----------------------------------------------------------------------------
void ClosePwm(void )
{
TCCR1B&=~(1<<CS10); // 停止T1分频 ,停止PWM 输出
}
// -----------------------------------------------------------------------------
// 函数说明 :设置PWM的占空比
// 设置说明 :占空比 = OCR1A / ICR1 ;
// -----------------------------------------------------------------------------
void SetRate(unsigned int i_rate)
{
OCR1A= i_rate; // OCR1A控制占空比
}
// -----------------------------------------------------------------------------
// 函数说明 :设置PWM 的频率
//
// -----------------------------------------------------------------------------
void SetFrequency(unsigned int i_fre)
{
ICR1 = i_fre ; //ICR1控制分辨率 2-16
}
// -----------------------------------------------------------------------------
// 函数说明 :初始化系统
//
// -----------------------------------------------------------------------------
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
}
// -----------------------------------------------------------------------------
// 函数说明 :测试 T1的PWM
//
// -----------------------------------------------------------------------------
void main(void)
{
init_devices();
SetFrequency(HZ_5K);
SetRate(HZ_5K/4); // 实际占空比 :0.24
StartPwm();
while(1)
{
;
}
}