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
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.
(gdb) p 1190200 / 83968.0 $1 = 14.174447408536585 (gdb) p 1190200 / 83968.0 * 16 $2 = 226.79115853658536
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
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.
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%.
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.
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?
@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.
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.
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.
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?
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.
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.
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.
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
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!
> 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 ?
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
Es gilt wieder mal das alte Sprichwort: "Tue Niemand Gutes, dann geschieht Dir nichts Böses"
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.
Tolle Tool! Hab das hin und wieder von Hand machen müssen. Hast Du schon an einer online (Java-Script) Version überlegt?
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.
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.
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
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.