树莓派4B硬件pwm驱动舵机

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的样子,为什么呢?管他呢,能驱动舵机就行了。

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
首先,需要通过pip安装Adafruit_PCA9685库,可以使用以下命令: ``` sudo pip install Adafruit_PCA9685 ``` 然后,连接PCA9685模块到树莓派的I2C总线上,你可以参考PCA9685模块的引脚定义来连接。 接下来,可以使用以下代码来初始化PCA9685模块: ```python import Adafruit_PCA9685 pwm = Adafruit_PCA9685.PCA9685() pwm.set_pwm_freq(50) # 设置PWM频率为50Hz ``` 这里的50Hz是舵机的工作频率,可以根据具体的舵机型号进行调整。 然后,就可以使用`set_pwm`方法来控制舵机的角度。例如,控制舵机0的角度为90度: ```python pwm.set_pwm(0, 0, 375) # 375是90度时的PWM值 ``` 其中,第一个参数是舵机的通道号,第二个参数是起始的PWM脉冲宽度,第三个参数是终止的PWM脉冲宽度,可以根据具体的舵机型号和需要的角度进行计算。 完整的代码示例: ```python import Adafruit_PCA9685 import time pwm = Adafruit_PCA9685.PCA9685() pwm.set_pwm_freq(50) def set_servo_angle(channel, angle): # 计算PWM值 pulse_len = 1000000.0 / 50 / 4096 pulse_width = angle / 180.0 * 1000 / pulse_len pwm.set_pwm(channel, 0, int(pulse_width)) while True: # 控制舵机0转动 set_servo_angle(0, 0) # 舵机0转到0度 time.sleep(1) set_servo_angle(0, 90) # 舵机0转到90度 time.sleep(1) set_servo_angle(0, 180) # 舵机0转到180度 time.sleep(1) ``` 这个例子中,通过`set_servo_angle`方法来计算PWM值,并控制舵机转动。每次转动间隔1秒。你可以根据需要修改舵机的通道号和角度值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值