Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino 马达不动_Arduino_Pid - Fatal编程技术网

Arduino 马达不动

Arduino 马达不动,arduino,pid,Arduino,Pid,我已经成功地使用PD控制器控制电机的位置。然而,我有一些编程相关的问题 这是我的密码: #define encoder0PinA_M1 2 #define encoder0PinB_M1 22 int EnablePin = 8; int PWMPin1 = 3; int PWMPin2 = 11; volatile signed int encoder0Pos = 0; unsigned long LastTime; signed int Input; signed int Scale

我已经成功地使用PD控制器控制电机的位置。然而,我有一些编程相关的问题

这是我的密码:

#define encoder0PinA_M1  2
#define encoder0PinB_M1  22
int EnablePin = 8;
int PWMPin1 = 3;
int PWMPin2 = 11;


volatile signed int encoder0Pos = 0;
unsigned long LastTime;
signed int Input;
signed int Scaled_PID;
float PID_Output, Scaled_PID1;
signed int ErrorSum,ErrorDiff,Error,LastError;
float kp=6;
float ki=0;
float kd=1;
int SampleTime = 10;
int TimeChange;
unsigned long Now;


void setup()
{
  pinMode(encoder0PinA_M1, INPUT);
  //digitalWrite(encoder0PinA_M1, HIGH);      
  pinMode(encoder0PinB_M1, INPUT);
  pinMode(EnablePin, OUTPUT);
  pinMode(PWMPin1, OUTPUT);
  pinMode(PWMPin2, OUTPUT);
  //digitalWrite(encoder0PinB_M1, HIGH);      
  attachInterrupt(0, doEncoder, CHANGE);  
  Serial.begin (9600);
  Serial.println("start");                
}

void PID()
{
  Now = millis();
  TimeChange = Now - LastTime;
  if(TimeChange >= SampleTime)
  {
    Error =  Input - encoder0Pos;
    ErrorSum = ErrorSum + Error;
    ErrorDiff = Error - LastError;

    PID_Output = kp * Error + ki * ErrorSum + kd * ErrorDiff;

    LastError = Error;
    LastTime = Now;

  }
}

void speedlimitforward()
{
  if (PID_Output >= 15)
  {
    PID_Output= 15;
  }
  if(PID_Output <= -15)
  {
    PID_Output=-15;
  }
  Scaled_PID = PID_Output+15;
  digitalWrite(EnablePin, HIGH);
  analogWrite(PWMPin1,Scaled_PID);


}

void speedlimitbackward()
{
  if (PID_Output >= 20)
  {
    PID_Output= -20;
  }
  if(PID_Output <= -20)
  {
    PID_Output= 20;
  }
  Scaled_PID = PID_Output+20;
  digitalWrite(EnablePin, HIGH);
  analogWrite(PWMPin2,Scaled_PID);
}




void loop()
{
  Input=50;
  PID();
  speedlimitforward();
}

void doEncoder()
{
  if (digitalRead(encoder0PinA_M1) == digitalRead(encoder0PinB_M1))
  {
    encoder0Pos++;
  } else {
    encoder0Pos--;
  }
  • 如果你问问题并得到答案,我认为你应该回到这里,回答你自己的问题,并将其标记为已回答,否则人们会花时间在上面

  • 问题显然是
    延迟(2000)
    ,如果你看一下代码,你就会明白原因。当您只有一条指令时,所发生的是循环启动,根据经过的时间检查时间并查看电机是否必须移动。因此,如果你设置一个延迟,下一次循环运行时,时间将完全花在等待上,电机将不会移动

  • 你能做的就是跟踪电机的运行情况,并以此为基础移动电机。例如,保留一个名为
    movement\u completed
    的变量,并为其指定一个值,该值在移动函数完成移动后返回。只有在设置了该变量之后,才能继续进行下一组动作

我认为这里的主要问题是您必须记住,
loop()
是不断被调用的,它不是只运行一次的。
你需要清楚地理解为什么你的马达会随着第一个代码停止(然后你就会明白为什么它不会随着第二个代码移动)。

1)这不是C。Arduino不是C。2)
volatile
不能保证原子访问。3) 这不是调试服务。使用调试器。4) 在Arduino上使用浮点很可能是个坏主意。使用缩放整数。@Dhav1991不知道为什么在stackoverflow上问这个问题,如果你知道真正的arduino论坛的话
void loop()
{
  Input=50;
  PID();
  speedlimitforward();

  delay(2000);
  Input=0;
  PID();
  speedlimitbackward();

  delay(2000);
  Input=-100;
  PID();
  speedlimitbackward();

 }