0

我正在尝试使用 AVR ATMega16 上的延迟来完成简单的 PWM 生成

我想要做的只是简单地将 LED 从 100% 淡化到 0% 占空比,稍后我将扩展它以控制双色 LED 的两种颜色以产生很好的效果。

我之前在 mikroC 中使用 PIC 完成了此操作,但不知何故,在 avr-gcc 中它并不容易,或者我可能遗漏了一些东西。

我的问题是我希望 LED 在 3 秒内完全褪色,但我觉得它褪色更快。我还认为它在高占空比上花费的时间比在低占空比上花费的时间更多。我的意思是我看到 LED 亮了一会儿,然后它就消失了,但是当它变暗时,它会非常快地移动到不同的占空比,或者我认为..

您对我所缺少的有什么想法吗?

代码可在此处获得:http: //ideone.com/lUP5f

谢谢

4

2 回答 2

1

可能是保险丝设置有问题。时钟通常由熔断器控制,而不是由定义控制。但是延迟函数使用#define F_CPU。你能发布你的保险丝设置吗?

是否有特定原因要使用延迟而不是定时器来生成 PWM?如果你想看看定时器,我可以向你推荐这些教程:1)定时器教程2)PWM

编辑:顺便说一句

 uint8_t b = 1000;

uint8_t 允许从 0 到 255 的值,编译器通常会为此生成警告:

../test.c:16:警告:大整数隐式截断为无符号类型

于 2012-02-01T06:41:16.423 回答
1

问题是,LED 不是线性的。因此,将它们打开例如 50% 以将其亮度降低到 50% 是行不通的。

您可以使用预定义的表(例如这里: http: //www.mikrocontroller.net/articles/LED-Fading#Das_Demoprogramm

你不需要会读德语。只需研究这段代码。有一些表格,例如 16 位 PWM (pwmtable_16[])。

所以你可以写:

delay_us(pwmtable_16[a]);

代替

delay_us(a);

于 2012-02-06T19:49:17.827 回答