Forum: Mikrocontroller und Digitale Elektronik Simple #define Frage


von Simon (Gast)


Lesenswert?

Ich habe hier folgendes Macro eines PID Reglers.

Wie kann ich dieses Macro aufrufen?
z.B.

PID_MACRO(v.Ref = 100;)

und wie kann ich das ergenis dieses Macros wieder einer Funktion 
übergeben?

z.B.
set_PWM (v.Out);
1
#define PID_MACRO(v) \
2
v.Err = v.Ref - v.Fdb; /* Compute the error */ \
3
v.Up = v.Kp * v.Err; /* Compute Up */ \
4
v.Ui = v.Ui + v.Ki*v.Up + v.Kc*v.SatErr; /* Compute Ui */ \
5
v.OutPreSat = v.Up + v.Ui;
6
/* Compute pre-saturated output */ \
7
if (v.OutPreSat > v.OutMax) /* Saturate output */ \
8
{v.Out = v.OutMax;} \
9
else if (v.OutPreSat < v.OutMin) \
10
{v.Out = v.OutMin;} \
11
else \
12
{v.Out = v.OutPreSat;} \
13
v.SatErr = v.Out - v.OutPreSat; /* Compute saturate difference */ \
14
v.Up1 = v.Up;


Vielen Dank Jungs

von EAF (Gast)


Lesenswert?

Simon schrieb:
> und wie kann ich das ergenis dieses Macros wieder einer Funktion
> übergeben?

Was ist denn das Ergebnis des Makros?
Soweit mir bekannt haben Makros einen Return Wert.

von Simon (Gast)


Lesenswert?

Ich denke es ist v.Out

von EAF (Gast)


Lesenswert?

EAF schrieb:
> einen

keinen

von Fritte (Gast)


Lesenswert?

Simon schrieb:
> Wie kann ich dieses Macro aufrufen?
>
> PID_MACRO(v.Ref = 100;)
So nicht. Schau dir dein #define an.

> #define PID_MACRO(v) \
> v.Err = v.Ref - v.Fdb; /* Compute the error */ \

> und wie kann ich das ergenis dieses Macros wieder einer Funktion
> übergeben?

Das Macro liest und schreibt die übergebene Sturuktur.

Wie wärs mal mit "A Book on C"?

von Simon (Gast)


Lesenswert?

das wird irgendwie mit struct funzen denke ich.

wie ist den ein Macro zu verwenden das so deklariert ist?

#define PID_MACRO(v)

da muss ich doch irgendwie

struct v und dann kann man mit

v.Ref
v..... das irgendwie aufrufen

von EAF (Gast)


Lesenswert?

Simon schrieb:
> Ich denke es ist v.Out

Offensichtlich benötigst du eine korrekt "ausgefüllte" Struktur um das 
Makro darauf los zu lassen.
Das Makro zu einer Funktion umzubauen ist eher trivial.

von Stephan (Gast)


Lesenswert?

Anhand der gegebenen Informationen würde ich vermuten, dass das ‚v‘ im 
Macro eine Referenz zu einer definierten Struktur ist. Wie die Struktur 
aufgebaut ist, ergibt sich grob aus den Membernamen. Das steht aber 
bestimmt noch im Detail auf der nächsten Salamischeibe;)

Aufruf des Macros erfolgt dann via:

PID_MACRO(<struct>);

Das Ergebnis steht dann danach in <struct>.out

Warum das ein Macro und keine Funktion ist…?

von Stephan (Gast)


Lesenswert?

1
 PID_MACRO(<struct>);

von Simon (Gast)


Lesenswert?


von Stephan (Gast)


Lesenswert?

Die Quelle könnte z.B. das hier zu sein:

https://www.programmersought.com/article/53337498887/

Da ist auch die Strukturdefinition.

Da gibts aber mehrere Treffer - alles irgendwie hiervon abgeschrieben:

TI-Controlsuite: ./lib/DMClib/cIQmath/src/pid_reg3.c

Scheint das Wochenende ohne Quellenangaben zu werden:(

von Stephan (Gast)


Lesenswert?

Simon schrieb:
> Das ganze kommt von hier:
> 
https://www.egr.msu.edu/classes/ece480/capstone/fall10/group04/Barnhill,%20Mark%20-%20Application%20Note.pdf

Na, das passt ja.
Da haben dann alle bei der TI lib abgeschrieben (ohne jetzt das LitVerz 
der Arbeit geprüft zu haben).

Aber Simon hat ja jetzt alles an Info.

von PittyJ (Gast)


Lesenswert?

Es gibt eine Menge Beschreibungen zu PID Regler. Die Formeln sind 
einfach selber umzusetzen.

https://de.wikipedia.org/wiki/Regler
https://rn-wissen.de/wiki/index.php/Regelungstechnik


Es gibt die Umsetzung sogar vorgefertigt für den Arduino,

https://playground.arduino.cc/Code/PIDLibrary/

und der Sourcecode ist sogar kommentiert!

https://github.com/br3ttb/Arduino-PID-Library/blob/master/PID_v1.cpp


Warum verwendet man nicht so eine freie und kommentierte Software, 
sondern nimmt so ein krankes Macro? Dann versteht man das Macro noch 
nicht einmal und zum Schluss kommt nur Murks heraus.

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.