树莓派: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资源
关键说明
计数逻辑调整:
- 若只需统计完整脉冲数(从0到1再回到0),将
GPIO.BOTH改为GPIO.RISING,并移除actual_pulses = pulse_count // 2,直接用pulse_count作为实际脉冲数。 - 必须在回调函数中用
global声明变量,否则会创建局部变量导致计数不更新。
- 若只需统计完整脉冲数(从0到1再回到0),将
方波显示优化:
time.sleep(0.001)控制采样频率,1ms一次的采样足够捕捉100Hz脉冲的变化(周期10ms),避免出现三角波。- Thonny绘图器会自动将连续打印的1/0值绘制成方波曲线,无需额外配置。
防抖处理:
bouncetime=20用于过滤机械触点的抖动信号,可根据实际硬件调整数值(通常10-50ms)。
内容的提问来源于stack exchange,提问作者Mainland
相关产品推荐
相关产品推荐

