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