PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Servo der Steuerung nachlaufen lassen mit Atxmega ?



BlaueLed
25.06.2012, 00:32
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:



'### 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

radbruch
25.06.2012, 12:03
Hallo

So vielleicht?

'### 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

BlaueLed
25.06.2012, 13:24
Hi Mic,

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

Gruß Kay

BlaueLed
25.06.2012, 22:15
Hi Mic,

es funktioniert. Vielen Dank für die Hilfe.

Gruß Kay