本帖最后由 friendyh 于 2015-2-9 15:16 编辑
1.PWM介绍
脉冲宽度调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。(来源于网络)
PWM主要用于控制电机,舵机等等。
2.BBB PWM
BBB能产生多路PWM,但是这些PWM好像有一些有冲突,不能同时使用,经过本人测试,至少有6个能同时使用,这六个端口是9-14,9-16,9-21,9-22,8-13和8-16。
四轴飞行器要控制四个电调,至少需要4个PWM,我这里使用的是8-13,8-16,9-14和9-16四个端口。
设置PWM主要是对定时器进行设置,我查询过一些小的开发板,包括树莓派,香蕉派,以及友善之比的NANOT1卡片电脑等等,除去带FPGA的开发板,只有BBB能产生多路PWM,我认为能产生多路PWM是这个板子最大的特点,因此做四轴飞行器也只能用这个板子。
在这里我先大概介绍下电调,这个类似车上的电机驱动,但是它有一个5V的稳压输出,可以给开发板或者单片机供电,四轴飞行器每个螺旋桨都需要一个电调,一共是四个,也可买4合1的电调,但是这个4合1电调一旦坏了,就都不能用了,所以还是建议买单个的,然后买4个。一般舵机的周期是20ms,频率50HZ,但是电调的周期是10ms,高电平时间为1ms-2ms,这也是我之前无法驱动电调的原因,周期没有写对。
这里我上传一份很好的BBB PWM驱动,详见附件。这驱动是我室友从网上找的然后经过了他自己的修改,该驱动是基于Angstrom系统,此外增加一个下载链接,链接如下:
加载驱动说明如下
1) 首先必须要保证BBB没有加载任何PWM驱动,若已经加载,请执行如下步骤:
cat/sys/devices/bone_capemgr.<WHATEVER YOUR NUMBER IS HERE>/slots
# Find the slot for any pwmmodules
echo -<Slot # for the PWMmodules> > /sys/devices/bone_capemgr.<WHATEVER YOUR NUMBER IS HERE>/slots
# Repeat for all modules
#Once done
modprobe -r pwm_test.ko
2) 备份旧版本的pwm_test.ko
cd /lib/modules/<kernelversion>/kernel/drivers/pwm/
cp pwm_test.kopwm_test.ko.orig
3) 找到“驱动”中的pwm_test.ko文件, 把其复制到
/lib/modules/<kernelversion>/kernel/drivers/pwm/
4) 复制“驱动\fire”中所有的dtbo文件(sc_pwm_P*.dtbo) 到/lib/firmware
5) 重启之后即可
使用说明如下:
(1)在BeagleBonePWM.h文件的前几行设置驱动要使用的引脚,目前文件是这样的:conststd::string PIN_MOTOR_FORWARD("P8_13");
const std::string PIN_MOTOR_BACK("P8_19");
const std::stringPIN_SERVO_DERECTION("P9_14");
const std::stringPIN_SERVO_SHOOK_HEAD("P9_16");
引脚名称可以修改,引脚也可以改,但是建议大家使用我上面说明的六个引脚。如果要修改引脚,只能使用dtbo文件中有的引脚哈。
(2)在main.cpp中先加载pwm驱动,这个代码里面有,需要修改的是引脚名称和周期,BeagleBonePwmMotor类的第一个参数是刚才设置的引脚名称,第二个参数是周期,这里是20ms,是20000000ns.后面两个参数可以不用管。
这个PWM驱动可以用于控制你想控制的任何东西,大家可以下载下来按照自己的意愿修改后去做测试,控制电机什么的完全都没有问题,而且可以选择多路PWM输出。就将这些程序放到一个工程文件里面,然后按照上一篇帖子配置下交叉编译环境即可使用,大家可以使用示波器
修要注意的是,电调与普通的电机驱动不一样,要启动电调,必须要给一段时间的最低电平,才可以启动电调。我的电调启动代码如下:
最后上一张调试过程的图片:
这里使用的稳压源给飞行器供电,连线有四个PWM,四个地线,还有一个mpu6050传感器接到串口5上面,此外还有调试串口。
|