Berechnung ohne Gleitkomma

#2030689
Lesenswert?

Lehrmann Michael schrieb:
> http://www.mikrocontroller.net/articles/Festkommaarithmetik
>
> Karl heinz Buchegger schrieb:
>> 5 mal 10 hoch 5, ist 50000
>> geht doch noch wunderbar in einen unsigned int hinein.
>
> Sorry Meister ab ich glaub da fehlt eine 0 wenn ich das richtig sehe.

Ich hätte doch auf meine Finger vertrauen sollen beim zählen :-)
Hast natürlich recht.

* auf long ausweichen
* Oder freq vorher durch 10 dividieren

Hängt jetzt davon ab, wieviel Fehler man sich erlauben kann/darf und 
welche Werte freq so annehmen wird.
#2030711
Lesenswert?

Hi, danke für die Antworten.

ich will eine Funktion machen, der eine Frequenz in Hz (freq) übergeben 
wird und daraus die nötigen Registerwerte für die PWM berechnet. Das PWM 
Signal ist nur für einen Summer, also muss nicht sonderlich genau sein.

Zuerst hatte ich es ohne (long) und habe mich gewundert, dass er dafür 
die Gleitkommabib braucht.

Jetzt habe ich es so:
PR2 =  (uint8_t)(( (long)5e5 / freq ) - 1 );

Geht es noch platzsparender?
#2030989
Lesenswert?

Martin S. schrieb:
> Hi, danke für die Antworten.
>
> ich will eine Funktion machen, der eine Frequenz in Hz (freq) übergeben
> wird und daraus die nötigen Registerwerte für die PWM berechnet. Das PWM
> Signal ist nur für einen Summer, also muss nicht sonderlich genau sein.
>
> Zuerst hatte ich es ohne (long) und habe mich gewundert, dass er dafür
> die Gleitkommabib braucht.
>
> Jetzt habe ich es so:
> PR2 =  (uint8_t)(( (long)5e5 / freq ) - 1 );
>
> Geht es noch platzsparender?

Wenn du alle Zahlen durch 16 dividierst, wird es kleiner und schneller, 
vorausgesetzt freq ist unsigned int. Wenn nicht, castest du es zurecht.

  uint16_t tmp = ((uint16_t)freq) / 16;
  PR2 = 31250U / tmp - 1;

Wenns sowieso nicht so genau sein muss.
Gast #2031061
Lesenswert?

Und bedenke, daß dein Wert freq nicht kleiner sein darf als 500000/256 
also etwa 2000 da sonst das uint8_t Ergebnis überläuft.
Bedenke ebenfalls daß bei hohen Frequenzen die Auflösung ziemlich klein 
ist.
Für 450000 kriegst Du das selbe Ergebnis wie für 260000, nämlich 1.
Gast #2031262
Lesenswert?

Karl-Heinz, warum kürzt Du mit 16, wenn 8 auch reicht?

PR2 = 62500U / (((uint16_t)freq/8) - 1);//mit 8 gekürzt für 
16bit-Division

Vermutung: die Float-Lib hat er geladen, da der das 5e5 gesehen hat, 
hättest Du 500000L geschrieben, würde er die long-Div verwenden.

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