-         

Ergebnis 1 bis 2 von 2

Thema: Sin-Cos-Geber auswerten (Routine Problem)

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied Avatar von iBot
    Registriert seit
    12.05.2008
    Ort
    ca. 20km von Nürnberg
    Beiträge
    160

    Sin-Cos-Geber auswerten (Routine Problem)

    Anzeige

    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.

    Code:
    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
    Geändert von iBot (31.03.2015 um 14:45 Uhr)


  2. #2
    Erfahrener Benutzer Fleißiges Mitglied Avatar von iBot
    Registriert seit
    12.05.2008
    Ort
    ca. 20km von Nürnberg
    Beiträge
    160
    Code:
    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


Ähnliche Themen

  1. Funktionen: sin(); cos(); tan(); ... aus math.h
    Von Kaiser-F im Forum C - Programmierung (GCC u.a.)
    Antworten: 21
    Letzter Beitrag: 01.05.2008, 10:04
  2. problem bei umwandlung von cos(alpha) in alpha (grad) OK
    Von nomad im Forum Software, Algorithmen und KI
    Antworten: 2
    Letzter Beitrag: 17.04.2008, 18:14
  3. Tabellen für sin und cos
    Von Ozzy im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 03.10.2007, 14:33
  4. Ultraschall-Geber
    Von Radix im Forum Sensoren / Sensorik
    Antworten: 4
    Letzter Beitrag: 23.02.2007, 11:58
  5. sin oder -sin in einer verrauschten Kurve finden
    Von BiGF00T im Forum Software, Algorithmen und KI
    Antworten: 48
    Letzter Beitrag: 03.05.2006, 16:48

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •