Omschrijving
programmacode
Omschrijving
programmacode
Voor een experimentje met een RC boot geschreven:
Twee servouitgangen van de receiver rechtstreeks op de pic aangesloten:
Het bootje heeft geen roer, wel twee motoren. Door de beide signalen te mixen kan de boot nu eenvoudig manouvreren en zelf op de plaats draaien.
Het is niet zo'n fraai programma, maar het is in enkele uurtjes op een regenachtige zaterdagmiddag geschreven en het werkt.
Het staat hier bij de snippets, terwijl het een heel programma is: dit is eigenlijk gebeurt om de pagina te testen; dit programma had ik snel bij de hand.
Let op: de draairichting word in dit programma nog bepaald door een H-brug van relais aan te sturen. Het motortoerental word gestuurd door één enkele mosfet per motor.
device 18f452
xtal 10
DECLARE PLL_REQ = ON
'LCD display
all_digital true
DECLARE lcd_type 0
DECLARE lcd_interface 4
DECLARE lcd_lines 2
DECLARE lcd_dtpin portd.0
DECLARE lcd_enpin portd.4
DECLARE lcd_rspin portd.5
'ingangen
trisb = 0xff
portb = 0x00
intcon.7 = 0
symbol servoT = portb.0
symbol servoS = portb.1
symbol in2 = portb.2
symbol in3 = portb.3
symbol in4 = portb.4
symbol in5 = portb.5
symbol in6 = portb.6
symbol in7 = portb.7
symbol inreg = portb
'uitgangen
trisc = 0x00
portc = 0x78
symbol uit0 = portc.0
symbol motor1_F = portc.1
symbol motor2_F = portc.2
symbol motor1_R = portc.3
symbol motor1_L = portc.4
symbol motor2_R = portc.5
symbol motor2_L = portc.6
symbol uit7 = portc.7
symbol uitreg = portc
'diverse declaraties
symbol uit = 1
symbol aan = 0
DIM ServoT_in AS word
DIM ServoS_in AS word
DIM Tpos AS word
DIM Tneg AS word
DIM Spos AS word
DIM Sneg AS word
DIM Motor1_val AS word
DIM Motor2_val AS word
DIM motor1_out AS byte
DIM motor2_out AS byte
'uitgangen allemaal uit
uitreg = 0xFF
' cls
'regelloop-----------------------------------------------------
regelloop:
'servo ingang 1
WHILE servoT = uit 'wacht tot signaal laag is....
servoT_in = 0 '...reset teller...
WEND
WHILE servoT = aan '...en wacht tot ie weer hoog gaat
servoT_in = 0 '...reset teller...
WEND
WHILE servoT = uit
servoT_in = servoT_in + 1
' delayus 5
WEND
'servo ingang 2
WHILE servos = uit 'voor servo 2 het zelfde ritueel
servos_in = 0
WEND
WHILE servos = aan
servos_in = 0
WEND
WHILE servos = uit
servos_in = servos_in + 1
' delayus 5
WEND
'servo waarden aanpassen
' +trim vol+ neutr vol- -trim
' waarden gas: 2600 1900 1250
' waarden stuur: 2500 1900 1200
PRINT at 1, 1, dec servoT_in, " "
PRINT at 1, 9, dec servos_in, " "
'Netjes centreren en te hoge/lage waardes afkappen
SELECT servot_in
CASE < 1300
servot_in = 1300
CASE > 2500
servot_in = 2500
endselect
SELECT servos_in
CASE < 1300
servos_in = 1300
CASE > 2500
servos_in = 2500
endselect
'positieve en negatieve waardes bepalen
SELECT servot_in
CASE < 1900
tneg = 1900 - servot_in
tpos = 0
CASE > 1900
tpos = servot_in - 1900
tneg = 0
CASE ELSE
tpos = 0
tneg = 0
endselect
SELECT servos_in
CASE < 1900
sneg = 1900 - servos_in
spos = 0
CASE > 1900
spos = servos_in - 1900
sneg = 0
CASE ELSE
spos = 0
sneg = 0
endselect
'Waarde voor PWM bepalen
motor1_val = (1200 + tpos + spos - tneg - sneg)
motor2_val = (1200 + tpos - spos - tneg + sneg)
'1200 is nu neutraal
'600 minimum
'1800 maximum
'waardes kunnen hier nog wel boven/onder komen: afkappen!
SELECT motor1_val
CASE < 600
motor1_val = 600
CASE > 1800
motor1_val = 1800
endselect
SELECT motor2_val
CASE < 600
motor2_val = 600
CASE > 1800
motor2_val = 1800
endselect
'nu adhv de motorval de h-brug sturen
SELECT motor1_val
CASE < 1180
motor1_l = aan
motor1_r = uit
CASE > 1220
motor1_l = uit
motor1_r = aan
CASE ELSE
motor1_l = aan
motor1_r = aan
endselect
SELECT motor2_val
CASE < 1180
motor2_l = aan
motor2_r = uit
CASE > 1220
motor2_l = uit
motor2_r = aan
CASE ELSE
motor2_l = aan
motor2_r = aan
endselect
'motorval schalen en naar pulsuit sturen
SELECT motor1_val
CASE < 1200
motor1_val = 1200 - motor1_val
CASE > 1200
motor1_val = motor1_val - 1200
endselect
motor1_out = motor1_val / 3
SELECT motor2_val
CASE < 1200
motor2_val = 1200 - motor2_val
CASE > 1200
motor2_val = motor2_val - 1200
endselect
motor2_out = motor2_val / 3
PRINT at 2, 1, dec motor1_r, dec motor1_l, " ", dec motor1_out, " "
PRINT at 2, 9, dec motor2_r, dec motor2_l, " ", dec motor2_out, " "
hpwm 1, motor1_out, 3000 'pulsout maximaal 255.
hpwm 2, motor2_out, 3000
GOTO regelloop