-         

Ergebnis 1 bis 4 von 4

Thema: Servo der Steuerung nachlaufen lassen mit Atxmega ?

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    35
    Beiträge
    318

    Servo der Steuerung nachlaufen lassen mit Atxmega ?

    Anzeige

    Hallo zusammen,

    ich lese über das Event System des Atxmega32a4 den Wert eines RC Kanals ein. Über einen Timer Compare Output steuere ich 1:1 ein Servo an. Das funkioniert prima. Jetzt würde ich aber gerne eine Art nachlaufen des Servos realisieren. Wenn ich den Steuerknüppel auf unterster Stellung habe, bekomme ich einen Wert von 4000, bei Mitte 6000 und bei Maximum 8000. Wenn ich jetzt zügig von unterster auf die oberste Stellung gehe, dann soll das Servo merklich "langsamer" bis zur obersten Stellung nachlaufen. Ich hoffe man kann verstehen was ich meine

    Wie würdet Ihr das realisieren ? Ich steh aufm Schlauch und finde keinen Ansatz.

    Gruß Kay

    PS: Hier mein Code:

    Code:
    '### Chip ###
    $regfile = "xm32a4def.dat"
    $crystal = 32000000                                                             '32MHz
    $hwstack = 64
    $swstack = 40
    $framesize = 100
    
    '### Xmega Clock Settings ###
    Config Osc = Disabled , 32mhzosc = Enabled                                      '32MHz
    Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1                      'CPU Clock = 32MHz
    
    '### Com Port Settings ###
    Config Com2 = 19200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
    Open "COM2:" For Binary As #1
    
    '### Config LED ###
    Config Portb.0 = Output
    Led_1 Alias Portb.0
    
    '### Config Servo Out ###
    Config Portc.0 = Output
    Config Portc.1 = Output
    Config Portc.2 = Output
    Config Portc.3 = Output
    Config Tcc0 = Pwm , Prescale = 8 , Comparea = Enabled , Compareb = Enabled , Comparec = Enabled , Compared = Enabled , Resolution = 16
    
    Tcc0_per = 65535                                                                'Set Period = FFFF = 65535 --> 65535/4MHz = 16.38mSec
    
    '### Interrupt Prio ###
    Config Priority = Static , Vector = Application , Hi = Enabled
    Enable Interrupts
    
    '### Dims ###
    Dim Temp1_rc As Word
    Dim Temp2_rc As Word
    Dim Temp3_rc As Word
    Dim Temp4_rc As Word
    Dim Kca As Bit
    Dim Kcb As Bit
    Dim Kcc As Bit
    Dim Kcd As Bit
    
    '### Config Inputs ###
    Config Pind.0 = Input
    Config Pind.1 = Input
    Config Pind.2 = Input
    Config Pind.3 = Input
    
    Portd_pin0ctrl = &H00
    Portd_pin1ctrl = &H00
    Portd_pin2ctrl = &H00
    Portd_pin3ctrl = &H00
    
    '### Timer ###
    Tcd0_per = &H7FFF
    
    Tcd0_ctrla = &B0000_0100                                                        ' Clock / 8
    Tcd0_ctrlb = &B1111_0000                                                        ' CCxEN Enabled
    Tcd0_ctrld = &B1100_1000
    
    '### Event Channels ###
    Evsys_ch0mux = &B0110_1000                                                      ' Mux Portd.0
    Evsys_ch1mux = &B0110_1001                                                      ' Mux Portd.1
    Evsys_ch2mux = &B0110_1010                                                      ' Mux Portd.2
    Evsys_ch3mux = &B0110_1011                                                      ' Mux Portd.3
    
    '### Clear Interrupt ###
    Temp1_rc = Tcd0_cca
    Temp2_rc = Tcd0_ccb
    Temp3_rc = Tcd0_ccc
    Temp4_rc = Tcd0_ccd
    
    '### Enable all interrupts ###
    Enable Tcd0_cca , Hi
    On Tcd0_cca Capture_a
    Enable Tcd0_ccb , Hi
    On Tcd0_ccb Capture_b
    Enable Tcd0_ccc , Hi
    On Tcd0_ccc Capture_c
    Enable Tcd0_ccd , Hi
    On Tcd0_ccd Capture_d
    
    '### Main ###
    Main:
    
       Tcc0_cca = Temp1_rc
       Tcc0_ccb = Temp2_rc
       Tcc0_ccc = Temp3_rc
       Tcc0_ccd = Temp4_rc
    
    Goto Main
    
    '*******************************************************************************
    '### ISR #######################################################################
    '*******************************************************************************
    Capture_a:
    Temp1_rc = Tcd0_cca
    Return
    
    Capture_b:
    Temp2_rc = Tcd0_ccb
    Return
    
    Capture_c:
    Temp3_rc = Tcd0_ccc
    Return
    
    Capture_d:
    Temp4_rc = Tcd0_ccd
    Return
    ...::: AVRFreak :::...

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Hallo

    So vielleicht?
    Code:
    '### Dims ###
    ...
    Dim Soll1_rc As Word
    Dim Soll2_rc As Word
    Dim Soll3_rc As Word
    Dim Soll4_rc As Word
    Dim Temp as Word
    
    '### Clear Interrupt ###
    Soll1_rc = Tcd0_cca
    Soll2_rc = Tcd0_ccb
    Soll3_rc = Tcd0_ccc
    Soll4_rc = Tcd0_ccd
    
    '### Set Temp ###
    Temp1_rc = Soll1_rc
    Temp2_rc = Soll2_rc
    Temp3_rc = Soll3_rc
    Temp4_rc = Soll4_rc
    
    
    '### Main ###
    Main:
    
       If Temp1_rc <> Soll1_rc Then
          If Temp1_rc < Soll1_rc Then
             Temp = Soll1_rc - Temp1_rc
             If Temp < 100 Then
                Temp1_rc = Soll1_rc
             Else
                Temp1_rc = Temp1_rc + 100 ' Schrittweite1
             End If
          Else  
             Temp = Temp1_rc - Soll1_rc
             If Temp < 50 Then
                Temp1_rc = Soll1_rc
             Else
                Temp1_rc = Temp1_rc - 50 ' Schrittweite2
             End If
          End If
          Tcc0_cca = Temp1_rc
          Waitms 20 ' Wartezeit
       End If
    
       Tcc0_ccb = Soll2_rc
       Tcc0_ccc = Soll3_rc
       Tcc0_ccd = Soll4_rc
    
    Goto Main
    
    '*******************************************************************************
    '### ISR #######################################################################
    '*******************************************************************************
    Capture_a:
    Soll1_rc = Tcd0_cca
    Return
    
    Capture_b:
    Soll2_rc = Tcd0_ccb
    Return
    
    Capture_c:
    Soll3_rc = Tcd0_ccc
    Return
    
    Capture_d:
    Soll4_rc = Tcd0_ccd
    Return
    (unkompiliert und ungetestet)

    Die Verzögerung wird zum einen über die Schrittweite und zum anderen über die Wartezeit eingestellt. Ich hab's mal nur für einen Kanal geschrieben, bei mehreren Kanälen addieren sich die Verzögerungen, möglicherweise wird dann alles zu träge. Versuch macht kluch.

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    35
    Beiträge
    318
    Hi Mic,

    vorerst mal vielen Dank. Werde das ganze heute Abend gleich testen und Rückmeldung geben.

    Gruß Kay
    ...::: AVRFreak :::...

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    35
    Beiträge
    318
    Hi Mic,

    es funktioniert. Vielen Dank für die Hilfe.

    Gruß Kay
    ...::: AVRFreak :::...

Ähnliche Themen

  1. Servo schnell und langsam laufen lassen
    Von Dennis2006 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 27.03.2010, 09:37
  2. Servo 3 positionen anfahren lassen
    Von Christian3 im Forum Robby RP6
    Antworten: 2
    Letzter Beitrag: 16.08.2009, 00:08
  3. Bascom und Atxmega
    Von Tretsch im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 14
    Letzter Beitrag: 13.07.2009, 19:18
  4. Modellbau-Servo in Endlage fahren lassen ?
    Von dreamy1 im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 06.12.2005, 18:15
  5. Antworten: 4
    Letzter Beitrag: 07.08.2004, 22:13

Berechtigungen

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