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);
}
}
@Marc, 👍1
Обсуждение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
Проблема заключалась в том, что у меня были контакты SCL и SDA, подключенные к неправильным контактам Arduino.
Извините, что отнял у вас время. Спасибо за советы.
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Как соединить L293D и MPU6050 для совместной работы?
- Попытка контролировать скорость двигателя постоянного тока с помощью ПИД
- Помощь с ускорением ПИД-двигателя постоянного тока
- Как управлять двигателем постоянного тока с помощью mpu6050?
- Как устранить шум от вентилятора 12 В с ШИМ-управлением на низкой скорости
- Как очистить буфер FIFO на MPU6050?
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
Пожалуйста, опубликуйте [Минимальный, полный и поддающийся проверке пример] (http://stackoverflow.com/help/mcve ) - Я не вижу, например, где вы печатаете другие цифры. И почему вы делаете analogRead в разделе
настройка
?, @Nick GammonЯ добавил отпечатки пальцев. Я думаю, что мой учитель сделал аналоговое чтение. Не уверен, что это должно быть там. Этот код уже работал раньше. Я думаю, что это с контактами что-то не так или что-то в этом роде., @Marc