1,参考文献
舵机控制原理
wiringPi库驱动pwm
入门WiringPi库的PWM接口
2,实验器材
树莓派4B(BCM2711),二轴云台
BCM2711手册
3,wiringPi库实现硬件pwm输出
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <wiringPi.h>
//#include <softPwm.h> //软件模拟才要
int main( void){
int pwm_gpio1 = 1; //使用GPIO1 1就是引脚标号
int pwm_clk = 1070; //分频
int pwm_range = 1000; //周期 pwm基准时钟/pwm_range/pwm_clk=50Hz
int _pwm_range = 1*50;//站空比。1.5ms=up;1ms=z;2ms=down.
if(wiringPiSetup() == -1){ //初始化wiringPi的库函数,变成wiringPi的编码
printf("Init error\n");
exit(1);
}
wiringPiSetup();
pinMode(pwm_gpio1 ,PWM_OUTPUT);//设置1号引脚的模式为PWM输出 OUTPUT---设置管脚模式为输出电压
pwmSetMode(PWM_MODE_MS); //_MS非平衡,默认_BAL平衡模式
pwmSetRange(pwm_range); //设置周期默认就是1024
pwmSetClock(pwm_clk); //分频数默认32,pwm时钟输入19.2Mhz,默认586hz。
pwmWrite(pwm_gpio1 ,_pwm_range) ;
return 0;
}
我们可以看到clk我设置了1070,range周期设置了1000。从示波器可以看到这里就是50hz。设置当前高脉宽50,从舵机控制原理可知,我这里1ms*50=往上翻,符合。
上面为什么这么设置clk和range呢?凑得。
照第三篇参考文献所说,pwm基准时钟19.2Mhz,clk和range默认的话输出频率就是19.2M/32/1024=586hz,结果示波器显示704hz。软件模拟pwm也试过,始终达不到理论效果即586hz。都是用的wiringPi库c编程。而如果使用python库,却能够达到理论效果。
然而我看BCM2711手册说pwm时钟是100Mhz,试过也不行。但我这么设置反推时钟差不多就是54Mhz的样子,为什么呢?管他呢,能驱动舵机就行了。