PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Sin-Cos-Geber auswerten (Routine Problem)



iBot
25.03.2015, 20:21
Hallo RNler,

mittlerweile sind es doch schon etliche Stunden, wo ich mich mit dem Problem beschäftige einen Sinus-Cosinus-Motorgeber auszuwerten.
Die Hardware stellte kein Problem dar und ich erhalte auch am ADC des ATMega die analogen Sinus- und Cosinus-Werte.
Das Problem besteht rein darin, aus den Werten den Winkel den der Geber mitteilen will auszurechnen.

Wenn ich eine Sinus- und eine Cosinus-Kurve habe kann ich doch alpha=tan^-1(y/x) rechnen oder?
Was in Bascom etwa so aussehen würde:
alpha = Atn2(y , x)
(atn2 damit ich alle Quadranten berechnen kann, wenn ich das richtig verstanden habe)

Die Variablen sind, bis auf "Sinus_word" und "Cosinus_word" alle Single's und
y und x bzw. sin und cosin hab ich so umgerechnet, dass sie Prozentual (0-1) sind.
Ausgegeben bekomme ich jedoch immer 0-1,5 und wieder 1,5-0, bei einer Umdrehung.



Do

Start Adc
Sinus_word = Getadc(4)
Cosinus_word = Getadc(5)
Stop Adc

Sinus = Sinus_word
If Sinus < Sinus_min Then Sinus_min = Sinus
If Sinus > Sinus_max Then Sinus_max = Sinus
Sinus = Sinus - Sinus_min
Sinus = Sinus / Sinus_max

Cosinus = Cosinus_word
If Cosinus < Cosinus_min Then Cosinus_min = Cosinus
If Cosinus > Cosinus_max Then Cosinus_max = Cosinus
Cosinus = Cosinus - Cosinus_min
Cosinus = Cosinus / Cosinus_max

Winkel = Atn2(sinus , Cosinus)


Gosub Ausgeben 'Auf Sieben-Seg-Anzeige ausgeben



Loop
End

Ich hoffe mir kann da jemand weiter helfen.
Freue mich über jede Antwort :)

- - - Aktualisiert - - -

Problem gelöst:
Die Sinus- und Cosinus-Werte bilden einen Kreis, der Kreis MUSS seinen Mittelpunkt auf Null haben.
-> von Sinus und Cosinus jeweils 0.5 abziehen da 1 der Maximalwert ist.
Außerdem erhalte ich mit "Atn2" das Bogenmaß
->umrechnung via "Rad2deg"

Echt peinlich wenn man so lange überlegt und dann erst darauf kommt, wenn man in ein Forum gepostet hat ;)

iBot
31.03.2015, 14:47
Do

Start Adc 'ADC-Wert Lesen >Anfang<
Sinus_word = Getadc(5)
Cosinus_word = Getadc(4)
Stop Adc 'ADC-Wert Lesen <Ende>

Sinus = Sinus_word 'Word in Single wandeln, wg. Umrechnungen und tan^-1 bzw atn2
If Sinus < Sinus_min Then Sinus_min = Sinus 'minimalen und
If Sinus > Sinus_max Then Sinus_max = Sinus 'maximalen Wert für Sinus festlegen
Sinus_diff = Sinus_max - Sinus_min 'Wertebereich in dem sich Sinus bewegt festlegen
Sinus = Sinus - Sinus_min 'wenn Sinus minimalen Wert erreich wird Sinus zu 0, um Mittelpunkt auf 0/0 zu setzen
Sinus = Sinus / Sinus_diff 'Prozentuale höhe der Sinuskurve ermitteln
Sinus = Sinus - 0.5 'Künstlich negativen Anteil der Kurve erzeugen, um Mittelpunkt auf 0/0 zu setzen

Cosinus = Cosinus_word 'siehe Sinus
If Cosinus < Cosinus_min Then Cosinus_min = Cosinus
If Cosinus > Cosinus_max Then Cosinus_max = Cosinus
Cosinus_diff = Cosinus_max - Cosinus_min
Cosinus = Cosinus - Cosinus_min
Cosinus = Cosinus / Cosinus_diff
Cosinus = Cosinus - 0.5

Bogen = Atn2(sinus , Cosinus) 'Bogenmaß erzeugen, siehe Index unter "Atn2"
Alpha = Rad2deg(bogen) 'Bogenmaß in Winkel Umrechnen
Alpha = Round(alpha)
If Alpha < 0 Then Alpha = 360 + Alpha 'negativen Winkel für vollen Kreis umrechnen, siehe Index unter "Atn2"

Wert = Alpha 'In Var für Sieben-Seg.-Ausgabe schreiben
Gosub Ausgeben 'In Schleife für Ausgeben Sieben-Seg.-Ausgabe springen

Loop
End