Sin/Cos Encoder zur Poritionsbestimmung auswerten

Gast #3352098
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
Angehängte Dateien:
#3352894
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
#3352924
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.
Gast #3353040
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

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