AVR上的软件PWM使用延迟

时间:2012-02-01 01:54:13

标签: avr avr-gcc pulse atmega16 mikroc

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

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

之前我曾在mikroC中使用过PIC,但不知何故,它在avr-gcc中并不那么容易,或者我可能错过了一些东西。

我的问题在于我希望LED在3秒内完全消失,但我觉得它的消失速度更快。我还认为它在高负荷循环上花费的时间多于在低负荷循环上花费的时间。我的意思是我看到led亮了一点,然后它消失了,但是当它变得暗淡时,它会非常快地移动到不同的工作周期,或者我认为......

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

此处提供代码:http://ideone.com/lUP5f

由于

2 个答案:

答案 0 :(得分:1)

保险丝设置可能存在问题。时钟通常由熔丝控制,而不是由定义控制。但延迟功能使用#define F_CPU。你可以发布保险丝设置吗?

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

编辑:btw

 uint8_t b = 1000;

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

  

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

答案 1 :(得分: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);