ESC двигатель не меняет скорость - PullRequest
0 голосов
/ 10 июля 2019

Я подключил моторы от квадрокоптера к 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 голосов
/ 10 июля 2019

Большое спасибо, я использовал библиотеку pigpio.h.Команда компиляции: gcc pulse.c -pthread -lpigpio -lrt Необходимо использовать gpioServo function (pin, pulse); Значения должны находиться в диапазоне от 1000 до 2000, поскольку при работе с этими двигателями необходим сигнал с другим временным интервалом, скорость зависит отЭто.От 1000 до 2000 микросекунд.Вот небольшая диаграмма: Но с ШИМ-СИГНАЛОМ я не совсем понял, как изменить частоту ШИМ или она равна 50 по умолчанию?

Схема ESC для Arduino или Raspbarry Pi

ОЧЕНЬ ВАЖНО !!!WARGNING !!! Я очень рекомендую устанавливать значение микросекунд (скорость) не более чем 1000-1200, так как скорость очень высока, и вы можете пораниться.Будьте осторожны.

Есть еще разные библиотеки и другие языки, они представлены на этом сайте:

Другие библиотеки и локальные сети

#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;
}
0 голосов
/ 10 июля 2019

Трудно добиться хорошего управления сервоприводом / выходом с занятой петлей.Даже если ваша программа верна в противном случае, ОС иногда будет запускать другие процессы, и ваше время будет страдать.

Я бы порекомендовал использовать программное обеспечение сервобластера: https://github.com/richardghirst/PiBits/tree/master/ServoBlaster.Он использует прерывания и аппаратное обеспечение dma в pi для поддержания хорошей точности.

...