Sin/Cos Encoder zur Poritionsbestimmung auswerten

Gast #3352098
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:
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
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
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

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.