我正试图在AVR ATMega16 上使用延迟来实现简单的PWM生成
我想做的只是简单地将led从100%的占空比渐变到0%,然后我会将其扩展到控制双色led的两种颜色,以获得良好的效果。
我以前在mikroC和PICs中做过这件事,但不知何故,在avr gcc中没有那么容易,或者可能我错过了一些东西。
我的问题是,我希望led在3秒内完全褪色,但我觉得它褪色得更快。我还认为,它在高工作周期上花费的时间比在低工作周期上花的时间更多。我的意思是,我看到led亮了一段时间,然后它就消失了,但当它变暗时,它会很快地移动到不同的占空比,我想。。
你对我缺少什么有什么想法吗?
此处提供代码:http://ideone.com/lUP5f
感谢
保险丝设置可能有问题。时钟通常由保险丝控制,而不是由定义控制。但是,延迟函数使用#define F_CPU。你能公布你的保险丝设置吗?
您想要使用延迟而不是计时器来生成PWM,这有什么具体的原因吗?如果你想看看定时器,我可以向你推荐这些教程:1)定时器教程2)PWM
编辑:btw
uint8_t b = 1000;
uint8_t允许0到255之间的值,编译器通常会为此生成警告:
/test.c:16:警告:大整数隐式截断为无符号类型
问题是,LED不是线性的。因此,打开它们是不起作用的,例如用50%来将亮度降低到50%。。
您可以使用预定义的表(例如:http://www.mikrocontroller.net/articles/LED-Fading#Das_Demoprogramm)
你不需要会读德语。只要研究一下这段代码。。有一些表格,例如16位PWM(pwmtable_16[])。
所以你可以写:
delay_us(pwmtable_16[a]);
而不是
delay_us(a);