-
RC-Empfänger Auswerten
Halllo Zusammen,
ich habe folgendes Problem:
Ich möchte gerne einen Empfänger Kanal auslesen, und einen Wert zwischen -100 und +100 Bekommen. Wie man dass mit ner Summensignalmessung macht is mir klar nur ich möchte den Normalen RC Ausgang vom Empfänger nehmen! Ich programmiere in Bascom.
Kann mir da jemand weiter Helfen??
Vielen Dank im Voraus
-
Hallo Minimax,
im Prinzip ist es ganz einfach ;-)
Du configuriest einen externen interrupt auf steigende flanke (rising) und in der isr startest du dann einen timer (z.b. timer0). Außerdem configurierst du den interrupt um, auf fallende flanke (falling). Wenn der interrupt nun das nächste mal ausgelöst wird, stopst du den timer, configurierst wieder auf falling.
In der timer isr (welche auf z.b. 10µs eingestellt wird) erhöhst du jedesmal einen wert, welchen du dann beim fallenden signalpegel in eine andere variable einliest. diese variable ist dann dein PWM-Wert. Diese solltest du jedoch noch durch 100 teilen, um auf einen wertebereich zwischen 0 und 255 zu kommen.
Hier mal schnell ein beispiel, habs gerade schnell geschrieben, müsste aber funktionieren ;-)
Code:
$regfile = "m32def.dat"
$crystal = 16000000
$framesize = 80
$hwstack = 80
$swstack = 80
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
Config Lcdbus = 4
Initlcd
Cls
Config Pind.2 = Input
Portd.2 = 1
Config Int0 = Rising
On Int0 Servo_input
Enable Int0
Config Timer2 = Timer , Prescale = 1
Timer2 = 96
On Timer2 Servo_zaehler
Stop Timer2
Enable Timer2
Dim Servo_pin As Bit
Dim Servo_wert As Word
Dim Servo_wert_read As Word
Servo_pin = 0
Enable Interrupts
Do
If Servo_wert_read <> 0 Then
Servo_wert_read = Servo_wert_read / 100
Locate 1 , 1
Lcd "Servo_wert: " ; Servo_wert_read ; " "
Servo_wert_read = 0
End If
Loop
End
Servo_zaehler:
Timer2 = 96
Incr Servo_wert
Return
Servo_input:
If Servo_pin = 0 Then
Servo_pin = 1
Timer2 = 96
Start Timer2
Config Int0 = Falling
Elseif Servo_pin = 1 Then
Servo_pin = 0
Stop Timer2
Config Int0 = Rising
Timer2 = 96
Servo_wert_read = Servo_wert
End If
Return
Gruß
Chris
-
Ah ok -- :-k
Nur was ist der Servo wert den ich noch durch 100 Teilen muss??
Is das Servo Wert?
-
Der servo wert ist die high-zeit des pwm-signals. 1ms entspricht einem wert von 100.
Da du ja einen wert im ms haben möchtest, musst du durch 100 teilen.
128 bedeutet z.b., dass das signal 128ms lang high ist und 255-128=127ms low ist.
Hoffe das ist verständlich, bin nicht so der Erklärer
Gruß
Chris
-
Also ist 0 = -100 % und 225 = + 100% ??
-
ja, so könnte man es sagen.
-
ah ok danke! Und die Variable ist dann ServoWert wo die 0 bis 225 angegeben sind? Also das Gemessene?
-
Könnte man das nicht auch mit dem Pulsein-Befehl lösen?
-
nein, servo_wert_read ist die endgültige variable.
Was ich noch vergessen habe, du musst nach jedem Messen die variable servo_wert zurücksetzen, da diese sonst immer größer wird.
Gruß
Chris
-
und wo schreibe ich das rein? Am Ende der Procedure? Und ich habe noch den Timer1 nebenbei laufen und in seiner Subrrutine Disable Ich die Interrups und am Ende der Rutine Enable ich sie -- ist das nen Problem?