Forum: Mikrocontroller und Digitale Elektronik Divisionen optimieren


von Chrud (ruder)


Angehängte Dateien:

Lesenswert?

Hallo zusammen

Der FPA Solver ist ein kleines Windows-Programm um Divisionsrechnungen 
zu optimieren.
Er berechnet alternative Brüche welche immer eine 2er Potenz im Divisor 
haben und zeigt auch den absoluten Fehler an.

Anwendungsbeispiel:
Ich möchte mit einen Mikrocontroller eine Spannung von 0..~15V messen 
und auf einem Display anzeigen. Dafür habe ich am Mikrocontroller einen 
Spannungsteiler mit Rt = 10kOhm und Rb = 820Ohm. Als Referenz nutze ich 
1.1V.
Um nun den Spannungswert in mV zu erhalten rechne ich wie folgt:

V = ADC * (Vref * (Rt + Rb)) / (Rb * 1024)
V = ADC * (1100mV * (10kOhm + 820Ohm)) / (820Ohm * 1024)
V = ADC * 11902000 / 839680
V = ADC * 1190200 / 83968

Dank C-Compiler ist diese Berechnung einfach auch auf kleinen 8-bit 
Mikrocontrollern möglich. Sie ist aber sehr rechenintensiv.

Mit FPA Solver werden "optimiere" Dividenden und Divisoren berechnet. 
Dadurch sollen die Berechnungen auf dem Mikrocontroller vereinfacht und 
schneller ausgeführt werden.
Das obige Beispiel kann z.B. wie folgt vereinfacht werden:

V = ADC * 227 / 16

Durch diese Vereinfachung hat man jetzt zwar einen Fehler von 0.1% im 
Resultat. Aber angesichts der Toleranzen von Widerständen, 
Spannungsreferenzen u.s.w. kann man den zusätzlichen Fehler oft 
vernachlässigen.

FPA Solver berechnet alternative Brüche von 2^0 bis max. 2^16. Ist der 
absolute Fehler kleiner wie 1ppm (0.000001%) wird die Berechnung 
vorzeitig abgebrochen.

: Bearbeitet durch User
von Cyblord -. (cyblord)


Lesenswert?

Dafür nehme ich immer Wolfram Alpha.

von Michael Gugelhupf (Gast)


Lesenswert?

Was verwendest du zur Berechnung? Kettenbrüche?

von Dieter R. (drei)


Lesenswert?

Hübsch. Hab ich sonst gelegentlich zu Fuß mit Abschätzen und 
Taschenrechner gemacht. So ist das einfacher.

Beitrag #6325638 wurde von einem Moderator gelöscht.
von Uwe Bonnes (Gast)


Lesenswert?

(gdb) p 1190200 / 83968.0
$1 = 14.174447408536585
(gdb) p 1190200 / 83968.0 * 16
$2 = 226.79115853658536

von Dominic A. (neo123)


Lesenswert?

Cyblord -. schrieb:
> Dafür nehme ich immer Wolfram Alpha.

Tatsächlich? Wie kann man dieses Problem mit Wolfram berechnen?
Ich finde dazu nichts.

Grüsse

von Cyblord -. (cyblord)


Lesenswert?

Dominic A. schrieb:
> Cyblord -. schrieb:
>> Dafür nehme ich immer Wolfram Alpha.
>
> Tatsächlich? Wie kann man dieses Problem mit Wolfram berechnen?
> Ich finde dazu nichts.
>
> Grüsse

Ich nutze diese Formel:

solve x=(((y/100)/(10000+z)*z)*1024)/3.3 for y where z=1000

Hier wird der Bruch berechnet für einen 10k/1k Spannungsteiler. 
Referenzspannung 3,3V. 10 Bit ADC. Und das Ergebnis soll in 1/100 V 
ausgegeben werden.

Ergebnis: (1815 x)/512

: Bearbeitet durch User
Beitrag #6325903 wurde von einem Moderator gelöscht.
Beitrag #6325907 wurde von einem Moderator gelöscht.
von Pandur S. (jetztnicht)


Lesenswert?

Allenfalls sollte man vorher festlegen mit wievielen Bits das Ganze 
laufen soll. Ich rechne Regelungsgeschichten jeweils mit 32 bit, da der 
ADC auch schon 24 Bit bringt. Strom und Spannung mit jeweils 10 Bit. 
Wenn ich Strom und Spannung als Kontrollgroessen messe und Anzeige 
reichen mir 5%.

von mIstA (Gast)


Lesenswert?

Ist ja ein ganz nettes Tool, keine Frage. Aber für etwas so triviales 
eine .exe unbekannter Herkunft ausführen, das muß eigentlich wirklich 
nicht sein.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Christian R. schrieb:
> Mit FPA Solver werden "optimiere" Dividenden und Divisoren berechnet.
> Dadurch sollen die Berechnungen auf dem Mikrocontroller vereinfacht und
> schneller ausgeführt werden.
> Das obige Beispiel kann z.B. wie folgt vereinfacht werden:
>
> V = ADC * 227 / 16

 Und 1190200 / 83968 ergibt 14.174. Mal 1024 ergibt 14514 und
 außer ADC-Wert ändert sich da nix.
 ADC hat 10-16 bits, AVR schafft eine 16x16 Multiplikation in
 etwa 25-30 Takten, Division mit 1024 dauert nochmal 6 Takte.
 Braucht ungefähr 2,25us und etwa 40 Bytes.
 Was, wie und wozu willst du da noch optimieren?

von Chrud (ruder)


Angehängte Dateien:

Lesenswert?

@MistA: Das eine exe-Datei ein gewisses Vertrauen beim Ausführen 
voraussetzt und von dem her nicht ideal ist, ist mir bewusst. Das 
Programm habe ich auch primär für mich geschrieben. Ich dachte dann 
aber, dass es vielleicht auch andere nutzen wollen, speziell da ich auf 
die Schnelle im Internet nichts Vergleichbares gefunden hatte (und 
deshalb das Programm schrieb). Die Nutzung bleibt ja freiwillig...

@Marc V.: Mit all den Vorschlägen die das Programm ausgibt, kann man 
aber auch noch entscheiden, ob man alles in einer 8, 16 oder 32-bit Zahl 
rechnen kann um die notwendige Genauigkeit zu erhalten. Natürlich holt 
man ab einem bestimmten Punkt nicht mehr viel raus.
Des Weiteren war ja das Beispiel nur die Umrechnung von ADC-Werten. Es 
gibt vielleicht eine Anwendung oder Controller/Prozessor-Architektur, 
bei der es dann irgendwann mal kritisch wird.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Christian R. schrieb:
> Es
> gibt vielleicht eine Anwendung oder Controller/Prozessor-Architektur,
> bei der es dann irgendwann mal kritisch wird.

 Das kann selbstverständlich sein, hier geht es aber um einen variablen
 und einen festen Wert und da soll man schon vorher überlegen was
 schneller ist - z.B. eine binäre Division mit 8 dauert in Software
 länger als eine Division mit 1024 - von 32 oder 64 gar nicht zu 
reden...

Beitrag #6327463 wurde von einem Moderator gelöscht.
von A. S. (Gast)


Angehängte Dateien:

Lesenswert?

Christian R. schrieb:
> Das eine exe-Datei ein gewisses Vertrauen beim Ausführen
> voraussetzt und von dem her nicht ideal ist, ist mir bewusst.

Dann alternativ als exCeL statt exe

Was mir dabei auffällt: Eventuell ist das Vorzeichen des Fehlers 
interessant. Hab ich darum beim Excel-File nicht rausgenommen.

Auch das Hinschreiben als Ganzzahlbruch habe ich mir gespart, da es ja 
nicht auf Ganzzahlbrüche beschränkt sein sollte.

von mh (Gast)


Lesenswert?

A. S. schrieb:
> Christian R. schrieb:
>> Das eine exe-Datei ein gewisses Vertrauen beim Ausführen
>> voraussetzt und von dem her nicht ideal ist, ist mir bewusst.
>
> Dann alternativ als exCeL statt exe

Und welchen Vorteil hat eine unbekannte xlsx gegenüber einer unbekannten 
exe?

von m.n. (Gast)


Lesenswert?

Christian R. schrieb:
> Durch diese Vereinfachung hat man jetzt zwar einen Fehler von 0.1% im
> Resultat. Aber angesichts der Toleranzen von Widerständen,
> Spannungsreferenzen u.s.w. kann man den zusätzlichen Fehler oft
> vernachlässigen.

Wem nutzt denn diese vermeintliche Vereinfachung? Niemandem!
Einen Rechenfehler von 0,1% finde ich unakzeptabel. Die Widerstände 
haben nicht die angegebene Genauigkeit, und daß Vref genau 1,1 V sein 
soll, ist doch sehr optimistisch. (Die interne Vref eines ATmega328 
liegt im Bereich 1,0 - 1,2 V.)
Und für jede Änderung an der Schaltung soll dann wieder eine neue 
"Optimierung" gestartet werden? Das ist Technik von gestern. Da kann man 
die Widerstände auch gleich durch ein Kohleschichtpoti ersetzen und 
solange daran drehen, bis es passt.

Wenn man es nicht lassen kann, dann rechnet man mit int32_t. Wer 
lösungsorientiert programmiert rechnet mit float. Das erledigt ein AVR8 
mit 16 MHz in < 100 µs. Die Konstanten für die Umrechnung kann sich der 
µC selber aus Vin-min und Vin-max errechnen und im EEPROM hinterlegen.

von Pandur S. (jetztnicht)


Lesenswert?

Nein. Eben wer loesungsorientiert arbeitet benutzt float nicht. Resp nur 
zu Anzeigezwecken. Bedeutet vielleicht 3 mal pro Sekunde. Die Zahlen 
muessen kontinuierlich und repetierbar sein. Aber ob eine Spannung zur 
trivialen Anzeige ein paar Prozent daneben ist, ist egal. Welcher 
Anwender kann sich etwas unter Volt oder Ampere vorstellen ? Man muss 
einfach sehen koennen, dass etwas passiert. Etwas besser aufgeloest wie 
eine Balkenanzeige.

Ich bau zB Temperaturregelungen fuer industrielle und wissenschaftliche 
Zwecke. Repetierbarkeit und Stabilität 0.01 Grad, absolute Genauigkeit 
vielleicht 2 Grad.

von Matthias S. (matthias_s)


Lesenswert?

mh schrieb:
> A. S. schrieb:
>> Christian R. schrieb:
>>> Das eine exe-Datei ein gewisses Vertrauen beim Ausführen
>>> voraussetzt und von dem her nicht ideal ist, ist mir bewusst.
>>
>> Dann alternativ als exCeL statt exe
>
> Und welchen Vorteil hat eine unbekannte xlsx gegenüber einer unbekannten
> exe?

xlsx kann keine Macros enthalten. Lediglich xlsm oder eben xls. Von 
daher kein Problem.

von Achim M. (minifloat)


Lesenswert?

m.n. schrieb:
> Einen Rechenfehler von 0,1% finde ich unakzeptabel. Die Widerstände
> haben nicht die angegebene Genauigkeit, und daß Vref genau 1,1 V sein
> soll, ist doch sehr optimistisch. (Die interne Vref eines ATmega328
> liegt im Bereich 1,0 - 1,2 V.) Und für jede Änderung an der Schaltung
> soll dann wieder eine neue "Optimierung" gestartet werden? Das ist
> Technik von gestern.

Ich mache ohne FPU alles in fractional (meist 16bit) 
Festkommaarithmetik. Gerade wenn du weißt, dass dein ADC eh nur 1024 
counts hat, genauer als die von dir genannten 0,1% werden es nie!

m.n. schrieb:
> Das erledigt ein AVR8 mit 16 MHz in < 100 µs.

Lustig, wenn man eine PWM mit einer Regelschleife von > 10kHz befeuern 
will. Und du hast da gerade mal eine einzige Operation durchgeführt.

m.n. schrieb:
> Die Konstanten für die
> Umrechnung kann sich der µC selber aus Vin-min und Vin-max errechnen und
> im EEPROM hinterlegen.

Ich lass' den Präprozessor alle Konstanten ausrechnen und spare mir den 
EEPROM für wichtigeres.

mfg mf

: Bearbeitet durch User
von m.n. (Gast)


Lesenswert?

Joggel E. schrieb:
> Aber ob eine Spannung zur
> trivialen Anzeige ein paar Prozent daneben ist, ist egal.

Gut, soviel Bescheidenheit ist heutzutage sehr selten.

Achim M. schrieb:
> Gerade wenn du weißt, dass dein ADC eh nur 1024
> counts hat, genauer als die von dir genannten 0,1% werden es nie!

Mein ADC hat 20 Bit. Was machen wir denn nun?

Achim M. schrieb:
> Ich las's den Präprozessor alle Konstanten ausrechnen und spare mir den
> EEPROM für wichtigeres.

Alles klar!

von Pandur S. (jetztnicht)


Lesenswert?

> Lustig, wenn man eine PWM mit einer Regelschleife von > 10kHz befeuern
will. Und du hast da gerade mal eine einzige Operation durchgeführt.


Bedeutet nicht dass man jeden Wert so schnell gerechnet haben muss. 
Welche Regelstrecke hat eine Regelbandbreite, bedeutet die zu regelnde 
Dynamik ist so schnell, von > 10kHz ? Und das soll mit einem PWM 
geregelt werden ? Wie schnell muss der denn sein ?

von A. S. (Gast)


Lesenswert?

M.E ist der echte Einsatz des Tools unnötig, weil ja die Obergrenze des 
Fehlers relativ klar ist: +- ein halbes Digit. Wenn also der Faktor im 
Bereich 1 bis 2 liegt, dann reichen 128 für +- 0,5% Fehler. Bei 100 bis 
200 braucht man keinen divisor und bei 0,01 bis 0,02 entsprechend 13 
oder 14 Bit. Und den genauen Wert im Zähler rechnet man einmal zum 
Startup oder bei der Kalibrierung mit double, float oder trickreicher 
Festpunkjonglage

von Es ist also, wie es immer ist (Gast)


Lesenswert?

Es gilt wieder mal das alte Sprichwort:
"Tue Niemand Gutes, dann geschieht Dir nichts Böses"

von A. S. (Gast)


Lesenswert?

Es ist also, wie es immer ist schrieb:
> Es gilt wieder mal das alte Sprichwort:
> "Tue Niemand Gutes, dann geschieht Dir nichts Böses"

Das kann man auch anders herum sehen: so langsam wird klar, warum es das 
bisher noch nicht gab. Wie viele Entdeckungen, Ideen, Projekte, die 
hätten einschlagen müssen. Und am Ende doch nur ein Schritt auf dem Weg 
des eigenen Verstehens waren.

von Yam (Gast)


Lesenswert?

Tolle Tool! Hab das hin und wieder von Hand machen müssen.
Hast Du schon an einer online (Java-Script) Version überlegt?

von Martin (Gast)


Lesenswert?

A. S. schrieb:

>> "Tue Niemand Gutes, dann geschieht Dir nichts Böses"

> Das kann man auch anders herum sehen: ...

Dir geschieht nichts Böses, wenn du niemanden etwas Gutes tust.

Nebenbei: A. S. hast du einfach nicht verstanden.

von m.n. (Gast)


Lesenswert?

Martin schrieb:
> Nebenbei: A. S. hast du einfach nicht verstanden.

Das Gegenteil ist der Fall. A.S. hat das Problem sehr wohl erkannt:
"Und am Ende doch nur ein Schritt auf dem Weg des eigenen Verstehens 
waren."

Der TO geht von der Annahme aus, daß die Skalierung eines ADC-Wertes 
eine rechenintensive Aktion sei. Das ist aber überhaupt nicht der Fall.
Zu Zeiten von 6502, Z80 oder 8051 mit ihren niedrigen Taktfrequenzen 
wäre dieses Vorgehen eine Option gewesen. Seinerzeit gab es als Lösung 
ein Poti für die Skalierung und ein Poti für den Offset. Das hat 
"massiv" Rechenzeit gespart.
Und natürlich mußte Vref einen Wert von 2,048, 5,12 oder 10,24 V haben 
;-)

Vielleicht hat der TO ja ein anderes Beispiel, wo die gewünschte 
Beschleunigung notwendig zu sein scheint. Aber dem Compiler die Arbeit 
abnehmen zu wollen, ist keine gute Idee.

von Achim M. (minifloat)


Lesenswert?

Joggel E. schrieb:
>> Lustig, wenn man eine PWM mit einer Regelschleife von > 10kHz befeuern
>> will. Und du hast da gerade mal eine einzige Operation durchgeführt.
>
>
> Bedeutet nicht dass man jeden Wert so schnell gerechnet haben muss.
> Welche Regelstrecke hat eine Regelbandbreite, bedeutet die zu regelnde
> Dynamik ist so schnell, von > 10kHz ? Und das soll mit einem PWM
> geregelt werden ? Wie schnell muss der denn sein ?

Och, ich denke da zum Beispiel an einen BLDC. Beispiel: Der soll 4000rpm 
drehen können, ist dreiphasig, hat eine Polpaarzahl 6. Habe also 
66,7/sec mechanisch bzw. 400/sec elektrisch zu stemmen. Bei 10kHz und 
jeden Zyklus die Regler rechnen zu lassen, hast du 25 Taskzyklen pro 
elektrischer Umdrehung.
Klingt nach wenig, ist es auch.

mfg mf

von Achim M. (minifloat)


Lesenswert?

PS. Nachsatz wegen Bandbreitenthema. Der Regler-Rechenzyklus muss um 
Faktor 5 bis 10 schneller sein, als die Sprungantwort, die man haben 
möchte. Einen der Ströme in 1..2msec eingeregelt zu haben, ist jetzt 
auch nicht wahnsinnig schnell, oder?

von foobar (Gast)


Lesenswert?

Wenn es für z.B. eine Regelschleife schnell gehen soll, kann man auch 
einmalig den Sollwert in den antspr ADC-Wert umrechnen und dann damit 
vergleichen - null Rechnenerei im fast path.

von Achim M. (minifloat)


Lesenswert?

foobar schrieb:
> Sollwert in den antspr ADC-Wert umrechnen

Genau das meine ich. Wenn du dazu left-adjusted ADC-Werte nimmst, ist es 
fractional integer Arithmetik. Beim BLDC kommt noch hinzu, die Sollwerte 
ebenfalls erst zu errechnen... Wo käme ich da mit 100μsec nur hin?

mfg mf

Beitrag #6328133 wurde von einem Moderator gelöscht.
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.