Arduino Uno两引脚间信号输出输入及测量结果疑问
你的Arduino引脚测试问题详解
嘿,作为玩Arduino多年的老玩家,我来帮你拆解这两个新手常遇到的问题:
一、为什么断开引脚后,最初的代码还能读到440-500的数值?
你的第一段代码有两个核心原因导致了这个“奇怪”的结果:
- 没设置引脚模式:你没有调用
pinMode()明确指定pin_out为输出、pin_in为输入。虽然Arduino默认引脚是输入模式,但输出引脚如果不手动设置,可能会有不确定的行为; - 悬空输入的干扰:当
pin_in(这里你用的是模拟引脚A0,因为analogRead(0)对应A0)断开连接时,它处于悬空状态。悬空的模拟输入会像天线一样拾取环境里的电磁干扰(比如周围的电线、电路板噪声),导致analogRead()返回随机波动的数值,440-500就是这种干扰的典型表现。
你可以做个小实验验证:把pin_in接地,analogRead()会返回接近0的数值;接5V的话,会返回接近1023的数值,这样就能确认是悬空干扰的问题了。
二、修改后的代码到底在测量什么?
你修改后的代码里,核心函数是pulseIn(pin_in, HIGH),这个函数的作用很明确:
它会先等待指定引脚变为HIGH电平,然后开始计时,直到引脚变回LOW电平,最终返回这个高电平持续的时间长度,单位是微秒(μs)。
不过你的代码逻辑里有几个小细节需要注意:
- 你用了
analogWrite(pin_out, HIGH),其实HIGH对应数值1,对于支持PWM的引脚9来说,这会输出一个占空比极低的PWM信号(几乎是LOW),而不是持续的高电平。如果你想输出稳定的高电平,应该用digitalWrite(pin_out, HIGH); - 你得到的0-9μs的数值,说明
pin_in检测到的高电平持续时间非常短。如果两个引脚是短接的,可能是因为PWM信号的窄脉冲被检测到;如果引脚是断开的,那就是环境干扰产生的短暂高脉冲; - 当你调用
pulseIn(pin_in, HIGH)时,如果引脚已经处于HIGH电平,函数会先等它变LOW,再等下一次HIGH才开始计时——这可能不是你想要的逻辑,建议调整时序,比如先拉低引脚,再拉高,然后立刻检测脉冲。
给你改个更清晰的示例代码,方便你理解:
int pin_out = 9; int pin_in = 0; void setup() { Serial.begin(9600); pinMode(pin_out, OUTPUT); pinMode(pin_in, INPUT); } void loop() { digitalWrite(pin_out, HIGH); // 输出稳定高电平 unsigned long highTime = pulseIn(pin_in, HIGH); // 测量高电平持续时长 Serial.print("高电平时长:"); Serial.print(highTime); Serial.println(" μs"); delay(500); digitalWrite(pin_out, LOW); unsigned long lowTime = pulseIn(pin_in, LOW); // 测量低电平持续时长 Serial.print("低电平时长:"); Serial.print(lowTime); Serial.println(" μs"); delay(500); }
如果两个引脚短接,你会看到接近500000μs的数值(因为delay(500)是500毫秒=500000微秒),这样就能直观看到pulseIn的作用了。
内容的提问来源于stack exchange,提问作者Artur Müller Romanov
相关产品推荐
相关产品推荐

