2015-04-09 2 views
0

я искал реализации ПИД-регулятора в Java, и я это нашел:Мой ПИД-регулятор в Java работает неправильно

https://code.google.com/p/frcteam443/source/browse/trunk/2010_Post_Season/Geisebot/src/freelancelibj/PIDController.java?r=17

Итак, для того, что я мог понять, о нем я нахожусь используя его таким образом:

package lol.feedback; 

public class dsfdsf { 

    public static void main(String[] args) throws InterruptedException { 
     final PIDController pidController = new PIDController(1, 1, 1); 
     pidController.setInputRange(0, 200); // The input limits 
     pidController.setOutputRange(50, 100); // The output limits 
     pidController.setSetpoint(120); // My target value (PID should minimize the error between the input and this value) 
     pidController.enable(); 
     double input = 0; 
     double output = 0; 
     while (true) { 
      input = output + 30; 
      pidController.getInput(input); 
      output = pidController.performPID(); 
      System.out.println("Input: " + input + " | Output: " + output + " | Error: " + pidController.getError()); 

      Thread.sleep(1000); 
     } 
    } 

} 

Но он никогда не стабилизируется. Он не ведет себя как PID на всех ... Это выход я получаю:

Input: 30.0 | Output: 100.0 | Error: 90.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 
Input: 80.0 | Output: 100.0 | Error: 40.0 
Input: 130.0 | Output: 50.0 | Error: -10.0 

Может кто-то помочь мне сказать, что мне не хватает?

Спасибо!

ответ

1

Во-первых, попробуйте с другим набором параметров ПИД-регулятора - например final PIDController pidController = new PIDController (10, 1, 0.5); Первый параметр отвечает за усиление системы с замкнутым контуром. Второй отвечает за устранение фиксированной ошибки на выходе. Третий отвечает за динамику управления.

Вторая вещь - возможно, что реальный выходной сигнал всегда выходит за пределы, поэтому он принимает минимальное/максимальное значение.

В-третьих, почему вы всегда добавляете 30 к выходу и назначаете его на вход?

+0

Я просто проверяю его. Он должен стабилизироваться с выходом 90 (120 - 30), потому что заданное значение равно 120, и вход всегда выдается + 30. – PedroD

+0

изменение параметров не сработало. – PedroD

+1

Ну, попробуйте с множеством наборов, для первого вы должны проверить только получить часть контроллера, поэтому параметры будут, например, (10, 0, 0). Также снипплет класса PID-контроллера кажется подозрительным: // Вычисление сигнала ошибки m_error = m_setpoint - m_input; Ошибка должна быть рассчитана следующим образом: m_error_new = m_setpoint - m_result; И еще раз, я действительно не знаю, почему вы добавляете 30 в каждом цикле. Выход изменяется (требуется, чтобы получить значение уставки), поэтому ваш код всегда будет меняться и ваш вход, а изменение ввода делает изменения на выходе и т. Д. –

Смежные вопросы