Geber, Resolver Winkelmessung aus zwei Kurven, Sin,Cos mittels arctan2

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
kiaralle
User
Beiträge: 188
Registriert: Donnerstag 19. August 2021, 19:11

Hallo,
weiter geht es mit meinem Projekt.

Ich möchte nun aus Gerbern für Servomotoren welche analoge Informationen zur Verfügung stellen auswerten.
Einige Geber geben zusätzlich oder nur zwei Spuren Sinus / Cosinus aus.
Typisch wären auch Revolver, 2polig....6polig
Über die höhe der Spannungen kann ich aktuell noch nichts sagen, scheinen sich aber um die 2,5Volt zu bewegen. Mit Sicherheit gibt es auch höhere
Diese Spannungen möchte ich über einen AD-Wandler auf den Raspberry ziehen.
Die Umwandlung der Spannungen sollte hier aber kein Thema sein. Oder doch?
Im Netz findet man so einiges.

Hier aus der Implementierung des Protokolls der Sick-Geber
Die Hochauflösung (Arctan-Interpolation)
Zur Berechnung des hochaufgelösten Winkels innerhalb einer Periode sind viele Verfahren bekannt. Das folgende
Verfahren (Abbildung 4) hat sich dabei als guter Kompromiss bzgl. Codegröße und Ausführungsgeschwindigkeit be-
währt:
1. Reduzierung der Berechnung auf den 1. Oktanten (0 … 45°) durch vertauschen und/oder invertieren der Sinus-
und Cosinuswerte, damit die nachfolgende
2. Berechnung der Division sin (x)/cos (x) immer ein Ergebnis < = 1 hat.
3. Tabellengestützte Linearisierung des Divisionsergebnisse zur Annäherung an die Arcus-Tangens-Funktion
(ca. 32 Stützpunkte erforderlich).
4. Rücktransformation & Erweiterung des Ergebnisses in den unter 1) ermittelten Oktanten.
Muss ich da eine Tabelle zur Verfügung stellen?
3. Tabellengestützte Linearisierung des Divisionsergebnisse zur Annäherung an die Arcus-Tangens-Funktion
(ca. 32 Stützpunkte erforderlich).

Im Netz habe ich folgendes gefunden und etwas abgewandelt. Nur mal so gedacht.

Code: Alles auswählen

import numpy as np
x = np.array([-1, +1, +1, -1])
y = np.array([-1, -1, +1, +1])

cos = 0.3
sin = 0.1


angles = np.arctan2(cos,sin) * 180 / np.pi

print(angles)

Gehe ich richtig in der Annahme, das das np.array den Aufbau des Signal für eine komplette Umdrehung wäre?
Die 180° gibt es nur deshalb, da die negativen Spannung so bearbeitet aind, das diese sich nur im positiven Bereich bewegen?
Oder doch mit 360° laufen lassen. Kann man testen

Für einen 4poligen Resolver wäre der np.array eventuell so? Nur mal so gedacht.

Code: Alles auswählen

x = np.array([-1, +1, +1, -1, -1, +1, +1, -1])
Gruß Ralf
Benutzeravatar
grubenfox
User
Beiträge: 653
Registriert: Freitag 2. Dezember 2022, 15:49

kiaralle hat geschrieben: Sonntag 29. März 2026, 10:28

Code: Alles auswählen

import numpy as np
x = np.array([-1, +1, +1, -1])
y = np.array([-1, -1, +1, +1])

cos = 0.3
sin = 0.1


angles = np.arctan2(cos,sin) * 180 / np.pi

print(angles)
Gehe ich richtig in der Annahme, das das np.array den Aufbau des Signal für eine komplette Umdrehung wäre?
ich kann nur bedingt folgen.... aber die x und y werden nicht genutzt, die können weg.

Code: Alles auswählen

71.56505117707799
kiaralle hat geschrieben: Sonntag 29. März 2026, 10:28 Hier aus der Implementierung des Protokolls der Sick-Geber
Die Hochauflösung (Arctan-Interpolation)
Man kann auch einfach arctan2 von Numpy nutzen, da ist das Thema 'Arctan-Interpolation' dann völlig überflüssig.
Arctan-Interpolation hatte ich wohl mal mit Assembler (68000er) gemacht, aber das ist nun Jahrzehnte her. Dafür hat man ja heute höhere Programmiersprachen und Module wie Python und NumPy...

_______________________________________________________________________________
https://www.python-kurs.eu/index.php
https://learnxinyminutes.com/docs/python/

https://quickref.me/python https://docs.python-guide.org/
https://www.youtube.com/watch?v=qU3Rc6_B9es
kiaralle
User
Beiträge: 188
Registriert: Donnerstag 19. August 2021, 19:11

mit x und y erhalte ich [-270. 270. 90. -90.], was ich ja nicht will.
Somit hast recht....x,y macht keinen sinn.

Da ich das Auslesen nur im Stillstand verwende, sollte Python dann doch reichen.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1337
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Im Stillstand ist die Auswertung einfach. Problematisch wird es, wenn du den Resolver auswertest, wenn er sich dreht. Der Flaschenhals ist dann der ADC. Wahrscheinlich erzeugt Python auch zu viel Overhead. Es gibt dedizierte Controller für diese Aufgabe, die aber sehr teuer sind.

Ich hab mal ChatGPT gefragt und hab hier ein Beispiel für Micropython:

Code: Alles auswählen

import math
from machine import ADC, Pin

adc_sin = ADC(Pin(34))
adc_cos = ADC(Pin(35))

adc_sin.atten(ADC.ATTN_11DB)
adc_cos.atten(ADC.ATTN_11DB)

OFFSET = 2048  # anpassen!

def read_angle():
    sin_val = adc_sin.read() - OFFSET
    cos_val = adc_cos.read() - OFFSET

    angle = math.atan2(sin_val, cos_val)
    angle_deg = math.degrees(angle)

    if angle_deg < 0:
        angle_deg += 360

    return angle_deg

while True:
    print(read_angle())
Numpy benötigt man für die Auswertung nicht, es seiden du hast zuvor eine Drehbewegung aufgenommen und möchtest diese dann nachträglich auswerten.

Die komplette Konversation: https://chatgpt.com/share/69c90425-df48 ... dba415d336

Muss nicht immer alles richtig sein. Manchmal sind die Aussagen der KI falsch.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
kiaralle
User
Beiträge: 188
Registriert: Donnerstag 19. August 2021, 19:11

Dein Code schaut verständlich für mich.
Werde ich heute noch testen.

Ich benötige nur die Position des Gebers, Resolvers im Stillstand.
Der Motor wird dabei statisch bestromt, zum Beispiel U-, W +, und der permanenten erregte Servo richtet sich aus.
Das ist bei jedem Hersteller anders.
Nun kann ich den Winkel ablesen und die Spannung am Sinus muß dabei Null sein.
Mit diesen Verfahren kann man Geber demonstrieren und genauso einfach montieren. Alles ohne Frequenzumrichter.
Benutzeravatar
Dennis89
User
Beiträge: 1718
Registriert: Freitag 11. Dezember 2020, 15:13

Die Umwandlung der Spannungen sollte hier aber kein Thema sein. Oder doch?
Die Umwandlung wird zum Thema, wenn die max. Spannung die zulässige Spannung des ADC überschreitet. Da hier nahezu "kein" Strom fließt, sprich es sich um eine hochomige Spannung handelt, kann man zum Beispiel einen Spannungsteiler bauen. Das habe ich so mal verwendet, als ich einen Drehgeber, der 12V lieferte, mit einem Mikrokontroller ausgewertet habe.

Für den Rest fehlt mir irgendwie etwas Kontext. Ganz grob habe ich es so verstanden, das sich irgendetwas dreht und wenn es sich nicht mehr dreht, dann benötigst du die Position und die Rückmeldung der Position erhälst du über einen Sinus-Verlauf? Sprich da wo die Kurve aufhört, soweit hat sich etwas im Kreis gedreht?

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
kiaralle
User
Beiträge: 188
Registriert: Donnerstag 19. August 2021, 19:11

Zur Demontage eines Gebers oder Resolvers usw gibt es oft definierte Kennzeichen, Regeln, Vorgänge.
Die sind vom Hersteller definiert.

Der Geber wird auf dem Anker vom Motor so positioniert, das eine bestimmte Lage eingehalten wird.

Der permanenten erregte Motor (Synchronmotor) wird an seinen Eingängen so mit Gleichspannung angeschlossen, das der Sinus vom Resolvers Null Volt hat, bei einigen Geber auch so, oder der Peak von der Null-Spure vom Geber exakt auf Null steht.
Der Motor dreht sich in eine bestimmte feste Position. Ähnliche eines Gleichstrommotors.

Wenn man das hat, kann man den Geber abziehen und nach Reparatur des Motors wieder aufsetzen.

Das Muster beim Anschluss ist je nach Hersteller verschieben.
Manchmal U+ , W - oder U+ , V und W minus ...

Man muß also Daten zu den einzelnen Herstellern und Motortypen sammeln.

Ich habe jetzt Daten und möchte ohne Oszilloskop, also mit Software etwas machen.
Antworten