(Regler) Richtig programmieren - KEIL uVision

Gast #4419965
Lesenswert?
• ▲
▼
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.
Angehängte Dateien:
Gast #4421492
Lesenswert?
• ▲
▼
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
Gast #4421549
Lesenswert?
• ▲
▼
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?
Gast #4421889
Lesenswert?
• ▲
▼
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.
Gast #4421942
Lesenswert?
• ▲
▼
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.