AVR上使用延迟的软件PWM



我正试图在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);

相关内容

  • 没有找到相关文章

最新更新