STM Neuling schrieb:> Hallo liebe Forumgemeinde,>> ich versuche seit einiger Zeit meinen PID Regler ans Laufen zu bekommen.> Da ich den Regler mehrfach aufrufen will und ich innerhalb des Reglers> statische Variablen benötige habe ich diese per Pointer angebunden.> (siehe nachfolgenden Code für PID Regler)>> [c]float PI_Regler(struct PI_Control *PI, float P_Gain, float Out_min,> float Out_max, float I_Time, bool I_Reset, float cycle_time, float> control_value, float actaul_vaule)> {
Wo ist denn struct PI_Control definiert?
Der Compiler findet das anscheinend nicht.
Das struct ist in einer global.c definiert, die ich aber VOR dem Regler
inkludiere. Von daher verstehe ich das nicht...
#include <stdbool.h>
void SendeProtokoll(void);
float PI_Regler(struct PI_Control *PI, float P_Gain, float Out_min,
float Out_max, float I_Time, bool I_Reset, float cycle_time, float
control_value, float actaul_vaule);
#include <stm32f0xx.h>
#include <stm32f0xx_conf.h>
#include "stm32f0xx_dbgmcu.c"
#include "globals.h"
#include "setup.c"
#include "stm32f0xx_it.c"
#include "i2c_io.c"
#include "Anzeige.c"
#include "PI-Regler.c"
//#include "A3Setup.c"
STM Neuling schrieb:> Das struct ist in einer global.c definiert, die ich aber VOR dem Regler> inkludiere. Von daher verstehe ich das nicht...>> #include <stdbool.h>> void SendeProtokoll(void);> float PI_Regler(struct PI_Control *PI, float P_Gain, float Out_min,> float Out_max, float I_Time, bool I_Reset, float cycle_time, float> control_value, float actaul_vaule);>>>> #include <stm32f0xx.h>> #include <stm32f0xx_conf.h>> #include "stm32f0xx_dbgmcu.c"> #include "globals.h"> #include "setup.c"> #include "stm32f0xx_it.c"> #include "i2c_io.c"> #include "Anzeige.c"> #include "PI-Regler.c"> //#include "A3Setup.c"
Nein, das möchtest du nicht: Never ever #include *.c
Bitte keine C-Files includieren, das führt zu solchen Resultaten.
Deine struct gehört in die global.h (oder eine andere *.h).
Alle *.c #includes entfernen und deinen Compiler veranlassen, dass er
jedes einzelne C-File compiliert. Der Linker soll dann alles
zusammenbauen.
edit: und wenn jetzt die Frage kommt, wieso das so ist: Tutorial nochmal
von Anfang lesen (oder ein gutes C-Buch kaufen)
1. Schreibe [/c] statt [\c]
2. Schreibe "PI->" statt "(*PI)."
3. Poste kompletten Code, nicht Codefetzen
Zu 1. Das wird dann wesentlich lesbarer :-)
Zu 2. Einfach mit dem Editor global ersetzen, das passt schon.
Zu 3. Offenbar kennt das Modul, wo im IRQ-Handler TIM1->CCR2 zugewiesen
wird, Deine globale Definition nicht.
Sonstiges:
Warum übergibst Du überhaupt PI als Argument an PI_Regler(), wenn PI
global ist? Da kann PI_Regler() doch auch so drauf zugreifen.
Achtung: Wenn Du auf Elemente der Struct sowohl aus dem Hauptprogramm
als auch aus der ISR zugreifst, müssen diese volatile definiert werden.
Besser wäre wohl, in der ISR ein Flag zu setzen und dieses in der
Hauptschleife auszuwerten.
Als letztes:
1
//Regeldifferenz für nächsten Zyklus beschreiben
2
(*PI).delta_input_last_cycle=delta_input;
hat Null Effekt hinter einem unbedingten return-Statement.
Hallo Frank,
erst mal vielen dank...
Zu1: Uuups...sorry, klar mach ich
Zu2: Hab ich gemacht und sogar verstanden warum :-)
Zu3: Hier bin ich auf der Suche, aber leider noch ohne Erfolg :-(
Sonstiges: Warum ich das so mache? Die Erklärung ist m.E. nach einfach,
ich möchte den Regler für insgesamt 3 Motoren aufrufen, somit kann ich
unterschiedlche structs bei den mehrfachen Aufrufen verwenden, was bei
globaler Verwednung nicht möglich wäre...
Als letztes: Klar, totaler Knoten im Hirn...geändert
Cyblord -. schrieb:> Der Pfeiloperator (->) ist dir kein Begriff?
Mach es doch bitte einem Neuling nicht zum Vorwurf, daß er die vielen
Verschrobenheiten von C noch nicht auswendig kennt.
C als solches ist ein Problem, das wissen wir doch eigentlich.
W.S.