2015-11-16 5 views
6

Non sono del tutto sicuro se questo è il posto giusto per chiederlo. Bene, lo è un problema di programmazione, suppongo.Perché un delta inferiore causa la regolazione del controller PID con minore precisione?


Sto provando a creare una semplice simulazione di controller PID in Java.

In breve, c'è un valore obiettivo e un valore corrente. Il valore corrente è modificato da un numero. Si fornisce al controller PID il valore corrente e si cercherà di restituire un numero nella speranza che tale numero causi l'approssimazione del valore corrente del valore target. Overtime, più usi il controller PID, "impara" (usando integrali e derivati) e alla fine restituisce valori sempre più precisi. Ciò è utile per, per esempio, mantenere l'equilibrio di una barca controllando il movimento della ruota.


La formula utilizzata da un controller PID è piuttosto generale e abbastanza semplice - o almeno così pensavo. Nell'esempio seguente, il valore che viene restituito dal controller PID viene semplicemente aggiunto al valore corrente. Presumo che funzioni con applicazioni più complesse (che implicano moltiplicazione o divisione, ecc.). Questo è il mio programma:

public class PID { 

    private static double Kp = 0.1; 
    private static double Kd = 0.01; 
    private static double Ki = 0.005; 

    private static double targetValue = 100.0; 
    private static double currentValue = 1.0; 

    private static double integral = 0.0; 
    private static double previousError = 0.0; 

    private static double dt = 0.5; 

    private static double max = 5; 
    private static double min = -5; 

    public static void main(String[] args) throws Exception { 
     while (true) { 
      Thread.sleep((long) (1000.0 * dt)); 
      double error  = targetValue - currentValue; 
      double derivative = 0.0; 
      double output  = 0.0; 
      integral = integral + error * dt; 
      derivative   = (error - previousError)/dt; 
      output    = Kp * error + Ki * integral + Kd * derivative; 
      previousError   = error; 
      if (output > max) output = max; 
      if (output < min) output = min; 

      // Apply the output to the current value: 
      System.out.println(currentValue + " + " + output + " = " + (currentValue + output)); 
      currentValue += output; 
     } 
    } 

} 

Se si esegue questo, si vedrà che il regolatore PID alla fine riesce a provocare il valore corrente di essere molto molto vicino al valore di riferimento.

È davvero bello. Ora, volevo vedere i miei risultati un po 'più velocemente (perché ho intenzione di creare una sorta di grafico interattivo), così ho deciso di cambiare il delta dt a 0.1.

Purtroppo, il valore risultante non è più vicino a 100! Ora sembra di raggiungere 105 e poi, molto lentamente, diminuire a 100. Non va bene!

Ora immagina di avere dt allo 0.01! Ora è estremamente lento raggiungere 102 e ora non torna nemmeno a 100, ora continua ad aumentare!

Quindi la mia domanda è: perché un delta inferiore causa questo?

Il mio codice è basato su this PDF document e usano 0.01 bene.

+0

Penso che le tue domande si adattino a questo [sito] (http://math.stackexchange.com/search?q= [controllo-teoria] + controller PID +). – user3707125

risposta

1

è molto facile, si ottiene un avviamento integrale.

Sede, "integrale" non si limita a crescere, ma si limita l'effetto dell'uscita di essere in gamma [-5, 5]

Ci sono molte soluzioni, il mio fix discarica è quello di limitare integrale tra min e max.

con tale correzione non c'è viene superato più grande di una cifra con un tempo di ciclo di 0,5, 0,1 e 0,01 (ma anche di limitare derivato)

Limitante derivato può essere correzione utilizzando lo stesso trucco usato per prevenire "derivato kick ": usa la differenza tra il precedente e il valore effettivo invece della differenza tra errore. Basta fare attenzione che è necessario anche invertire il segno

Ma se è necessario simulare un PID con dt di qualsiasi valore il più velocemente possibile, basta commentare il sonno!

+0

Se limito il valore di 'integral' tra -5 e 5, il controllore continuerà ad emettere' 5.0' e quindi '-4.9999 ...', facendo oscillare il valore tra '100' e' 95' – Voldemort

+1

link al codice per favore? cosa stai usando? – Lesto

+0

'dt = 0.01' e ho semplicemente aggiunto' if (integrale> max) integral = max; 'e' if (integrale Voldemort

0

Quando si modifica il delta (dt) si modifica solo il campionamento del sistema. Non dovrebbe cambiare troppo il comportamento per un sistema lento, ma la simulazione della risposta del sistema è molto veloce (l'output va immediatamente in input, mentre nella vita reale ci sono ritardi). Quindi la frequenza di campionamento (o delta time) interferisce con il comportamento del PID, perché il sistema risponde anche più velocemente.

Anche prestare attenzione che l'equazione

currentValue +=output 

rende il vostro sistema si comportano come uno integrativo, che non è il comportamento di una ruota barca di controllo, per esempio. Questo è il motivo per cui occorre molto tempo per recuperare il superamento.

I PID di vita reale hanno molti altri trattamenti importanti, come l'anti-windup, il filtro derivativo, ecc. Penso anche che l'equazione delle serie sia più facile da capire e da sintonizzare manualmente. L'equazione di serie è anche lo standard ISA e l'equazione più utilizzata nelle apparecchiature commerciali.

Problemi correlati