BeagleBone学习之——PWM

开篇先吐槽下BeagleBone。。。。版本各种乱,驱动各种乱=.=
1. 关于驱动乱,,笔者想用pwm模块,虽说beaglebone自带了,但没给个说明文件啊。。全靠摸索!而且有些地方还不对。
2. 关于版本。。。beaglebone就没有向下兼容这一说么?先后装了Debian 7.5,Debian 7.8,Debian 7.9,Debian 8.3。7.5的pwm驱动和后面完全不一样,不能兼容啊喂!
PS.强烈建议装7.5。因为网上教程大部分都基于Debian 7.5的,,,适合新手
3. 关于源代码,,,官网提供的镜像BeagleBone官网最新镜像和github源码库BeagleBone官方github库,匹配不上喂!本想着 官方没给驱动说明么,那把源码载下来不就完了么!那里面至少有说明文件吧。。。后来还是太年轻了啊,github没有7.1之后的。。。。。郁闷。那只能摸索了

吐槽完毕,言归正传

前言
强烈建议自己写pwm驱动,不建议用官方提供的。另外笔者用的是镜像是Debian 7.5,高版本不保证兼容。附下载链接BeagleBone下载地址。

BeagleBoneBlack PWM驱动使用方法:
1. 加载PWM驱动
2. 加载指定PWM模块
3. 通过改写文件控制PWM

先说下几个路径:
1. /sys/devices/bone_capemgr.9/
BeagleBone cape配置路径,下面有个slots(插槽)文件,需要加载的什么驱动就把part-number写进去即可。
2. /sys/class/pwm
BeagleBone pwm配置路径,pwm驱动加载后会在该文件夹下生成相应的pwm模块,通过修改相应文件即可控制pwm
3. /lib/firmware
BeagleBone外设库(驱动),里面全是dtb文件,用以配置外设

下面步入正题:BeagleBonePWM资源一览
BeagleBone学习之——PWM_第1张图片
一、加载pwm驱动
进入外设库目录/lib/firmware,运行

ls -l | grep pwm

可得所有与pwm相关的设备树文件

可以看到除了am33xx_pwm-00A0.dtbo外还有各个引脚相关的文件。
这个am33xx**.dtbo相当于总的pwm说明,不论调用哪个pwm都得先加载它,剩下的用哪个引脚再加载哪个引脚驱动就好了。比如要使用P8_13端口的PWM,就需要加载 am33xx_pwm-00A0.dtbo和bone_pwm_P8_13-00A0.dtbo这两个文件。
但是!但是!但是!(重要的话说三遍!!!)先加载am33xx_pwm,然后去/sys/class/pwm加载指定pwm设备,然后再回来加载bone_pwm_P8_13!
蛋疼就在这里,驱动程序有bug不按这个顺序加载会出问题的!!!
加载过程如下:
切换到/sys/devices/bone_capemgr.9目录下,运行

echo am33xx_pwm > slots

即可。可以调用

cat slots

查看是否加载成功,如果出现下面这个,证明成功
BeagleBone学习之——PWM_第2张图片

二 加载指定PWM设备
切到”/sys/class/pwm”路径,与IO控制类似,往export文件写输,相应的模块就会从内核调出来,想要取消就往unexport里写。
比如P8_13端口对应的是pwm6模块,所以只需往export写6即可:

echo 6 > export


重新ls下当前文件夹,会多出个pwm6文件夹
这里写图片描述
至此PWM设备加载完毕。
另附一张PWM设备与引脚对应表:

PS. P8.34 36 45 46 和P9.28 29 31 默认并不能用,应该是更改引脚映射才能用。官方并没提供更改办法,有需要的自行研究

三、再回来加载指定引脚pwm驱动
操作同一:
切换到/sys/devices/bone_capemgr.9目录下,运行

echo bone_pwm_P8_13 > slots

即可。

四、操作pwm
回到“/sys/class/pwm”路径下进入pwm6文件夹。ls可得

这里写图片描述
其中 :
period_ns 是周期
duty_ns 是占空比
run 是使能开关,0关 1 开

比如控制电机 需要10KHz, 半速旋转,那么可以这样:

root@beaglebone:/sys/class/pwm/pwm6# echo 100000 > period_ns 
root@beaglebone:/sys/class/pwm/pwm6# echo 50000 > duty_ns 
root@beaglebone:/sys/class/pwm/pwm6# echo 1 > run

以上、另外所有的操作也可以在C语言中完成,利用c语言中的文件操作(open()、read()、write()等)来替代命令行中的 “echo >”功能即可。可参考另一篇关于uart的博文,上面有C语言版BeagleBone串口操作C语言版

你可能感兴趣的:(c,Debian,PWM,BeagleBone)