您的位置 首页 资料

ATmega128(PWM—time 0)

atmega128的定时器实现快速PWM输出示例程序,定时器0溢出中断的方式输出PWM波形驱动发光二极管,亮度由暗到灭,呈闪烁状态样值采取正

//atmega128的定时器完结快速PWM输出示例程序,定时器0溢出中止的方法

//输出PWM波形驱动发光二极管,亮度由暗到灭,呈闪耀状况
//样值采纳正弦波公式,示例如下
//正弦波采样值计算公式
// f(x)=128+127*sin(2*3.1415*x/127) x=[0….127]
//PWM输出也可经过操控LED发光来直观的看到作用,亮度继续的改变
//能够经过选跳线帽挑选是经过LED直接检查仍是经过滤波器检查实践波形
//编译环境 AVR Studio 4.17/AVR GCC
//体系时钟7.3728MHZ,设置熔丝位为外部高频石英晶体振荡,发动时刻4.1ms
//***********************************************************************
//包括文件
//***********************************************************************

#include
#include
#define F_CPU7372800// 单片机主频为7.3728MHz,用于延时子程序
#include
#include
#include
#include //中止信号头文件

//***********************************************************************
//界说变量区
//***********************************************************************
#define f_count 254 //0CR0寄存器初始值
#define timer_clk 0x07
#define delay_us(x) _delay_us(x) //AVR GCC延时函数 x(us)
#define delay_ms(x) _delay_ms(x) //AVR GCC延时函数 x(ms)

#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

uchar auc_SinParam[128] = {
128,134,140,147,153,159,165,171,177,182,188,193,198,204,208,213,
218,222,226,230,233,237,240,242,245,247,249,251,252,253,254,254,
254,254,253,252,251,250,248,246,244,241,238,235,232,228,224,220,
215,211,206,201,196,191,185,179,174,168,162,156,150,144,137,131,
125,119,112,106,100,94,88,82,77,71,65,60,55,50,45,41,
36,32,28,24,21,18,15,12,10,8,6,5,4,3,2,2,
2,2,3,4,5,7,9,11,14,16,19,23,26,30,34,38,
43,48,52,57,63,68,74,79,85,91,97,103,109,116,122,128}; // 128点正弦波样本值

uchar x_SW = 8,X_LUT = 0;

//*************************************************************************
//初始化子程序
//*************************************************************************
void system_init() //IO口初始化
{

PORTB=0xff; //PB设置为输出
DDRB=0xff; //上拉电阻无效
}

void timer0_init() //定时器初始化
{
TCCR0=0x68|timer_clk; //快读PWM形式,OC0输出,分频
OCR0=128; //OCR0比较匹配寄存器值
TIFR=0x01; //清中止标志位
TIMSK=0x01; //使能定时器0溢出中止
}

//*************************************************************************
//定时器0中止服务子程序
//*************************************************************************

ISR(TIMER0_OVF_vect) //中止服务程序
{
X_LUT += x_SW; // 新样点指针
if (X_LUT > 127) X_LUT -= 128; // 样点指针调整
OCR0 =auc_SinParam[X_LUT]; // 取样点指针到比较匹配寄存器
}

//*************************************************************************
//主程序
//*************************************************************************

int main(void)
{
system_init(); //体系初始化.PB3输出PWM波形
timer0_init(); //定时器0初始化,完结PWM相关装备
SREG|=0x80; //敞开大局中止
while(1)
{
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/276152.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部