电调马达不改变速度

时间:2019-07-09 22:02:57

标签: c raspberry-pi gpio wiringpi

我将电动机从四轴飞行器连接到Raspberry Pi Zero。但是事实证明,当我尝试旋转电动机(即设置速度)时,电动机开始非常快速地旋转,它们也可以定期关闭,然后再次以高速开始旋转。如何更改速度?为什么有时会关闭它们?

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <wiringPi.h>

#define RIGHT_MOTOR 1
#define LEFT_MOTOR 4

void init_ESC(int num);
void set_speed(int num, int speed);

int main ()
{

  int speed = 3320;

  wiringPiSetup();

  pinMode(RIGHT_MOTOR, PWM_OUTPUT);
  pinMode(LEFT_MOTOR, OUTPUT);

  //pwmSetMode(PWM_MODE_MS);
  //pwmSetClock(50 * pow(10, 6) / 1920 / 1024);

  init_ESC(RIGHT_MOTOR);
  delay(1000);

  while (1)
  {
    set_speed(RIGHT_MOTOR, speed);
    //set_speed(LEFT_MOTOR, speed);
    //printf("speed = %d\n", speed);

  }

  return 0;
}

void init_ESC(int num){
        pwmWrite(num, 0);
        delay(20);
        pwmWrite(num, 1024);
        delay(1);
}

void set_speed(int num, int speed){
    pwmWrite(num, 0);
    delay(20);
    pwmWrite(num, 1024);
    pwmWrite(num, 0);
    delay(20);
    pwmWrite(num, 1024);
    delayMicroseconds(1100);
}

2 个答案:

答案 0 :(得分:0)

通过繁忙的循环很难实现良好的伺服/ ESC控制。即使您的程序正确无误,操作系统有时也会运行其他进程,并且您的时间也会受到影响。

我建议使用Servoblaster软件:https://github.com/richardghirst/PiBits/tree/master/ServoBlaster。它在pi中使用中断和dma硬件来保持良好的准确性。

答案 1 :(得分:0)

非常感谢,我使用了pigpio.h库。 编译命令:gcc pulse.c -pthread -lpigpio -lrt 有必要使用gpioServo function (pin, pulse); 该值应在1000到2000的范围内,因为当使用这些电动机时,需要具有不同时间间隔的信号,因此速度取决于它。从1000到2000都是微秒。这是一个小图: 但是使用PWM SIGNAL时,我不太了解如何更改PWM频率,或者默认情况下为50?

Scheme ESC to Arduino or Raspbarry Pi

非常重要!!!警告!!! 我极力建议将微秒值(速度)设置为不超过1000-1200,因为速度非常高,您可能会受伤。小心点。

仍然有不同的库和其他语言,它们在此站点上显示:

Other lib and lan

#include <stdio.h>
#include <pigpio.h>

int main(){

    if(gpioInitialise() < 0){
        fprintf(stderr, "pigpio initialisation faled\n");
        return 1;
    }

    gpioSetMode(23, PI_OUTPUT);

    //Unlock ESC
    gpioServo(23, 1500);
    time_sleep(1);

    int speed = 1200;        

    while(1){
        //for(int speed = 1100; speed < 2000; speed+=100){
            //for(int i = 0; i < 20; i++){
                gpioServo(23, speed);
                //time_sleep(0.2);
            //}
            //printf("us = %d\n", speed);
        //}
    }

    return 0;
}