Forum: Mikrocontroller und Digitale Elektronik (Regler) Richtig programmieren - KEIL uVision


von Arthur (Gast)


Angehängte Dateien:

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.

von Arthur (Gast)


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

von Thomas (Gast)


Lesenswert?

Du musst die Variable in main.c mit extern deklarieren.

von Arthur (Gast)


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?

von Christian K. (the_kirsch)


Lesenswert?

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
von Gerald M. (gerald_m17)


Lesenswert?

Du kannst die Funktion zyklus auch so modifizieren, dass du ihr einen 
pointer übergibst. Dann kannst du dir das ganze extern-zeug sparen.

von Arthur (Gast)


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.

von Arthur (Gast)


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

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.