树莓派5 使用硬件PWM

        由于gpiozero或者其他树莓派python库的pwm发生都是软件pwm,当进行cpu占用大的处理代码时会导致pwm发生扰动。这里提供一种树莓派5硬件pwm产生的方式。首先,我们需要创建一个设备树覆盖文件来配置GPIO12, GPIO13, GPIO18和GPIO19为PWM模式并启用pwm0。

1.创建一个新的文件,命名为 pwm-pi5-overlay.dts,内容如下:
/dts-v1/;
/plugin/;

/{
    compatible = "brcm,bcm2712";

    fragment@0 {
        target = <&rp1_gpio>;
        __overlay__ {
            pwm_pins: pwm_pins {
                pins = "gpio12", "gpio13", "gpio18", "gpio19";
                function = "pwm0", "pwm0", "pwm0", "pwm0";
            };
        };
    };

    fragment@1 {
        target = <&rp1_pwm0>;
        frag1: __overlay__ {
            pinctrl-names = "default";
            pinctrl-0 = <&pwm_pins>;
            status = "okay";
        };
    };
};
2. 使用设备树编译器(dtc)将 .dts 文件编译为 .dtbo 文件:
dtc -I dts -O dtb -o pwm-pi5.dtbo pwm-pi5-overlay.dts
3. 将编译后的 .dtbo 文件复制到 /boot/firmware/overlays/ 目录:
sudo cp pwm-pi5.dtbo /boot/firmware/overlays/
4. 在/boot/firmware/config.txt末尾加上:
dtoverlay=pwm-pi5
5.重启树莓派
6.创建一个脚本文件,pwm_control.sh,并添加以下内容:
#!/bin/bash
NODE=/sys/class/pwm/pwmchip2
PIN="$1"
FUNC="a0"
PERIOD="$2"
DUTY_CYCLE="$3"

function usage {
    printf "Usage: $0 <pin> <period> <duty_cycle>\n"
    printf "    pin - one of 12, 13, 14, 15, 18 or 19\n"
    printf "    period - PWM period in nanoseconds\n"
    printf "    duty_cycle - Duty Cycle (on period) in nanoseconds\n"
    exit 1
}

if [ -d "$NODE/device/consumer:platform:cooling_fan/" ]; then
    echo "Hold your horses, looks like this is pwm1?"
    exit 1
fi

case $PIN in
    "12")
    CHANNEL="0"
    ;;
    "13")
    CHANNEL="1"
    ;;
    "14")
    CHANNEL="2"
    ;;
    "15")
    CHANNEL="3"
    ;;
    "18")
    CHANNEL="2"
    FUNC="a3"
    ;;
    "19")
    CHANNEL="3"
    FUNC="a3"
    ;;
    *)
    echo "Unknown pin $PIN."
    exit 1
esac

function pwmset {
    echo "$2" | sudo tee -a "$NODE/$1" > /dev/null
}

if [[ "$PERIOD" == "off" ]]; then    
    if [ -d "$NODE/pwm$CHANNEL" ]; then
        pinctrl set $PIN no
        pwmset "pwm$CHANNEL/enable" "0"
        pwmset "unexport" "$CHANNEL"
    fi
    exit 0
fi

if [[ ! $PERIOD =~ ^[0-9]+$ ]]; then
    usage
fi

if [[ ! $DUTY_CYCLE =~ ^[0-9]+$ ]]; then
    usage
fi

if [ ! -d "$NODE/pwm$CHANNEL" ]; then
    pwmset "export" "$CHANNEL"
fi

pwmset "pwm$CHANNEL/enable" "0"
pwmset "pwm$CHANNEL/period" "$PERIOD"
if [ $? -ne 0 ]; then
    echo "^ don't worry, handling it!"
    pwmset "pwm$CHANNEL/duty_cycle" "$DUTY_CYCLE"
    pwmset "pwm$CHANNEL/period" "$PERIOD"
else
    pwmset "pwm$CHANNEL/duty_cycle" "$DUTY_CYCLE"
fi
pwmset "pwm$CHANNEL/enable" "1"

pinctrl set $PIN $FUNC

echo "GPIO $PIN (Ch. $CHANNEL, Fn. $FUNC) set to $PERIOD ns, $DUTY_CYCLE."
7.通过以下命令使用PWM控制脚本:
bash pwm_control.sh <pin> <period> <duty_cycle>
8.例如,要在GPIO12上设置周期为20000000ns(20ms),占空比为1500000ns(1.5ms)的PWM信号,可以运行:
bash pwm_control.sh 12 20000000 1500000

9.参考https://gist.github.com/Gadgetoid/b92ad3db06ff8c264eef2abf0e09d569

### 如何在树莓派5上配置和输出PWM信号 #### 安装必要的库 为了简化操作并提高效率,在树莓派5上生成PWM波形推荐使用`pigpio`库。此库提供了简单易用的功能接口来控制GPIO引脚,包括设置频率和占空比等参数[^1]。 ```bash sudo apt-get update sudo apt-get install pigpio python3-pigpio ``` #### 编写Python程序以输出PWM信号 下面是一段利用`pigpio`库编写的Python代码示例,该代码将在指定的GPIO引脚上产生频率为100Hz、占空比为50%的PWM信号: ```python import time import pigpio pi = pigpio.pi() # 创建一个连接到本地Pi的对象实例 pin = 18 # 设置要使用的BCM编号模式下的GPIO引脚号 try: pi.set_mode(pin, pigpio.OUTPUT) # 将引脚设为输出模式 pi.hardware_PWM(pin, 100, 500000) # 启动硬件PWM:(引脚, 频率(Hz), 占空比*10^6) while True: pass # 循环等待直到按下Ctrl+C中断执行 except KeyboardInterrupt: # 当检测到键盘输入时退出循环 print("\nProgram terminated") finally: pi.stop() # 断开与pigpio守护进程之间的连接 ``` 这段代码首先设置了目标GPIO引脚的工作模式为输出;接着通过调用`hardware_PWM()`函数指定了具体的PWM特性,即工作频率以及期望达到的占空比例。这里需要注意的是,对于某些特定版本的树莓派来说,可能只有部分GPIO引脚支持硬件级别的PWM功能[^3]。 #### 关于可用作PWM输出的具体GPIO引脚列表 根据官方文档说明,树莓派4上的几个主要可用于PWM输出的GPIO引脚同样适用于树莓派5,这些引脚分别是: - BCM GPIO 12 或者物理位置第32针 - BCM GPIO 13 或者物理位置第33针 - BCM GPIO 18 或者物理位置第12针 - BCM GPIO 19 或者物理位置第35针 上述四个引脚均能够提供较为稳定的PWM输出效果。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值