Hallo Leute, ich habe ein Problem und würde mich sehr freuen, wenn ich hier eine Hilfestellung finden würde. Ich will eine Strom- und Spannungsregelung realisieren. Die Sensordaten kommen in einem Mikrocontroller (Aduc7026) zusammen. Am Ende müssen diese beiden Regler zusammenarbeiten. Beide verstellen dasselbe Stellglied, also die 4 Schalter einer Vollbrücke. Geregelt wird über die Totzeit des PWM Signals, der die Schalter steuert. Die Strommessung kommt über den ADC von einem LEM Wandler. Also über eine Funktion zum Einlesen des entsprechenden Eingangspins kann man an die Daten kommen. Diese Daten kann man entsprechend umrechnen und an den Stromwert kommen. Die Spannungmessung kommt über GPIO als pulsweitenmodulliertes Signal, dessen Tastgrad abgetastet werden muss, um die Spannung zu bestimmen. Die Abtastung wird in einem Timer Interrupt gemacht, der etwa 100 mal pro Periode abtastet. Jetzt komme ich eben nicht weiter. Mal abgesehen davon, dass ich nicht weiß, ob ich die Messungen an den richtigen Stellen mache bzw. ob das die feine Art ist. Ob ich die Variablendeklarationen usw. alles an der richtigen Stellen vornehme. Also ob formal alles richtig ist, ohne näher auf den Inhalt einzugehen. Die Aufgabe ist einfach erklärt, der Regler, der die größere Totzeit errechnet, darf am Ende die Regelung übernehmen und der andere Regler muss warten. ( Für die, die es interessiert: Soll eine Strom- und Spannungsregelung nach der IU-Ladekennlinie werden. http://www.itwissen.info/bilder/iu-ladeverfahren-cccv-mit-konstantstrom-und-spannung.png ) Im Grunde müsste ich beide Regler rechnen lassen und am Ende eine if-Abfrage starten, um zu sehen, wer von beiden durch darf. Und dies immer wiederholen. (falls ich damit richtig liege ;D) Am liebsten würde ich die Ergebnisse beider Regler im while() über eine Funktion aufrufen und diesen Vergleich dort vornehmen und im while über den entsprechenden Register das passende Ausangssignal schicken. Doch sobald ich dies versuche z.B. die Messdaten, die im von der Spannungsregelung im Interrupt errechnet wurde über Variablen im while aufzurufen, kommen die roten Kreuze. Ich würde mich sehr freuen, wenn man mir als Laien zeigt, wo ich die Fehler mache bzw. ob dieses Vorhaben gelingen kann und was man beachten muss. Die Software habe ich hochgeladen. Ich habe eine andere Software als Basis für meine Software genutzt.
Da keine Antwort kam gehe ich mal davon aus, dass dies zuviel Text war. Ich versuche mal in Schnipseln zu fragen: Ich habe eine main.c. In der main.c habe ich eine while()-Schleife in der ich eine Funktion int ADC_einlesen(int) aus funktionen.c aufrufe und über den Rückgabewert Daten erhalte. In der funktionen.c habe ich auch eine Funktion int zyklus(). Diese Funktion wird mit einem Timer Interrupt immer wieder aufgerufen und berechnet was. Nach etwa 100 aufrufen verändert diese Funktion den Wert einer Variable "duty". Duty ist zu beginn mit duty = 100000 initialisiert. Wie kann ich den Wert aus der Variable Duty (funktionen.c) in der while-Schleife (main.c) aufrufen bzw. abspeichern? Immer wenn ich auf diese Variable zugreifen möchte kommt ein rotes X, was für einen Error steht. Muss man die Variable anders deklarieren? Ich habe die Variable Duty in funktionen.c als int variable deklariert. danke
Du musst die Variable in main.c mit extern deklarieren.
Thomas schrieb: > Du musst die Variable in main.c mit extern deklarieren. Danke, das hat geholfen. ich musste die extern variable, die ich in main.c deklariert habe auch in der projekt headerdatei eintippen, damit es in funktionen.c erkannt wurde. Wenn ich die "extern int" variable initialisiere, kommt dort eine warning. ist das nicht üblich, dass man eine extern in initialisiert?
Arthur schrieb: > Wenn ich die "extern int" variable initialisiere, kommt dort eine > warning. ist das nicht üblich, dass man eine extern in initialisiert? Nein, das ist falsch. extern ist nur eine Bekanntmachung das die Variable woanders definiert wurde. a.h extern int bar; a.c #include a.h int bar = 42; b.c #include a.h int foo = bar;
:
Bearbeitet durch User
Du kannst die Funktion zyklus auch so modifizieren, dass du ihr einen pointer übergibst. Dann kannst du dir das ganze extern-zeug sparen.
Gerald M. schrieb: > Du kannst die Funktion zyklus auch so modifizieren, dass du ihr > einen > pointer übergibst. Dann kannst du dir das ganze extern-zeug sparen. Pointer ;D. Ich glaube man sieht, dass ich kein Ass im programmieren bin. Und immer wenn ich Pointer in der Vorlesung gehört habe, habe ich eine Gänsehaut bekommen. Ich denke, ich bleibe erstmal bei "einfachen" Mitteln ;D.
Christian K. schrieb: > Arthur schrieb: >> Wenn ich die "extern int" variable initialisiere, kommt dort eine >> warning. ist das nicht üblich, dass man eine extern in initialisiert? > > Nein, das ist falsch. extern ist nur eine Bekanntmachung das die > Variable woanders definiert wurde. > > a.h > extern int bar; > > a.c > #include a.h > int bar = 42; > > b.c > #include a.h > int foo = bar; Danke, das scheint zu funktinieren. Ich habe aber vier mal folgendes Warning: funktionen.h(1): warning: #1295-D: Deprecated declaration zyklus - give arg types Was kann das bedeuten? Ich benötige die Funktion zyklus(). danke
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.