Forum: Mikrocontroller und Digitale Elektronik Hilfe bei: AppNote AVR221 - PID-Regler


von Peter B. (basejump)


Lesenswert?

Könntet ihr mir mal sagen ob ich das richtig verstanden habe?

1.
Get_Reference() soll meinen Soll-Wert zurückgeben?
Zum Beispiel eine feste Soll-Temperatur von 25°C

2.
Get_Measurement() soll der aktuelle gemessene Wert sein?
meinetwegen irgendwas zwischen 10 und 30°C



mit 3.   Set_Input()
komm ich nicht klar!

Kann mir dafür mal einer ein Beispiel nennen?



1
/*! \brief Read reference value.
2
 *
3
 * This function must return the reference value.
4
 * May be constant or varying
5
 */
6
int16_t Get_Reference(void)
7
{
8
  return 8;
9
}
10
11
/*! \brief Read system process value
12
 *
13
 * This function must return the measured data
14
 */
15
int16_t Get_Measurement(void)
16
{
17
  return 4;
18
}
19
20
/*! \brief Set control input to system
21
 *
22
 * Set the output from the controller as input
23
 * to system.
24
 */
25
void Set_Input(int16_t inputValue)
26
{
27
  ;
28
}

von Michael K. (mmike)


Lesenswert?

Wo genau hängts denn? Bzw. beschreibe Dein Problem einmal genauer! Was 
soll geregelt werden. Welche Messwerte werden erfasst und wie?

Normalerweise hast man ja einen Sollwert (bei Dir wahrscheinlich die 
Reference) und man hat den aktuellen Zustand des Systems (das ist die 
Messung). Werden beide Werte voneinander abgezogen bekommt man den 
Regelfehler. Diesen übergibt man dem Regler, der dann die Steuergröße 
ausspukt und damit wieder auf das System einwirkt. So sollte es im 
groben Ablaufen. Wo genau hängt bei Dir ?

Grüße,
Michael

von Peter B. (basejump)


Angehängte Dateien:

Lesenswert?

Hallo Michael,

es geht um einen Spannungswandler mit dem ich eine ordentliche konstante 
Spannung erzeugen möchte.

Es funktionier schon halbwegs, aber irgendwas stimmt an der Schaltung 
nicht und die PWM-Regelung im Controller ist auch nicht so gut.

Ich hab das hier mal aufgebaut und die Werte ausgeben lassen.
In dem Bild im Anhang ist es grafisch aufbereitet worden und man erkennt 
gleich das etwas mit der Regelung des PWM-Signals nicht stimmt.

Mein Programm schaltet den Mosfet mit Masse kurz wenn die On-Zeit 100% 
erreicht, das tut der Batterie weh wenn da jemand so zieht.

grün = PWM
rot = Eingangsspannung 3-4V
gelb = Ausgangsspannung 10V

Ich hät mir den Quellcode aber mal etwas besser durchlesen sollen.
1
    // Run PID calculations once every PID timer timeout
2
    if(gFlags.pidTimer)
3
    {
4
      referenceValue = Get_Reference();
5
      measurementValue = Get_Measurement();
6
7
      inputValue = pid_Controller(referenceValue, measurementValue, &pidData);
8
9
      Set_Input(inputValue);
10
11
      gFlags.pidTimer = FALSE;
12
    }

Der Abschnitt hat Verständnisprobleme bei mir verursacht:
1
/*! \brief Set control input to system
2
 *
3
 * Set the output from the controller as input
4
 * to system.
5
 */
6
void Set_Input(int16_t inputValue)
7
{
8
  ;
9
}

Setze den Ausgang des Controllers als Eingang zum System.

Damit meinten die nicht den mikro-Controller sonder die PID-Methode.

Ich füttere jetzt einfach meinen PWM-Timer mit dem "inputValue".

Hatst du (oder jemand anderes) diese Regelung mal in einem Projekt 
verwendet?



Einfrage hab ich aber noch!

Was mach ich mit pid_Reset_Integrator

Wann muss ich den Integrationsanteil zurücksetzen?
Ist das eine Art Anti-Wind-Up Schutzschaltung oder gibt es da eine 
Regel?
1
*! \brief Resets the integrator.
2
 *
3
 *  Calling this function will reset the integrator in the PID regulator.
4
 */
5
void pid_Reset_Integrator(pidData_t *pid_st)
6
{
7
  pid_st->sumError = 0;
8
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.