Zelfbouw modelbouw motorregelaar

Gepost door Jeroen Vreuls op donderdag 24 augustus 2023

De software voor de modelbouw regelaar

Device 16F887                              ; Processor type

Xtal 10                                    ; Crystal 10 MHz

Asm                                        ; Config settings
CONFIG_REQ            
__CONFIG _CONFIG1, HS_OSC & WDT_OFF & DEBUG_OFF & FCMEN_OFF & LVP_OFF & IESO_OFF & BOR_OFF & CPD_OFF & CP_OFF & MCLRE_OFF & PWRTE_ON 
__CONFIG _CONFIG2, WRT_OFF & BOR40V 
EndAsm

All_Digital true                           ; Alle poorten digitaal

Declare CCP1_Pin PORTC.2                   ; PWM 1 op poort C.2
Declare CCP2_Pin PORTC.1                   ; PWM 2 op poort C.1

Declare LCD_RSPin PORTD.2                  ; Reset display poort D.2
Declare LCD_ENPin PORTD.3                  ; Enable display poort D.3
Declare LCD_DTPin PORTD.4                  ; Data display poort D.4 t/m D.7
Declare LCD_Lines 2                        ; Twee lijns display

Symbol STANDBY_SCHAK  = PORTA.0            ; Ingang standby schakelaar
Symbol RESET_FAILSAFE = PORTA.1            ; Ingang reset failsafe
Symbol JUMPER         = PORTA.2            ; Ingang failsafe aan / uit
Symbol FUNCTIE_LED    = PORTA.3            ; Uitgang functie led
Symbol VRIJGAVE       = PORTC.0            ; Uitgang vrijgave regelaar

Symbol FREQUENTIE = 10000                  ; PWM frequentie 10KHz

Dim VAR1 As Word                           ; Variabele var1
Dim WAARDE As Word                         ; Variabele waarde

Clear                                      ; Wis geheugen 
                                   
DelayMS 2000                               ; Wacht 2 seconden

         ;543210                           ; Hulpregel poort A
PORTA  = %000000                           ; Maak poort A laag
TRISA  = %100111                           ; Poort_A I/O

        ;543210                            ; Hulpregel poort B
PORTB = %000000                            ; Maak poort B is laag
TRISB = %000000                            ; Poort_B I/O

        ;76543210                          ; Hulpregel poort C
PORTC = %00000000                          ; Maak poort C laag
TRISC = %00000000                          ; Poort_C I/O

        ;76543210                          ; Hulpregel poort D
PORTD = %00000000                          ; Maak poort D laag
TRISD = %00000000                          ; Poort_D I/O

        ;210                               ; Hulpregel poort E 
PORTE = %000                               ; Maak poort E laag
TRISE = %000                               ; Poort_E I/O

        ;76543210                          ; Hulpregel analoog
ANSEL = %00000000                          ; ANSEL register analoog poort_A

         ;76543210                         ; Hulpregel analoog
ADCON0 = %00000011                         ; ADCON0 register analoog 8 bit

         ;76543210                         ; Hupregel analoog
ADCON1 = %10000000                         ; ADCON1 register analoog 10 bit

         ;76543210                         ; Hulpregel analoog poort_B
;ANSELH = %00000000                        ; ANSEL register analoog poort_B

;---------------------------------------------------------
; PROGRAMMA MODELBOUW REGELAAR VOOR GRAUPNER C4-X 40 SSM.
;---------------------------------------------------------

;-----------------------------
; ALLE UITGANGEN LAAG ZETTEN.
;-----------------------------

FUNCTIE_LED = 0
VRIJGAVE = 0                           
HPWM 1,0,0                              
HPWM 2,0,0

;-------------------------------------------------------
; ONTVANGER SIGNAAL INLEZEN EN VERWERKEN.
; PRINT OPDRACHT GEVEN.
; REGELAAR BLOKKEREN.
; FUNCTIE LED AANSTUREN.
; SIGNAAL LINKS RECHTS CONTROLEREN.
; SCHAKELAAR STANDBY INLEZEN.
; ALS JUMPER GEPLAATST IS FAILSAFE FUNCTIE CONTROLEREN.
;-------------------------------------------------------                              
                                
START:


    VAR1 = PulsIn PORTA.5 , 1                 
    WAARDE = (VAR1-243)*1.20   
    
    Print At 1,1,"H.v.Z-PRODUCT"
    Print At 2,1,"WAARDE:    STOP"
    Print At 2,8,Dec3, WAARDE
                            
    VRIJGAVE = 0 
                               
    FUNCTIE_LED = 0
                                                  
    If WAARDE > 137 Then
       Cls 
       GoTo RECHTS_OM
    EndIf
            
    If WAARDE < 117 Then
       Cls 
       GoTo LINKS_OM 
    EndIf
          
    If STANDBY_SCHAK = 0 Then
       Cls 
       GoTo STANDBY
    EndIf 
    
    If JUMPER = 1 Then        
       If VAR1 < 50 Then   
          Cls 
          GoTo FAILSAFE
       EndIf
                
       If VAR1 > 650 Then   
          Cls  
          GoTo FAILSAFE
       EndIf
    EndIf
           
GoTo START 

;-------------------------------------------------------
; ONTVANGER SIGNAAL INLEZEN EN VERWERKEN.
; PRINT OPDRACHT GEVEN.
; SCHAKELAAR STANDBY INLEZEN.
; REGELAAR VRIJGEVEN.
; FUNCTIE LED AANSTUREN.
; WAARDE BLOKKEREN OP 255.
; MOTOR AANSTUREN EN REGELEN.
; WAARDE CONTROLEREN.
; ALS JUMPER GEPLAATST IS FAILSAFE FUNCTIE CONTROLEREN.
;-------------------------------------------------------                                    
    
RECHTS_OM:


    VAR1 = PulsIn PORTA.5 , 1                  
    WAARDE = (var1-243)*1.20   
    
    Print At 1,1,"H.v.Z-PRODUCT"
    Print At 2,1,"WAARDE:    FORW"
    Print At 2,8,Dec3, WAARDE
                             
    If STANDBY_SCHAK = 0 Then
       Cls 
       GoTo STANDBY
    EndIf
           
    VRIJGAVE = 1
                               
    FUNCTIE_LED = 1
                  
    If WAARDE > 254 Then 
       WAARDE = 255
       Print At 2,1,"WAARDE:255 FORW" 
    EndIf
             
    HPWM 1 , WAARDE , FREQUENTIE        
    HPWM 2 , ~ WAARDE , FREQUENTIE 
                             
    If WAARDE < 138 Then
       Cls 
       GoTo START
    EndIf

    If JUMPER = 1 Then      
       If VAR1 < 50 Then   
          Cls 
          GoTo FAILSAFE
       EndIf
                
       If VAR1 > 650 Then 
          Cls  
          GoTo FAILSAFE
       EndIf       
    EndIf
    
GoTo RECHTS_OM 

;-------------------------------------------------------
; ONTVANGER SIGNAAL INLEZEN EN VERWERKEN.
; PRINT OPDRACHT GEVEN.
; SCHAKELAAR STANDBY INLEZEN.
; REGELAAR VRIJGEVEN.
; FUNCTIE LED AANSTUREN.
; WAARDE BLOKKEREN OP 0.
; MOTOR AANSTUREN EN REGELEN.
; WAARDE CONTROLEREN.
; ALS JUMPER GEPLAATST IS FAILSAFE FUNCTIE CONTROLEREN.
;-------------------------------------------------------                                      

LINKS_OM:


    VAR1 = PulsIn PORTA.5 , 1                  
    WAARDE = (var1-243)*1.20   
    
    Print At 1,1,"H.v.Z-PRODUCT"
    Print At 2,1,"WAARDE:    REV"
    Print At 2,8,Dec3, WAARDE
                            
    If STANDBY_SCHAK = 0 Then
       Cls 
       GoTo STANDBY
    EndIf
          
    VRIJGAVE = 1
                                 
    FUNCTIE_LED = 1
                 
    If WAARDE < 0 Then 
       WAARDE = 0
       Print At 2,1,"WAARDE:000 REV"
    EndIf
                  
    HPWM 1 , WAARDE , FREQUENTIE   
    HPWM 2 , ~ WAARDE , FREQUENTIE 
                             
    If WAARDE > 120 Then   
       Cls 
       GoTo START
    EndIf

    If JUMPER = 1 Then           
       If VAR1 < 50 Then 
          Cls 
          GoTo FAILSAFE
       EndIf 
       If VAR1 > 650 Then 
          Cls 
          GoTo FAILSAFE
       EndIf
    EndIf 
            
GoTo LINKS_OM 

;---------------------------------
; PRINT OPDRACHT GEVEN.
; REGELAAR BLOKKEREN.
; HPWM-1 EN HPWM-2 OP NUL ZETTEN.
; FUNCTIE LED AANSTUREN.
; SCHAKELAAR STANDBY INLEZEN.
;---------------------------------                                

STANDBY:


    Print At 1,1,"H.v.Z-PRODUCT"
    Print At 2,1,"STANDBY"
                                      
    VRIJGAVE = 0
                                
    HPWM 1,0,0                              
    HPWM 2,0,0 
                                
    FUNCTIE_LED = 1                     
    DelayMS 500                       
    FUNCTIE_LED = 0                      
    DelayMS 500
                                
    If STANDBY_SCHAK = 1 Then  
       Cls
       GoTo START
    EndIf
               
GoTo STANDBY

;------------------------------------
; PRINT OPDRACHT GEVEN.
; REGELAAR BLOKKEREN.
; HPWM-1 EN HPWM-2 OP NUL ZETTEN.
; FUNCTIE LED AANSTUREN.
; SCHAKELAAR RESET FAILSAFE INLEZEN.
;------------------------------------                                  

FAILSAFE:


    Print At 1,1,"H.v.Z-PRODUCT"
    Print At 2,1,"FAILSAFE"
                                   
    VRIJGAVE = 0
                               
    HPWM 1,0,0                              
    HPWM 2,0,0
                                  
    FUNCTIE_LED = 1                      
    DelayMS 50                         
    FUNCTIE_LED = 0                       
    DelayMS 50
                                     
    If RESET_FAILSAFE = 1 Then 
       Cls
       GoTo START
    EndIf
         
GoTo FAILSAFE                                  
      
End

Dit is het hele programma voor de modelbouw regelaar, ik heb boven de lussen wat tekst gezet die uitlegt wat er in de desbetreffende lus gebeurt. Ik hoop dat het duidelijk is op deze manier.

De PWM-frequentie staat hier op 10 KHz zodat je niet het irritante gepiep hoort van de regelaar.

Er zijn twee variabelen gebruikt VAR1 en WAARDE, beide staan als woord om dat de WAARDE iets groter kan worden dan 0 tot 255. VAR1 wordt sowieso groter dan 255.

Om de HPWM waarde tussen de 0 en 255 te houden heb ik dit gedaan:

If WAARDE > 254 Then 
   WAARDE = 255
   Print At 2,1,"WAARDE:255 FORW" 
EndIf

Dat is er voor om te zorgen dat de waarde niet boven de 255 uit kan komen, we hebben in de formule gezien dat die waarde iets groter kan worden. Namelijk 256.8 en als we de trim functie van de zender gebruiken kan dat verschil nog iets groter worden. En om de HPWM waarde niet kleiner te laten worden dan 0, doen we dit:

If WAARDE < 0 Then 
   WAARDE = 0
   Print At 2,1,"WAARDE:000 REV"
EndIf

Op deze manier blijft de HPWM waarde keurig tussen de 0 en 255.

Met de functie LED kunnen we mooi kijken of het ontvanger signaal in het midden staat, de functie LED gaat branden als we de knuppel naar boven of naar beneden bewegen. In de middenstand is de functie LED uit. De functie LED heeft nog twee functies, als de regelaar in de standby stand staat knippert de LED langzaam en als de regelaar in de failsafe staat knippert de LED snel.

Dit was het wel zo'n beetje wat de software betreft voor de modelbouw regelaar zonder stroommeting. Ik ga toch nog even laten zien wat er voor nodig is om de regelaar met een stroommeting uit te rusten.