Geschwindigkeitsermittlung

Christian Gudrian wrote:

Es gibt aber auch die
Möglichkeit, per Taylor eine genauere Ermittlung zu erzielen:
Was meinst du mit "genauer"? Genauer als absolut genau geht doch wohl
nicht, oder?
 
"Christian Gudrian" <Christian.Gudrian@gmx.de> wrote in
news:bmpo7n$82j$03$1@news.t-online.com:

Ich arbeite mit einem C504 von Infineon (8052-Derivat). Getaktet
mit 24MHz, 2 Millionen Prozessorzyklen pro Sekunde. Ich lese 1000
Mal pro Sekunde drei analoge Messwerte ein, berechne die
Regelabweichung und schalte sechs Ventile.
Aha da haben wir ja mal was praktisches. Also dein digitaler
Differenzierer wird umso genauer, je höher die Auflösung Deines ADC ist
(also nimm 24bit :). Dann kannst Du die Aulösung auch dadurch erhöhen,
indem du nicht 1000 mal abtastest, sondern z.B. 128,000 mal.
Dem Eingangssignal sollte man ein kleines gaussches Rauschen
dazuaddieren (wenn das nicht schon da ist), in der Größenordnung von
1 LSB. Dann nimmst du das Signal und leitest es durch ein Filter.
Im einfachsten Falle einfach eine Mittelwertbildung (summiere 128 Werte
und teile die dann durch 128) damit hast du dann wieder 1000Sps aber
128stel Auflösung. Das muesste Dein Controller eigentlich schaffen
(reine Integeraddition). Du kannst die Nachverarbeitung einfach mit
diesem Integerwert durchführen und erst ganz am Schluss per Fliesskomma
weiterarbeiten. Letzlich ist es aber auch eine Frage, wie genau
(wirklich linear und analog?) Dein Wegaufnehmer ist, egal ob du nun
analog oder digital differenzierst.

M.
--
Bitte auf mwnews2@pentax.boerde.de antworten.
 
per Taylor eine genauere Ermittlung zu erzielen:

v(t) = (x(t)-4*x(t-deltaT)+3*(t-2*deltaT))/(2*deltaT)

Zum Beispiel.
Taylor ? Ich würde das Ding ein FIR-Filter nennen,
aber es ist tatsächlich Geschmackssache.
Handelsübliche Formeln finden sich unter:
http://www.embeddedFORTH.de Heft 6
Wer noch längere will muß entweder ein geeignetes
FIR Entwurfsprogramm anwerfen oder Koeffizientensätze
aus der Literatur zusammensuchen. Rekordverdächtige
Differenzierer mit z.B. 512 Taps wurden früher gerne
publiziert. Kann bei Bedarf welche kopieren.
Warum nimmt man längliche FIRs statt nur die Differenz
von 2 Samplen zu bilden ? Offensichtlich weil ein
Differenzierer Rauschen verstärkt und man dieses
wegmitteln möchte.

MfG JRD
 
"Christian Gudrian" <Christian.Gudrian@gmx.de> wrote in
news:bmqti1$842$02$1@news.t-online.com:


300.000 Multiplikationen, 299.000 Additionen und 3.000 Divisionen
(alles in mindestens 16-Bit) pro Sekunde sind aber auch nicht ohne.
16 Bit Divisionen lassen sich nicht auf 8 Bit Divisionen zurückführen und
dauern daher sehr lange.
Man kann u.U. die Formel umstellen und so günstiger wegkommen, nur
Divisionen durch 2, 4, .. oder 256 (letztes Byte weglassen) zulassen oder
nur die wirklich relevanten Teile eines Ergebnisses berechnen (z.B. 16 Bit
* 16 Bit nur die oberen 12 Bit wenn es auf einen 12 Bit DAC geht).

Gruß
Martin
 
Rafael Deliano wrote:

Warum nimmt man längliche FIRs statt nur die Differenz
von 2 Samplen zu bilden ?
Das würde mich mal interessieren.

Offensichtlich weil ein
Differenzierer Rauschen verstärkt und man dieses
wegmitteln möchte.
Ähem.. Das erreicht man doch genauso (bloß mit viel weniger
Rechenaufwand), indem man einfach nur jedes nte Sample (n>1) zur
Differenzbildung verwendet, oder?
 
Heiko Nocon <Heiko.Nocon@gmx.net> wrote in message news:<njf2pv01i8ehq0s6d9bllnr84k78uk9rq7@4ax.com>...
Christian Gudrian wrote:

Es gibt aber auch die
Möglichkeit, per Taylor eine genauere Ermittlung zu erzielen:

Was meinst du mit "genauer"? Genauer als absolut genau geht doch wohl
nicht, oder?
Was ist genauer als absolut? Glaubst du wenn du mit einem ADC zwei
Werte sampelst das ist die absolute Genauigkeit, vieleicht weil es
digital ist?

Wenn du einen Werte sampelst ist der immer ungenau, ADC Fehler,
Signalrauschen etc. Wenn man 2 Werte sampelt und die Differenz bildet
hat man im extrem Fall einmal den Fegler in die eine und einmal in die
andere Richtung gemessen. Die Differenz hat dann einen Fehler von 2 x
F, mit F Fehler einer Messung. Ist die Differenz kleine weist du was
das bedeutet.

Möchte ich einen Wert ziemlich genau bestimmen dann messe ich den ein
paar mal hintereinander, in der Hoffnung die fehler sind schön
gleichmäßig in beide Richtungen verteilt also plus und minus um den
waren Signalwert, und bilde den Mittelwert. Die mittlere
geschwindigkeit könnte ich nun aus zwei solcher Mittelwerte bilden.
Die ermittelte geschwindigkeit passt leider nur nicht zum aktuellen
Positionspunkt, da taucht schon das erste Problem auf. Um so etwas zu
lösen gibt es dann aufwendige Verfahren das Position und
Geschwindigkeit jeweils zueinander passen. Die liefern dann schon
genauere Ergebnisse.

Die absolute Genauigkeit wirst du niemals bewusst messen, das ist
immer nur mal ein Zufall auf den man sich nicht verlassen kann.

gruß

Lutz
 
Heiko Nocon <Heiko.Nocon@gmx.net> wrote in
news:q813pvkfbgvv9onjcetsubb383rn4noli0@4ax.com:

Rafael Deliano wrote:

Warum nimmt man längliche FIRs statt nur die Differenz
von 2 Samplen zu bilden ?

Das würde mich mal interessieren.

Offensichtlich weil ein
Differenzierer Rauschen verstärkt und man dieses
wegmitteln möchte.

Ähem.. Das erreicht man doch genauso (bloß mit viel weniger
Rechenaufwand), indem man einfach nur jedes nte Sample (n>1) zur
Differenzbildung verwendet, oder?
Nein, wie der OP schon schrieb, hast Du bei niedrigen Geschwindigkeiten
z.B. 9 Meßwerte wo sich nix tut, beim 10. Meßwert springt die
Geschwindigkeit auf den minimal meßbaren Wert um beim Nächsten Wert wieder
auf null zu verschwinden. Das kann die Regelung durcheinander bringen.

Problem: der ADC bietet eigentlich nicht genung Auflösung,
Quantisierungseffekte schlagen zu. Weil der ADC aber schneller als nötig
ist, wandelt man häufiger und interpoliert die zwischen Werten.
Also:
v_i = (sum(n=i-32 bis n=i-16) - sum(n=i-15 bis n=i)) / 16

Die Werte werden also in einem Ringbuffer geschrieben (Position i), und die
zwei Mittelungsfkten laufen über die letzen 32 bis 16 bzw. 15 bis 0 Werte.
Die Wahl der 2er Potenzen erlaubt die Effektive verarebitung.
Die Division wird weggelassen (muß dann in den folgenden Berechnungen
beachtet werden), denn die letzten 4 Bits enthalten natürlich gerade die
Information um deren Willen man Interpoliert hat.
Es tritt kein Überlauf auf, denn 16* 10 Bit passen problemlos in einen 16
Bit Wert. 16 Bit lassen natürlich auch Filter über 64 Werte zu.
Die erste Summe (32 bis 16) berechnet man natürlich nicht jedes mal neu,
sondern verwendet einen weiteren Ringbuffer, der von der 2. Mittelungsfkt
gefüllt wird.
So sind pro Meßwert nur 16 Additionen, eine Subtraktion und etwas Kopieren
im Speicher fällig, das kan auch auf dem 8051 laufen. Wenn man noch
Rechenzeit überhat, kann man auch noch die Mittelung mit Koeffizienten
vesehen, dann braucht man aber hier noch 16 16-Bit-Multiplikationen, wo für
mein Code 16*71 Zyklen brauchen würde.
Gewinn des Aufstandes: Filter gegen Störungen, ľC interner ADC genutzt.

Schau Dir dazu mal an wie Delta-Sigma Wandler funktionieren. Da wird dann
auch erklärt, warum man ein kleines Bisschen höher frequentes Rauschen zum
Eingangssignal mischen sollte.

Gruß
Martin
 
Warum nimmt man längliche FIRs statt nur die Differenz
von 2 Samplen zu bilden ?
Das erreicht man doch genauso (bloß mit viel weniger
Rechenaufwand), indem man einfach nur jedes nte Sample
(n>1) zur Differenzbildung verwendet, oder?
Wo soll da die Glättung zwecks Rauschbefreiung herkommen ?
Der Differenzierer mit den 2 Samples ist für reale
Daten die schlechteste aller Lösungen, obwohl er in
( Studenten-)Büchern über Regelungstechnik für
PID gern auftaucht.
Das analoge RC-Filter ist schon ein DT1, also
glättender/"speichernder". Letztlich als 1pol-IIR-Hochpaß
nachbildbar.
Einfache Differenzierer und dann simple
Mittelwertbildung also für 4 Samples z.B.
( (n-1) + (n-2) + (n-3) + (n-4) )/4
wäre auch möglich. Ein Averager ist aber nur ein
Sonderfall des FIR. Einfacher zu machen ( Multiplikation
entfällt ) aber mit schlechterem Frequenzgang.

MfG JRD
 
Hi,

Man kann u.U. die Formel umstellen und so günstiger wegkommen, nur
Divisionen durch 2, 4, .. oder 256 (letztes Byte weglassen) zulassen
oder nur die wirklich relevanten Teile eines Ergebnisses berechnen
(z.B. 16 Bit * 16 Bit nur die oberen 12 Bit wenn es auf einen 12 Bit
DAC geht).
oder ganz simpel (gleitender durchschnitt über die letzten 256 Werte)

alter_wert = (alter_wert * 255 + neuer_wert ) div 256;

kann man noch verbessern in:

alter_wert = (alter_wert * 256 ) - alter_wert + neuer_wert) div 256;

das gibt noch ein wenig Probleme wegen der zu geringen Auflösung von
"alter_wert", also machen wir:

alter_wert = alter_wert - (alter_wert shr 8) + neuer_wert;
ergebniss = alter_wert shr 8;

draus, und siehe da, das geht ganz ohne "plutimikation" auch
auf dem langsamsten uC. (Gut ein richtiges Filter mit passende
koeffizienten ist natuerlich besser, aber ob man das für die
Anwendung braucht? Ist halt alles eine Kosten - Nutzen Abwegung.)

Alex Wenger
 

Welcome to EDABoard.com

Sponsor

Back
Top