首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >脉宽调制( RPI /c编程)RPI驱动伺服

脉宽调制( RPI /c编程)RPI驱动伺服
EN

Stack Overflow用户
提问于 2017-05-09 21:08:56
回答 2查看 4.8K关注 0票数 0

我尝试驱动一个伺服与树莓派使用的PWM上的GPIO引脚18我有线的设置,如你可以看到下面。

当我驱动伺服时,我可以做到这一点没有任何问题,我使用的命令,你可以看到下面。

代码语言:javascript
复制
     gpio -g mode 18 pwm
     gpio pwm-ms
     gpio pwmc 192
     gpio pwmr 2000
     gpio -g pwm 18 150
     gpio -g pwm 18 200

这样做很好,没有任何问题,但是当我尝试使用wiringpi对C程序执行相同的操作时,您可以看到下面的内容。

代码语言:javascript
复制
#include <wiringPi.h>
#include <stdio.h>

int main (void)
{
   printf ("Raspberry Pi wiringPi test program\n");
   wiringPiSetupGpio();
   pinMode (18, PWM_OUTPUT) ;
   pwmSetMode (PWM_MODE_MS);
   pwmSetRange (2000);
   pwmSetClock (192);
   pwmWrite(18,150);
   delay(1000);
   pwmWrite(18,200);
   return 0;
}

程序和raspberry pi chrash,所以我必须重新启动它们,有谁知道我做错了什么,以及我如何解决这个问题,这是非常令人沮丧的?

EN

回答 2

Stack Overflow用户

发布于 2019-07-15 16:04:37

我花了几个星期的时间用WiringPi和C编程控制两个伺服(SG90),我推荐三件事。

1.使用BCM GPIO而不是WiringPi Pin,因为控制多个伺服,您可能需要多个引脚,如1(WiringPi Pin)/18(BCM GPIO)用于另一个伺服,对于RPi3 B+版本,它提供两个通道用于硬件脉宽调制。gpios 12/18上的通道0和gpios 13/19上的通道1,如果您使用BCM GPIO,则无需担心引脚映射问题。

2.最好确保只有一个程序访问PWM。一次引脚。根据我的经验,如果你发现使用像"gpio -g pwm 18 25“这样的命令是可行的,但是使用像"pwmWrite(18, 25)”这样的代码不会得到任何伺服响应,也许可以尝试使用"ps -A“来确定是否有其他程序正在竞争你的伺服访问。

3.最后也是对我来说最难的一个,当我在PWM. pin 18上执行pwmWrite(18, 25)时,会在PWM. pin 12上触发相同的指令,这意味着pwmWrite(18, 25)会触发pwmWrite(12, 25)。为了解决这种情况,将伺服系统的其他引脚的模式改为输入模式,并将它们都设置为下拉模式。

有关详细信息,请参阅使用PWM控制两个伺服系统的代码。gpios上的通道0 12/18。

基本功能:

代码语言:javascript
复制
void servo_init() {
    servo_open(0);
    delay(DELAY_SERVO);
    servo_open(1);}

代码语言:javascript
复制
void servo_open(int servo) {
switch (servo) {
    case 0:
        pullUpDnControl(SERVO_0, PUD_OFF);
        pinMode(SERVO_0, PWM_OUTPUT);
        pwmSetMode(PWM_MODE_MS);
        pwmSetClock(PWM_CHANNEL_0_CLOCK);
        pwmSetRange(PWM_CHANNEL_0_RANGE);
        break;
    case 1:
        pullUpDnControl(SERVO_1, PUD_OFF);
        pinMode(SERVO_1, PWM_OUTPUT);
        pwmSetMode(PWM_MODE_MS);
        pwmSetClock(PWM_CHANNEL_0_CLOCK);
        pwmSetRange(PWM_CHANNEL_0_RANGE);
        break;  
    default:

        break;
}}

代码语言:javascript
复制
void servo_close(int servo) {

switch (servo) {
    case 0:
        pinMode(SERVO_0, INPUT);
        pullUpDnControl(SERVO_0, PUD_DOWN);
        break;
    case 1:
        pinMode(SERVO_1, INPUT);
        pullUpDnControl(SERVO_1, PUD_DOWN);
        break;  
    default:

        break;
}}

代码语言:javascript
复制
void servo(int servo, int angle) {
switch (servo) {
    case 0:
        servo = SERVO_0;
        break;
    case 1:
        servo = SERVO_1;
        break;  
    default:
        servo = -1;
        break;
}
switch (angle) {
    case 90:
        value = 25;
        break;
    case -90:
        value = 10;
        break;
    case 0:
        value = 14;
        break;  
    default:
        break;
}
if (servo == -1) return;
pwmWrite(servo, value);}

旋转一个连接到18 (BCM GPIO)的伺服

在要旋转一个之前,请先关闭其他对象

代码语言:javascript
复制
servo_close(1);
delay(DELAY_SERVO);

旋转

代码语言:javascript
复制
servo(0, 90);
delay(3*DELAY_MAGIC);
servo(0, 0);

将所有伺服复位到它们的初始角,以修复伺服偶尔的抖动

代码语言:javascript
复制
delay(DELAY_SERVO);
servo_init();

在Raspberry上查看更多关于伺服和传感器的源代码和信息:MY GitHub

票数 0
EN

Stack Overflow用户

发布于 2021-07-07 07:18:24

尝试"sudo ./server.“希望它能工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43870751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档