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

树莓派:GPIO引脚脉冲计数与Thonny方波显示问题

树莓派GPIO引脚脉冲计数与方波显示解决方案

问题1:脉冲计数失效的解决

之前无法完成脉冲计数,大概率是因为未正确使用全局变量或边沿检测配置有误。核心修复点:

  • 声明全局计数变量,在边沿回调函数中更新计数
  • 按需选择边沿检测类型(上升沿/下降沿/双边沿)

问题2:持续打印电平以显示方波

要在Thonny绘图器中显示方波,需要持续输出当前引脚电平,而非仅在边沿触发时打印。通过主循环定期读取并打印电平值,即可生成连续的方波曲线。

完整代码示例

import RPi.GPIO as GPIO
import time

# GPIO配置
PIN = 22
GPIO.setmode(GPIO.BOARD)  # 使用物理引脚编号
GPIO.setup(PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)  # 下拉电阻,默认电平0

# 全局变量:脉冲计数与当前电平
pulse_count = 0
current_level = GPIO.input(PIN)

def edge_callback(channel):
    global pulse_count, current_level
    current_level = GPIO.input(channel)
    # 每次边沿变化计数+1,若统计完整脉冲(0→1→0为一个),仅在上升沿触发时执行此行
    pulse_count += 1

# 注册边沿检测:双边沿触发,防抖20ms
GPIO.add_event_detect(PIN, GPIO.BOTH, callback=edge_callback, bouncetime=20)

try:
    start_time = time.time()
    while True:
        # 持续打印当前电平,Thonny绘图器会生成方波曲线
        print(current_level)
        time.sleep(0.001)  # 1ms采样一次,适配100Hz脉冲的10ms周期

        # 可选:每1秒检测一次频率,统计100Hz时的脉冲数
        if time.time() - start_time >= 1:
            # 双边沿计数时,每个完整脉冲对应2次边沿触发,需除以2得到实际脉冲数
            actual_pulses = pulse_count // 2
            frequency = actual_pulses  # 每秒脉冲数即为频率
            print(f"当前频率: {frequency} Hz")
            
            if frequency == 100:
                print(f"100Hz时累计完整脉冲数: {actual_pulses}")
            
            pulse_count = 0
            start_time = time.time()
finally:
    GPIO.cleanup()  # 程序退出时清理GPIO资源

关键说明

  1. 计数逻辑调整:

    • 若只需统计完整脉冲数(从0到1再回到0),将GPIO.BOTH改为GPIO.RISING,并移除actual_pulses = pulse_count // 2,直接用pulse_count作为实际脉冲数。
    • 必须在回调函数中用global声明变量,否则会创建局部变量导致计数不更新。
  2. 方波显示优化:

    • time.sleep(0.001)控制采样频率,1ms一次的采样足够捕捉100Hz脉冲的变化(周期10ms),避免出现三角波。
    • Thonny绘图器会自动将连续打印的1/0值绘制成方波曲线,无需额外配置。
  3. 防抖处理:

    • bouncetime=20用于过滤机械触点的抖动信号,可根据实际硬件调整数值(通常10-50ms)。

内容的提问来源于stack exchange,提问作者Mainland

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 16:55:06