Microchip PIC Basic snippets

Level 2 Headline

Omschrijving

programmacode

Level 2 Headline

Omschrijving

programmacode

motorsturing voor twee RC inputs

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.8-)

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.

motormixer.bas
    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