Divisionen optimieren

OP #6325598
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.
Angehängte Dateien:
Beitrag #6325638 wurde von einem Moderator gelöscht.
#6325833
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
Beitrag #6325903 wurde von einem Moderator gelöscht.
Beitrag #6325907 wurde von einem Moderator gelöscht.
#6326272
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%.
(Firma: Vescomp) #6327437
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?
OP #6327457
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.
Angehängte Dateien:
(Firma: Vescomp) #6327461
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.
Gast #6327464
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.
Angehängte Dateien:
Gast #6327473
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?
Gast #6327541
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.
#6327579
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.
#6327581
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.
#6327597
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
Gast #6327613
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!
#6327621
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 ?
Gast #6327676
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
Gast #6327865
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.
#6327924
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
Beitrag #6328133 wurde von einem Moderator gelöscht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren