PID не работает правильно

В настоящее время я работаю над проектом, где мне нужно использовать PID, чтобы получить правильную скорость для двигателя, когда он под углом определен.

Проблема в том, что я получаю 0.00 и 255.00 в качестве скорости. Ничего посредине. Код должен активироваться, когда значение угла больше 1300 и меньше -1300. Переменная ax указана с датчика MPU6050.

int16_t ax, ay, az;

double Setpoint, Input, Output;
//Specify the links and initial tuning parameters
double Kp=2, Ki=5, Kd=1;
PID myPID(&Input, &Output, &Setpoint, Kp,Ki,Kd, DIRECT);

void setup() {
  Input = analogRead(ax);
  Setpoint = 100;
  //turn the PID on
  myPID.SetMode(AUTOMATIC);
}

void loop() {
  accelgyro.getAcceleration(&ax, &ay, &az);
  int a=ax+10900;
  //Here I set the used variable to around 0. ax is actually around -10900
  //This is always true, this won't be in the final code. This is just making it work.
  if(1) {
    int val;
    val = map(a, -1300, 1300, 0, 1023);
    Input = val;
    myPID.Compute();
    Serial.println(Output);
  }
}
1 голос | спросил Marc 15 FebruaryEurope/MoscowbMon, 15 Feb 2016 14:13:19 +0300000000pmMon, 15 Feb 2016 14:13:19 +030016 2016, 14:13:19

2 ответа


3

Насколько быстро ваша система сравнивается с временем выборки loop ()? Имеет ли (100-карта ((ax + 10900), - 1300,1300,0,1024)) заметно изменяется во время субмиллисекундного цикла ()?

При kI = 5 ошибка только 10 будет насыщать ваш выходной сигнал 0-255 в 26 итерациях цикла (), потенциально создавая поведение, которое вы видите. Если вы не контролируете время выборки, интегральная ошибка может очень быстро (вверх или вниз) до предела процесса.

От https://www.arduino.cc/ru/Reference/Map map () только линейно преобразует входные данные в выходные данные, но не ограничивает () его этими ограничениями. Если ax = -9000, тогда значение val будет больше 1024. Тем не менее, принимая нормальный рабочий диапазон ax + 10900 (-1300,1300), который затем отображается в (0,1024), Kp = 2 с заданное значение 100 будет производить диапазон (-200,2048), ограниченный лимитами по умолчанию (0,255).

Работа назад от заданного значения 100, через карту 0-1024 составляет 0.0975 по диапазону (-1300 до 1300), или val = -949, или ax = -11849. И kP = 2 раза коэффициент отображения 1024/2600 изменит выход на 2 * 1024/2600 = 0,79 балла за каждое различие в шаге от ax -11849.

http://playground.arduino.cc/Main/MPU-6050 страницы говорят, что регистры ускорения 16 бит с высокой чувствительностью, и предполагает, что 50 точек шума являются небольшим изменением. Если датчик установлен на 16 бит для +/- 2G в топор, то каждый шаг меняет 60 микро-G. Если это источник вашего топора, то небольшие вариации могут легко насытить вашу систему управления, сделав ее перегибом между ее выходными пределами с изменениями только милли-G на датчике.

Уменьшите время выборки, уменьшите kI и подумайте о своих Kp, Ki и Kd как о конверсиях ваших измеренных и переведенных переменных точечных ошибок в выходное пространство (скорость 0-255).

Также, выбирая время выборки, рассмотрите, как часто вы хотите, чтобы PID вносил корректировки в процесс.

ответил Dave X 16 FebruaryEurope/MoscowbTue, 16 Feb 2016 22:36:50 +0300000000pmTue, 16 Feb 2016 22:36:50 +030016 2016, 22:36:50
3

Пожалуйста, уважайте других, представляя читаемый код. Делая это, вы также можете обнаружить явные ошибки в вашем коде. Позвольте мне очистить цикл (), и вы увидите, что я имею в виду.

void loop() {
    int a = ax + 10900;
    if (1) {
      int val;
      val = map(ax, -1300, 1300, 0, 1023);
      Input = val;
      myPID.Compute();
      Serial.println(Output);
    }
  }
}

Итак, что такое «int a = ax + 10900»? «ax» не определен, но другое его использование является аналоговым номером «Input = analogRead (ax)». И «а» не используется.

Существует условие, которое всегда верно «if (1)» и т. д.

Ура!

ответил Mikael Patel 15 FebruaryEurope/MoscowbMon, 15 Feb 2016 15:42:27 +0300000000pmMon, 15 Feb 2016 15:42:27 +030016 2016, 15:42:27

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132