思丶无邪 发表于 2012-9-6 15:46:59

用delayMicroseconds()遇上问题了!

我用delayMicroseconds()做一个简单的延时时,用示波器测量的脉宽与延时的脉宽差很远啊,WHY?
intled=13;
void setup()
{
pinMode(led,OUTPUT);
}
void loop()
{
analogWrite(led,254);
delayMicroseconds(20);
analogWrite(led,0);
delayMicroseconds(40);
}
结果测量时发现,高电平脉冲宽度是30微秒,低电平宽度是50微秒,这种情况正常吗?

飞翔的红猪 发表于 2012-9-6 15:59:46

貌似其他语句执行也要耗时,再说要精确延时你得用定时器中断,而不是依赖这个函数

思丶无邪 发表于 2012-9-6 16:42:15

嗯你说的是,我只是觉得16M晶振语句占用的时间应该不会那么长,

思丶无邪 发表于 2012-9-7 11:24:02

intled=13;
void setup()
{
pinMode(led,OUTPUT);
}
void loop()
{
digitalWrite(led,HIGH);
digitalWrite(led,LOW);
}
我又试了一下这个程序,用示波器观察,高电平约要持续7微秒的时间才会跳到低电平,然后低电平又要持续约7微秒时间,这正常吗?

飞翔的红猪 发表于 2012-9-7 15:21:47

反编译出来看看

Randy 发表于 2012-9-26 13:55:51

思丶无邪 发表于 2012-9-7 11:24 static/image/common/back.gif
intled=13;
void setup()
{


这个是没有问题的,因为在程序运行时,每一条指令都是需要时间的。几微秒的时间是可以的!

思丶无邪 发表于 2012-9-27 17:17:47

Randy 发表于 2012-9-26 13:55 static/image/common/back.gif
这个是没有问题的,因为在程序运行时,每一条指令都是需要时间的。几微秒的时间是可以的!

嗯是的! 但如果用PORT 来取代digitalWrite(); 占用的时间就会大幅的减少

Randy 发表于 2012-9-27 19:31:53

思丶无邪 发表于 2012-9-27 17:17 static/image/common/back.gif
嗯是的! 但如果用PORT 来取代digitalWrite(); 占用的时间就会大幅的减少

您发现了更少的函数就好了!呵呵!
页: [1]
查看完整版本: 用delayMicroseconds()遇上问题了!