MPU 6050 застрял на тех же значениях

У меня возникла проблема с моим MPU6050. Я использую PID для ускорения двигателя со значениями MPU. В чем может заключаться проблема?

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

Это те ценности, которые я получаю, которые повторяются вечно. Эти значения следующие:

  • скорость двигателя;
  • значение, которое изменяет частоту вращения двигателя;
  • значение MPU;
  • изменение, внесенное PID.

0.00
0
10900
4800

0.00
0
10900
4800

Вот сам код.

int16_t ax, ay, az;

double Setpoint, Input, Output;
//Укажите ссылки и начальные параметры настройки
double Kp=2, Ki=5, Kd=1;
PID myPID(&Input, &Output, &Setpoint, Kp,Ki,Kd, DIRECT);

void setup() {
 Input = analogRead(ax);
  Setpoint = 100;
  //включите PID на
   myPID.SetMode(AUTOMATIC);
}

void loop() {
 accelgyro.getAcceleration(&ax, &ay, &az);
  int a=ax+10900;
//Здесь я устанавливаю для используемой переменной значение около 0. ax на самом деле составляет около -10900
// Это всегда верно, этого не будет в окончательном коде. Это просто заставляет его работать.

if(1) {
 int val;
  val = map(a, -1300, 1300, 0, 1023);
   Input = val;
    myPID.Compute();
     Serial.println(Output);

digitalWrite(motorPin2, HIGH);
Serial.print("\t");
Serial.println(ax);
Serial.print("\t");
Serial.println(a);
Serial.print("\t");
Serial.println(val);
     }
}

, 👍1

Обсуждение

Пожалуйста, опубликуйте [Минимальный, полный и поддающийся проверке пример] (http://stackoverflow.com/help/mcve ) - Я не вижу, например, где вы печатаете другие цифры. И почему вы делаете analogRead в разделе настройка?, @Nick Gammon

Я добавил отпечатки пальцев. Я думаю, что мой учитель сделал аналоговое чтение. Не уверен, что это должно быть там. Этот код уже работал раньше. Я думаю, что это с контактами что-то не так или что-то в этом роде., @Marc


2 ответа


2

Давайте разберем это на простой пример, который мы можем протестировать без MPU6050:

#include <PID_v1.h>

double Setpoint, Input, Output;
//Укажите ссылки и начальные параметры настройки
double Kp = 2, Ki = 5, Kd = 1;
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);

void setup() {
  Setpoint = 100;
  //включите PID на
  myPID.SetMode(AUTOMATIC);
  Serial.begin (115200);
  Serial.println (F("\n\nStarting\n\n"));
}

void loop() {
  int a = 0;
  int val = map(a, -1300, 1300, 0, 1023);
  Input = val;
  myPID.Compute();
  Serial.print (F("Input = "));
  Serial.println(Input);
  Serial.print (F("Setpoint = "));
  Serial.println(Setpoint);
  Serial.print (F("Output = "));
  Serial.println(Output);
  Serial.println();
  delay (300);
}

Результат:

Starting


Input = 511.00
Setpoint = 100.00
Output = 0.00

Input = 511.00
Setpoint = 100.00
Output = 0.00

Input = 511.00
Setpoint = 100.00
Output = 0.00

Input = 511.00
Setpoint = 100.00
Output = 0.00

Действительно, она не меняется. Давайте проанализируем, почему:

  • Входной сигнал равен 511
  • Заданное значение равно 100
  • Следовательно, ошибка составляет 100 - 511 = -411
  • Игнорируя (на данный момент) интегральные и дифференциальные члены, у вас есть пропорциональный член 2 (Kp), поэтому алгоритм пытается вывести ошибку 2 *
  • Результат будет равен 2 * -411 = -822
  • Однако максимальное и минимальное значения по умолчанию равны от 0 до 255, и, таким образом, выходные данные ограничиваются значением 0.
  • Алгоритм выдает 0.
  • И в следующий раз он делает то же самое.

Существует функция SetOutputLimits, которую можно использовать для изменения минимального и максимального выходных значений по умолчанию.

Значения Ki и Kd могут в конечном итоге оказать влияние, но вы ничего не заметите, если выходные данные будут привязаны к нулю.

Например, добавление этой строки в setup дает разные результаты:

  myPID.SetOutputLimits (-5000, 5000);

Результат:

Starting


Input = 511.00
Setpoint = 100.00
Output = -5000.00

Input = 511.00
Setpoint = 100.00
Output = -1233.00

Input = 511.00
Setpoint = 100.00
Output = -1438.50

Input = 511.00
Setpoint = 100.00
Output = -1644.00

Input = 511.00
Setpoint = 100.00
Output = -1849.50

Input = 511.00
Setpoint = 100.00
Output = -2055.00

Input = 511.00
Setpoint = 100.00
Output = -2260.50

Input = 511.00
Setpoint = 100.00
Output = -2466.00

Являются ли они действительными ограничениями, зависит от того, что именно вы пытаетесь сделать.

,

У меня все еще есть проблема с тем, что значение mpu не меняется, @Marc


1

Проблема заключалась в том, что у меня были контакты SCL и SDA, подключенные к неправильным контактам Arduino.

Извините, что отнял у вас время. Спасибо за советы.

,