树莓派的PWM脉宽调制功能介绍

本文介绍了如何使用树莓派的GPIO通过脉宽调制(PWM)控制LED的亮度变化。文章提供了两种实用示例代码:一种是使LED每两秒闪烁一次;另一种则实现了LED在亮/暗状态之间的渐变切换。

       最近想用树莓派控制航模的电调,于是研究了下PWM,貌似控制电调比较麻烦,因为电调需要发送几个特定的信号启动,然后才能进入控制模式,今天先弄明白PWM,慢慢折腾。下面的程序亲测可用,我用的树莓派model B,12GPIO口是外面第6个针。
      脉宽调制(PWM)是指用微处理器的数字输出来对模拟电路进行控制,是一种对模拟信号电平进行数字编码的方法。在树莓派上,可以通过对GPIO的编程来实现PWM。

创建一个 PWM 实例:

GPIO.PWM(channel, frequency)

启用 PWM:

p.start(dc)   # dc 代表占空比(范围:0.0 <= dc >= 100.0)

更改频率:
p.ChangeFrequency(freq)   # freq 为设置的新频率,单位为 Hz

更改占空比:
p.ChangeDutyCycle(dc)  # 范围:0.0 <= dc >= 100.0

停止 PWM:
p.stop()

注意,如果实例中的变量“p”超出范围,也会导致 PWM 停止。

以下为使 LED 每两秒钟闪烁一次的示例:

importRPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(12, GPIO.OUT)
  
p =GPIO.PWM(12, 0.5)
p.start(1)
input('点击回车停止:')   # 在 Python 2 中需要使用 raw_input
p.stop()
GPIO.cleanup()

以下为使 LED 在亮/暗之间切换的示例:

import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(11, GPIO.OUT)
GPIO.setup(12, GPIO.OUT)

p = GPIO.PWM(12, 50)
p11 = GPIO.PWM(11, 38)

p.start(0)
p11.start(0)

try:
    while 1:
        for dc in range(0, 101, 5):
            p.ChangeDutyCycle(dc)
            p11.ChangeDutyCycle(dc)
            time.sleep(0.1)
        for dc in range(100, -1, -5):
            p.ChangeDutyCycle(dc)
            p11.ChangeDutyCycle(dc)
            time.sleep(0.1)
except KeyboardInterrupt:
    pass

p11.stop()
GPIO.cleanup()


### 树莓派 PWM 功能与配置方法 树莓派脉宽调制PWM,Pulse Width Modulation)是一种通过调节信号占空比来控制设备的技术。PWM 可用于控制电机速度、LED 亮度以及其他需要精确信号控制的应用场景[^1]。 #### PWM 的基本概念 PWM 是一种数字信号形式,通过调整高电平持续时间(占空比)来实现模拟信号的效果。例如,50% 的占空比意味着信号一半时间处于高电平,另一半时间处于低电平。这种技术广泛应用于电子工程领域,尤其是在嵌入式系统中。 #### 树莓派上的 PWM 配置 树莓派支持硬件 PWM 和软件 PWM。硬件 PWM 提供更稳定的输出,而软件 PWM 则依赖于操作系统的时间片分配,可能会出现抖动或不稳定的情况。 ##### 硬件 PWM 配置 树莓派GPIO 引脚中,GPIO12、GPIO13、GPIO18 和 GPIO19 支持硬件 PWM。以下是使用 Python 进行硬件 PWM 配置的示例代码: ```python import RPi.GPIO as GPIO import time # 设置 GPIO 模式为 BCM GPIO.setmode(GPIO.BCM) # 定义 PWM 引脚 pwm_pin = 18 # 设置引脚方向为输出 GPIO.setup(pwm_pin, GPIO.OUT) # 创建 PWM 对象,频率设置为 100Hz pwm = GPIO.PWM(pwm_pin, 100) # 启动 PWM,初始占空比为 50% pwm.start(50) try: while True: # 调整占空比 for dc in range(0, 101, 5): pwm.ChangeDutyCycle(dc) time.sleep(0.1) for dc in range(100, -1, -5): pwm.ChangeDutyCycle(dc) time.sleep(0.1) except KeyboardInterrupt: pwm.stop() GPIO.cleanup() ``` 此代码片段展示了如何通过 Python 控制树莓派的硬件 PWM 输出,并通过改变占空比实现 LED 亮度的渐变效果[^1]。 ##### 软件 PWM 配置 如果硬件 PWM 不满足需求,可以使用软件 PWM。以下是一个基于 C 语言的软件 PWM 示例: ```c #include <wiringPi.h> #include <softPwm.h> int main(void) { wiringPiSetup(); // 定义 PWM 引脚 int pwmPin = 0; // 初始化引脚 pinMode(pwmPin, OUTPUT); // 设置软 PWM 频率 softPwmCreate(pwmPin, 0, 100); for (int dutyCycle = 0; dutyCycle <= 100; dutyCycle++) { softPwmWrite(pwmPin, dutyCycle); delay(100); } return 0; } ``` 上述代码通过 WiringPi 库实现了软件 PWM功能,并逐步调整了占空比以实现类似硬件 PWM 的效果[^2]。 #### 常见问题与解决方法 1. **PWM 输出不稳定**:确保使用硬件 PWM 引脚,并避免在多线程环境中运行 PWM。 2. **无法检测到 PWM 引脚**:检查是否正确加载了树莓派的模块 `dtoverlay=pwm` 并重启设备[^3]。 3. **频率或占空比不匹配预期**:确认编程语言中的单位和实际硬件支持的范围一致。 #### 其他注意事项 在使用 PWM 时,建议为树莓派添加散热装置以防止过热,特别是在长时间运行高负载任务时[^2]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

offbye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值