Forum: Mikrocontroller und Digitale Elektronik STM32F4/Atollic True Studio - Mathematisches Problem


von Dominic W. (Gast)


Lesenswert?

Hallo,

Wir arbeiten derzeit für die Uni an einem Projekt welches auf eine 
Lageregelung hinauslaufen soll.
Dazu freunden wir uns gerade mit den ADC Funktionen des STMF4 disovery 
boards an.
Testweise soll derzeit nur die Spannung an einem Poti eingelesen werden 
und ein PWM proportional dazu generiert werden.

Die einfach Grundformel dafür war:

"pwm=(adcvariable/Max)*100;"
wobei pwm und advariable double und Max eine preprozessorkonstante mit 
dem Bereich des ADCs ist.
Das funktioniert zufriedenstellend und deckt den PWM Bereich in etwa 
komplett ab.

Um jetzt den Bereich des PWMs zu verfeinern (eben in den 20-30% in denen 
auch tatsächlich geregelt werden soll)bzw das poti von linkem bis 
rechten Anschlag nur zB von 30-50% PWM laufen zu lassen haben wir diese 
Formel benutzt:

"pwm=(((adcvariable/(Max/(rangemax-rangemin)))+rangemin)/Max)*100;"

wobei rangemax und rangemin dann eben zB 30 und 50% von "Max" sind.

Gebe ich diese Formel nun so in den taschenrechner ein kommt dabei ein 
Sinnvolles ergebnis heraus. Bzw das exakt gleiche wenn rangemin 0 ist 
und rangemax = Max

In der Praxis hat der µC dann allerdings einen deutlich kleineren 
Bereich obwohl rangemax=max rangemin=0.

Kann mir jemand Tippsgeben was ich hier übersehen könnte bzw. wie die 
Formel auszusehen hat damit die Rechenschritte im Code korrekt 
abgearbeitet werden?

PS: Gibt es eine Möglichkeit mit Atollic True Studio live Werte zu 
monitoren?

Lg

von c-hater (Gast)


Lesenswert?

Dominic W. schrieb:

> Wir arbeiten derzeit für die Uni

Für welche?!

von Max H (Gast)


Lesenswert?

Sehr hilfreich.

von public (Gast)


Lesenswert?

Hallo Dominic,

magst du uns den ADC-Code zeigen? Wie holst du den Wert? Verwendest du 
Interrupts?

Mein erster Gedanke war eine Racecondition zwischen ADC-Wert verarbeiten 
und ADC-Wert holen. Mit anderen Worten während du den ADC-Wert 
verarbeitest wird dieser evtl. überschrieben.
Gibt es denn Timing kritische Sachen die in deinem Code vorkommen?

Also falls Interrupts an sind, schalte diese während der Verarbeitung 
aus.

Junge junge junge :-) man haben wir wenig Infos :-P

Gruß
public

von Michael O. (mischu)


Lesenswert?

Dominic W. schrieb:
> Gibt es eine Möglichkeit mit Atollic True Studio live Werte zu
> monitoren?

Ja, schalte doch mal den Debugger ein und halte den Code mit einem 
Brakepoint vor deiner Berechnung an. Dann kannst Du zweilenweise den 
Code debuggen...


Die vielen Divisionen sind auf einen uC nicht der Hit!
Rechnen in Floatingpoint ist OK, wandle Divisionen mit Konstante oder 
quasikonstanten in Multiplikationen mit dem Kehrwert um. 
Geschwindigkeitssteigerung um Faktor 20 möglich :).

Ich habe keine Ahnung wie schnell die einzelnen Programmteile laufen und 
was ihr da genau macht.
z.B. wenn der AD-Wandler mehrfach neue Ergebnisse liefert und ihr eine 
sehr langsame PWM Frequenz gewählt hat, so werden sicher Zwischenwerte 
verschluckt.

Baue doch mal einen Zähler, der von 0 bis MAX zählt und schreibe diese 
Werte in den PWM Block.

von egonotto (Gast)


Lesenswert?

Hallo,

nehmt doch eine einfachere Formel.

pwm = rangemin + (adcvariable/Max)*(rangemax-rangemin);

Bei adcvariable = 0 bekommt Ihr pwm = rangemin;
Bei adcvariable = Max bekommt Ihr pwm = rangemax;

Dazwischen ist die Funktion linear.

MfG
egonotto

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.