写点什么

智能小车系列 - 动力系统 (ezPWM)

发布于: 2021 年 04 月 28 日

开源项目:

https://github.com/xujialiang/ezPWMForRaspberry


ezPWM 可以方便在树莓派上生成 PWM 信号,只要传入一个百分比,就能产生对应占空比的 PWM 信号。


通过使用 RPIO 库,RPIO 库使用 PWM 有点费解,可能需要花费一定时间去理解分频。


使用 PWM 之前,需要对树莓派设置一番,否则无法使用 pwm 功能,参考 rpio 库的说明。


树莓派 4B 总共有 4 个 PWM 的 IO 口,12, 32,33,35 号引脚。

树莓派配置

可参考rpio官方库的配置


  1. 禁用 gpio 中断, 编辑 /boot/config.txt,新增如下配置。

dtoverlay=gpio-no-irq
复制代码
  1. 开启/dev/gpiomen 访问

cat >/etc/udev/rules.d/20-gpiomem.rules <<EOFSUBSYSTEM=="bcm2835-gpiomem", KERNEL=="gpiomem", GROUP="gpio", MODE="0660"EOF
复制代码


安装

npm install ezpwmforraspberry --save
复制代码


初始化

const ezPWM = require('ezpwmforraspberry');const pwm = new ezPWM();
复制代码


设置占空比

1.百分比

// 打开PWMpwm.openPWMByPercent(ezPWM.PWMPin.PIN12);
// 更新占空比pwm.updatePWMByPercent(ezPWM.PWMPin.PIN12,0);
// 从0到100for (let index = 0; index < 100; index++) { rpio.sleep(0.1); console.log('updatePWMByPercent', ezPWM.PWMPin.PIN12 ,index); pwm.updatePWMByPercent(ezPWM.PWMPin.PIN12,index);}
复制代码


2.高精度

// 打开PWMpwm.openPWM(ezPWM.PWMPin.PIN12, 0, total=1024); // 可以自行设置一个信号周期内的步数(行程)
// 更新占空比pwm.updatePWM(ezPWM.PWMPin.PIN12, 0)
// 从0到100for (let index = 0; index < 1024; index++) { rpio.sleep(0.1); console.log('updatePWMByPercent', ezPWM.PWMPin.PIN12 ,index); pwm.updatePWMByPercent(ezPWM.PWMPin.PIN12,index);}
复制代码


PWM 频率说明

树莓派 4B 之前的版本,时钟频率是 19.2MHz, 4B 的时钟频率是 54MHz。

给 PWM 口分配频率

通过 divosor 来设置 PWM 口的时钟频率的,

const pwm = new ezPWM('physical', 2048); 
复制代码

如上,设置了 2048, 则 divosor=54e6/2048,约 2.6367MHz 频率。

设置了时钟频率后,再设置精度, 也可称为分辨率。 假设我们设置精度为 1024

那么,2.6367Mhz/1024 ~= 25Hz, 也就是每秒 25 个 1024 分辨率的 PWM 信号。

设置占空比

pwm.openPWM(ezPWM.PWMPin.PIN12, low=0, total=1024); 
pwm.updatePWM(ezPWM.PWMPin.PIN12, low=800);
复制代码

参考博文:

https://raspberrypi.stackexchange.com/questions/4906/control-hardware-pwm-frequency/9725#9725

https://github.com/jperkin/node-rpio/issues/2


发布于: 2021 年 04 月 28 日阅读数: 17
用户头像

每个人都应该为他的梦想付出他的全部! 2018.02.28 加入

一个喜欢搞破坏,研究新技术、新硬件的技术人~

评论

发布
暂无评论
智能小车系列-动力系统(ezPWM)