Forum: Digitale Signalverarbeitung / DSP / Machine Learning Sin/Cos Encoder zur Poritionsbestimmung auswerten


von Philipp S. (Gast)


Angehängte Dateien:

Lesenswert?

Guten Morgen zusammen,

ich möchte mit einem TI F28335 die Signale eines Sin/Cos-Encoder zur 
Bestimmung der elektrischen Rotorlage einer PMSM verarbeiten. Der 
Encoder bringt vier Perioden pro mechanischer Umdrehung. Die Maschine 
hat vier Polpaare, passt also.

Ich habe die Signale über eine Umdrehung mal aufgezeichnet. Dabei ist zu 
sehen, dass die Amplituden der Signale nicht identisch sind. Und das 
dürfte mir gerade beim Auswerten mein Problem bereiten.

Ziel sollte es sein, ein normiertes Winkelsignal, sprich 0 = 0° elektr. 
bis 1 = 359° elektr. zu erhalten.

Das Signal wird extern noch durch einen ohmschen Spannungsteiler 
halbiert, damit der ADC es voll erfassen kann. Ich habe nun zuerst 
versucht, die Signale von -1... 1 zu normieren. Anschließend ließe sich 
über die atan2-Funktion relativ bequem der Winkel bestimmen. Da aber die 
Amplituden der jeweiligen Perioden verschieden sind, haut schon die 
Normierung nicht hin und das Ergebnis wird sehr ungenau.

Hat da jemand eine Idee, wie man es anders lösen könnte?

EDIT: Hier noch mein bisheriger Ansatz:
1
// ADC lesen und Werte normieren
2
    tempSin = (int32)(AdcMirror.ADCRESULT3-SinOffset)*SinNorm - 1;
3
    tempCos = (int32)(AdcMirror.ADCRESULT4-CosOffset)*CosNorm - 1;
4
  
5
   // Arcustangens2-Funktion
6
   Tmp1 = _IQatan2(_IQ(tempCos),_IQ(tempSin));
7
   
8
   // Für Winkel > 180° 2*PI addieren
9
   if(tempSin < 0)
10
     Tmp1 += _IQ(6.28318);
11
        
12
   // Ergebnis von 0 (=0°) bis 1 (=359°) normieren
13
   speed1.OutputTheta = _IQdiv(Tmp1,_IQ(6.28318));

Danke!
Gruß
Philipp

von Detlef _. (detlef_a)


Lesenswert?

Mit complexen Zahlen.

In Matlab:

comp= AdcMirror.ADCRESULT3 + j*AdcMirror.ADCRESULT3;
comp=com-mean(comp); % In den Nullpunkt schieben
% Real/Imagteil getrennt normieren
comp= (real(comp)/max(real(comp)))+j*(imag(comp)/max(imag(comp)));
% Winkel bestimmen
winkel = angle(comp);

Sollte so gehen, probiert habe ich's nicht.

Cheers
Detlef

: Bearbeitet durch User
von Johannes E. (cpt_nemo)


Lesenswert?

Philipp Seckel schrieb:
> Ich habe nun zuerst
> versucht, die Signale von -1... 1 zu normieren. Anschließend ließe sich
> über die atan2-Funktion relativ bequem der Winkel bestimmen. Da aber die
> Amplituden der jeweiligen Perioden verschieden sind, haut schon die
> Normierung nicht hin und das Ergebnis wird sehr ungenau.

Normalerweise ist die Amplitudenänderung über eine Umdrehung bei beiden 
Signale ungefähr gleich, so dass sich das bei der atan2-Berechnung 
gegenseitug aufhebt.

Falls nicht bzw. wenn es trotzdem noch zu ungenau ist, dann könntest du 
eine Kalibrationsmessung mit einem genauen Mess-System machen und den 
Fehler in einer Tabelle abspeichern, damit kann man dann auf den 
korrekten Winkel zurückrechnen.

von Philipp S. (Gast)


Lesenswert?

Hallo zusammen und vielen Dank für die vorgebrachten Lösungen.

Wie so oft liegt die Lösung viel zu nahe:

Argumente bei der atan2-Funktion getauscht (nachdem man dann doch mal 
ins Manual geguckt hat). Siehe da: Kaum macht man es richtig, schon 
funktionierts. Siehe auch Manual zur IQmath Lib.

Und da, wie Johannes schon angemerkt hatte, die Amplitudenänderung 
jeweils auf beide Signale zutreffen, hat dies bei der Berechnung keinen 
merklichen Einfluss mehr.

Also vielen Dank für eure Ideen und bis zur nächsten Frage!

Gruß
Philipp

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
Noch kein Account? Hier anmelden.