mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik mit AVR90 oder Mega logarithmus rechnen


Autor: Emppu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich möchte gerne ein Pegelmessgerät basteln und um das zu machen muss
ich den Wert aus dem ADC in einen Log Wert umwandeln und dann in
Dezibel ausgeben - hat wer ein Unterprgramm das LOG10 rechnen kann?

Autor: Gerd Laschinski (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In welcher Sprache auf welchem Prozessor?

Gerd

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Rechnerei allein nutzt Dir vermutlich nichts, wenn Du den internen
ADC nehmen willst. 10 Bit entsprechen etwa 60dB.

Autor: Gerd Laschinski (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh, Prozessor übersehen.
Ich habe vor langer Zeit mal ein Basic-Programm geschrieben, das den
Logarithmus berechnet. Ich habe den Kommentar dazu rauskopiert:

' Ln(x) berechnet den natürlichen Logarithmus nach:
' ln(1-y) = -(y + y^2/2 + y^3/3 + ... + y^n/n + ...)  mit  y = 1 - x
'
' Der Logarithmus ln(x) wird in
' ln(x) = ln(x'*2^m) = ln(x') + m*ln(2)  mit  1.5>=x'>=0.5, m
ganzz.
' umgeformt, um eine schnelle Konvergenz der Reihe zu gewährleisten.
'
Damit geht das eigentlich recht einfach.

Gruß
Gerd

Autor: Barti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn man C nutzt, dann kann man auch die math.h einbinden. Allerdings
sei vorher gesagt, dass die Berechnung des Logarithmus viel Speicher
und Rechenzeit in Anspruch nimmt. Je nachdem wie genau man das
berechnet. Hab mal was mit ner Exponentialfunktion auf nem 2313
berechnen wollen. Naja der Speicher war danach fast voll(Programm in C
geschrieben).

MfG Barti

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenns nicht supergenau sein muß, dann kann man den dualen Logarithmus
ganz schnell durch Rechtsschieben und Mitzählen bis <2 ermitteln
(Vorkommastelle).
Die Nachkommastelle ist dann der 8Bit Rest.
Bzw. etwas genauer, den Rest als Zeiger auf eine Tabelle (256 Byte) mit
der Nachkommastelle nehmen.

Dann noch eine Multiplikation und schon hat man den dekadischen
Logarithmus.


Peter

Autor: Guenter Bittner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Emppu,

eine einfache Programm-Lösung zur Berechnung von "log10"
wäre die Verwendung des Tschebyscheff-Polynoms. Die von
dir gesuchte C-Funktion würde in der Praxis dann so aus-
sehen:


double log10(double x)
{
  double y, q, quad;
  int i;

  if (x <= 0.0) return(0.); /* Error! */
  i = 0;
  while (x < 1.0 ) {
    x *= 10.0;
    i--;
  }
  while (x > 10.0) {
    x *= 0.1;
    i++;
  }
  q = (x - 3.16227766) / (x + 3.16227766); quad = q * q;
  y = ((((.191337714 * quad
        + .094376476) * quad
        + .177522071) * quad
        + .289335524) * quad
        + .868591718) * q + .5;
  y += (double) i;
  return(y);
}

Viele Grüße und viel Erfolg

  Günter

Autor: Marius Schmidt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein 8 bit Prozessor wird sich auf jeden fall riesig über die ganze
Fließkomma-arithmetik freuen.

Autor: Santa Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ein 8 bit Prozessor wird sich auf jeden fall riesig über die ganze
>Fließkomma-arithmetik freuen.

Das ist wohl wahr, aber kennst Du eine bessere Alternative?

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

je nach Auflösung des ADC (bzw. wirklich benötigter Auflösung) und
verfügbarem Programmspeichers kann sich eine Lookup-Tabelle lohnen.

Matthias

Autor: Arno H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum nicht die Pegelerfassung gleich mit einem logarithmischen
Gleichrichter durchführen. Bei AD gibt es welche von Gleichstrom bis
fast 3GHz. Am Ausgang steht eine dB- lineare Gleichspannung an.
Ansonsten geht nämlich wirklich die Dynamik in de Keller. Wie oben
schon geschrieben sind 10 Bit ca 60 dB Dynamikbereich und pro Bit gehts
6dB rauf und runter.
Arno

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Ein 8 bit Prozessor wird sich auf jeden fall riesig über die ganze
Fließkomma-arithmetik freuen."


Na und ?

Für den Menschen sind Ausgaben >5Hz (200ms) Unsinn (nicht ablesbar) und
ein AVR schafft das bischen float in 200ms doch spielend und legt sich
obendrein noch ein Weilchen schlafen.

Oder den float in long umwandeln und dann meine Methode nehmen, dann
ist der AVR fast nur noch am schlafen.


Man muß immer nur so schnell rechnen können, wie nötig !


Übrigens kann man sehr wohl mit einem 10Bit-ADC eine Bereich von 10^6
überstreichen, wozu hat der denn 8 Eingänge.

Ich hab einfach mehrere OPVs davorgeschaltet (Verstärkung 1, 10, 100
und 1000) und bei Übersteuerung wird einfach auf den nächsten Eingang
umgeschaltet.


Peter

Autor: Santa Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Oder den float in long umwandeln und dann meine Methode nehmen,

Daran dachte ich auch schon.  Die (wohlbekannte) Idee, long als
*Fest*kommazahl zu "mißbrauchen", könnte auch hier in der Tat
interessant sein.

>Übrigens kann man sehr wohl mit einem 10Bit-ADC eine Bereich von 10^6
>überstreichen, wozu hat der denn 8 Eingänge.
>Ich hab einfach mehrere OPVs davorgeschaltet (Verstärkung 1, 10, 100
>und 1000) und bei Übersteuerung wird einfach auf den nächsten Eingang
>umgeschaltet.

Da mußt Du aber zugeben, daß das schon verflucht tricky ist! g

Autor: dds5 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sicher ist das tricky, aber durch solche Ideen (und einiges andere mehr)
zeichnet sich eben ein guter Entwickler aus.

Dieter

Autor: Arno H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@peter danegger
Das dürfte aber Frequenzprobleme bei den höheren Verstärkungen ergeben
und Du vergrößerst zwar den Eingangsbereich spannungsmäßig aber die
relative Auflösung bleibt trotzdem die gleiche, denn sobald einer der
Verstärker in die Sättigung geht ist dessen Auflösung weg.
Arno

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.