> Wie kommt man auf solche Tricks bzw. wie findet man solche
> Ersetzungen von Divisionen?
Indem man die Binärdarstellung der beteiligten Zahlen unter die Lupe
nimmt und darüber meditiert, was dies eigentlich bedeutet.
Ich würde schon den Spannungsbereich voll ausnutzen.
Dein Maximalwert bei 15,000V ist 32767, Du willst also 32767 nach 15000
umrechnen:
um 1 Bit nach rechts schieben --> 16383
um 4 weiter nach rechts schieben --> 1023 subtrahieren = 15360
um 2 weiter nach rechts schieben --> 255 subtrahieren = 15105
um 2 weiter nach rechts schieben --> 63 subtrahieren = 15042
um 1 weiter nach rechts schieben --> 31 subtrahieren = 15010
um 2 weiter nach rechts schieben --> 7 subtrahieren = 15003
um 1 weiter nach rechts schieben --> 3 subtranieren = 15000
oder
um 1 Bit nach rechts schieben --> 16383
um 4 weiter nach rechts schieben --> 1023 subtrahieren = 15360
um 1 weiter nach rechts schieben --> 511 subtrahieren = 14848
um 2 weiter nach rechts schieben --> 127 addieren = 14975
um 2 weiter nach rechts schieben --> 31 addieren = 15006
um 2 weiter nach rechts schieben --> 7 subtrahieren = 14999
um 2 weiter nach rechts schieben --> 1 addieren = 15000
bei ausreichend genauem Ergebnis kann man schon eher abbrechen,
z.B. nach der 4. Zeile.
Eine weiter Möglichkeit ist eine erweiterte Multiplikation:
und anschließendes Kürzen mit 2^17:
32767 * 60000 = 1966020000 / 131072 = 14999,542236328125
32767 * 60003 = 1966118301 / 131072 = 15000,292213439941
Das Kürzen um 2^17 ist einfach: Du nimmst das Upper-Word des
Mult-Ergebnisses und schiebst es um eins nach rechts.
Wenn Du runden willst, merkst Du dir das bit0 der Mult und addierst es
zum Ergebnis.
Dieses Vorgehen hat den Vorteil, dass 60003 der Kalibrierfaktor ist.
Stimmt Dein Spannungsteiler nicht exakt, kannst Du das mit diesem Faktor
kompensieren.
Auch eine Temperaturkompensation ist damit möglich, z.B. mit
LookUp-Table.
Eine schnelle 32x32-->64-Bit Mult findest Du z.B. hier:
Beitrag "Re: Rechnen mit AVR"
Weiter unten auch in AVR-asm.