You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)。

不过你的代码逻辑里有几个小细节需要注意:

  1. 你用了analogWrite(pin_out, HIGH),其实HIGH对应数值1,对于支持PWM的引脚9来说,这会输出一个占空比极低的PWM信号(几乎是LOW),而不是持续的高电平。如果你想输出稳定的高电平,应该用digitalWrite(pin_out, HIGH);
  2. 你得到的0-9μs的数值,说明pin_in检测到的高电平持续时间非常短。如果两个引脚是短接的,可能是因为PWM信号的窄脉冲被检测到;如果引脚是断开的,那就是环境干扰产生的短暂高脉冲;
  3. 当你调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:34:02