我将电动机从四轴飞行器连接到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);
}
答案 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,因为速度非常高,您可能会受伤。小心点。
仍然有不同的库和其他语言,它们在此站点上显示:
#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;
}