Mini-motorregelaar met terugkoppeling

Gepost door Jeroen Vreuls op woensdag 27 september 2017 22:07

Software voor besturing

Ik heb ook een paar software voorbeelden gemaakt in PICBASIC, de gebruikte controller is een PIC16F887.

Stroombegrenzing

'*  Name    : BESTURING MINI MOTORREGELAAR.                                     
'*  Author  : H.van Zwieten.                                    
'*  Notice  : Copyright (c) 2017 H.v.Z.                         
'*          : All Rights Reserved                               
'*  Date    : 13-9-2017                                         
'*  Version : 1.0                                               
 
Device 16F887                     ; Processor type
 
Xtal 10                           ; Cristal 10Mhz
 
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 Adin_Res = 8              ; resolutie 8 bits
Declare Adin_Tad = frc            ; set RC osc
Declare Adin_Stime = 50           ; sample tijd 5
 
Declare CCP1_Pin PORTC.2          ; pwm 1 op poort C.2
Declare CCP2_Pin PORTC.1          ; pwm 2 op poort C.1
 
Symbol VRIJGAVE = PORTC.0         ; Vrijgave regelaar
 
Symbol FREQUENTIE = 5000          ; PWM frequentie 5KHz
 
Dim POTMETER As Byte              ; Variabele waarde potmeter
 
Dim TERUGKOPPELING As Byte        ; Variabele waarde terugkoppeling
 
Clear                             ; Wis geheugen 
 
         ;543210                  ; Hulpregel poort A
PORTA  = %000000                  ; Maak poort A laag
TRISA  = %111111                  ; Poort_A I/O
 
         ;543210                  ; Hulpregel poort B
PORTB  = %000000                  ; Maak poort B laag
TRISB  = %111111                  ; 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  = %111                     ; Poort_E I/O
 
         ;76543210                ; Hulpregel analoog
ADCON0 = %00000001                ; ADCON0 register analoog
 
         ;543210                  ; Hulpregel analoog poort_B
ANSELH = %000000                  ; ANSEL register analoog poort_B
 
;--------------------------------------------
; VOORBEELD STROOMMETING MINI MOTORREGELAAR.
;--------------------------------------------
 
RUN::
    POTMETER = ADIn 0
    TERUGKOPPELING = ADIn 1
 
    VRIJGAVE = 1
 
    If TERUGKOPPELING > 150 Then  
     GoSub OVERSTROOM
    EndIf
 
    HPWM 1,POTMETER,FREQUENTIE 
    HPWM 2,~POTMETER,FREQUENTIE  
GoTo RUN
 
OVERSTROOM:
    VRIJGAVE = 0   
    Return
GoTo OVERSTROOM
 
End

In het eerste programma wordt alleen de stroom begrensd op een bepaalde waarde, de waarde kan aangepast worden in deze regel: IF TERUGKOPPELING > 150 THEN. Door de waarde 150 groter of kleiner te maken zal de motor later of eerder begrensd worden.

Er worden twee analoge ingangen gebruikt: A0 en A1. Op A0 zit de potmeter en op A1 komt het terugkoppel signaal binnen uit de regelaar. Je kan ook zien dat hier twee PWM-signalen gebruikt worden en één vrijgave signaal. Het vrijgave signaal schakelt de regelaar uit bij overstroom, en schakelt direct weer terug naar de RUN lus. Dit blijft net zolang herhalen tot de stroom weer onder de waarde van 150 komt.

Stroombegrenzing en constant toerental

Het tweede programma werkt weer iets anders, daar wordt de stroom begrensd en de regelaar probeert het toerental gelijk te houden bij belasting van de motor.

'*  Name    : BESTURING MINI MOTORREGELAAR_1                                     
'*  Author  : H.van Zwieten.                                    
'*  Notice  : Copyright (c) 2017 H.v.Z.                         
'*          : All Rights Reserved                               
'*  Date    : 15-9-2017                                         
'*  Version : 1.0                                               
'*  Notes   :                                                   
 
Device 16F887                     ; Processor type
 
Xtal 10                           ; Cristal 10Mhz
 
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 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 Adin_Res = 8              ; resolutie 8 bits
Declare Adin_Tad = frc            ; set RC osc
Declare Adin_Stime = 50           ; sample tijd 5
 
Declare CCP1_Pin PORTC.2          ; pwm 1 op poort C.2
 
Symbol LINKS  = PORTC.0           ; Uitgang motor linksom
Symbol RECHTS = PORTC.1           ; Uitgang motor rechtsom
 
Symbol S1 = PORTE.2               ; Ingang links / rechts
 
Symbol FREQUENTIE = 5000          ; PWM frequentie 5KHz
 
Dim POTMETER As Byte              ; Variabele waarde potmeter
 
Dim TERUGKOPPELING As Byte        ; Variabele waarde terugkoppeling
 
Dim VERSTERKING As Byte           ; Variabele waarde versterking
 
Clear                             ; Wis geheugen 
 
         ;543210                  ; Hulpregel poort A
PORTA  = %000000                  ; Maak poort A laag
TRISA  = %111111                  ; Poort_A I/O
 
         ;543210                  ; Hulpregel poort B
PORTB  = %000000                  ; Maak poort B laag
TRISB  = %111111                  ; 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  = %111                     ; Poort_E I/O
 
         ;76543210                ; Hulpregel analoog
ADCON0 = %00000001                ; ADCON0 register analoog
 
         ;543210                  ; Hulpregel analoog poort_B
ANSELH = %000000                  ; ANSEL register analoog poort_B
 
;----------------------------------------------
; VOORBEELD STROOMMETING PLUS TERUGKOPPELING -
; TOERENTAL MINI MOTORREGELAAR.  
;----------------------------------------------
 
HPWM 1,0,FREQUENTIE
 
LINKS = 0
RECHTS = 0
 
RUN:
    LINKS = 0
    RECHTS = 0
 
    If S1 = 1 Then
     GoTo LINKSOM
    EndIf
 
    If S1 = 0 Then
     GoTo RECHTSOM
    EndIf     
GoTo RUN
 
LINKSOM:
    POTMETER = ADIn 0
    TERUGKOPPELING = ADIn 1
 
    LINKS = 1
    RECHTS = 0
 
    If S1 = 0 Then
     GoTo RUN
    EndIf
 
    If POTMETER < 2 Then
     HPWM 1,0,FREQUENTIE
    EndIf
 
    VERSTERKING = TERUGKOPPELING / 2
 
    If POTMETER > 2 Then
     HPWM 1,POTMETER / 2 + VERSTERKING,FREQUENTIE
    EndIf
 
    If TERUGKOPPELING > 250 Then  
     GoSub OVERSTROOM
    EndIf   
GoTo LINKSOM
 
RECHTSOM:
    POTMETER = ADIn 0
    TERUGKOPPELING = ADIn 1
 
    RECHTS = 1
    LINKS = 0
 
    If S1 = 1 Then
     GoTo RUN
    EndIf
 
    If POTMETER < 2 Then
     HPWM 1,0,FREQUENTIE
    EndIf
 
    VERSTERKING = TERUGKOPPELING / 2
 
    If POTMETER > 2 Then
     HPWM 1,POTMETER / 2 + VERSTERKING,FREQUENTIE
    EndIf
 
 
If TERUGKOPPELING > 250 Then  
     GoSub OVERSTROOM
    EndIf   
GoTo RECHTSOM
 
OVERSTROOM:
    LINKS = 0
    RECHTS = 0   
    Return
GoTo OVERSTROOM
 
End

Het tweede voorbeeldprogramma is iets uitgebreider, de analoge ingangen zijn hetzelfde gebleven. Er wordt nu maar van één PWM-signaal gebruik gemaakt en een linksom en rechtsom signaal. De richting wordt bepaald met S1. Het PWM-signaal wordt op de regelaar gezet als de potmeter waarde groter is dan twee, en het PWM-signaal gaat eraf als het potmeter signaal kleiner is dan twee. Er is ook een variabele toegevoegd, genaamd VERSTERKING.

Het potmeter signaal wordt door twee gedeeld, net zoals het terugkoppelsignaal. Het gedeelde terugkoppelsignaal wordt in de variabele versterking gezet en daarna wordt het opgeteld bij het gedeelde potmeter signaal. Alle twee de programma's zijn gebruikt samen met de Maxon motor, en daar zijn ook de waardes op berekend. Als je hier een andere motor mee wil testen, dan zul je de gedeelde waardes aan moeten passen. Dus voor de Bühler motor en de RB35 motor moeten die waardes aangepast worden.

Als het slecht uitkomt met de hele getallen, nu dus VERSTERKING = TERUGKOPPELING / 2 dan kun je ook dit gebruiken als variabele: DIM VERSTERKING AS FLOAT. Dan kun je bijvoorbeeld VERSTERKING = TERUGKOPPELING / 1.3 of VERSTERKING = TERUGKOPPELING / 2.2 gebruiken. Dan zit je dus niet aan de hele getallen vast.

De werking van het geheel is als volgt. Als je nu de motoras tegenhoudt, dan voel je dat het koppel van de motor omhoog gaat en dat de regelaar probeert om het toerental constant te houden. Bij overstroom van de motor blijft het motorkoppel gelijk, net als bij het eerste programma. De regelaar kan op deze manier ook nooit overbelast raken.

Je kunt ook een PID programma maken, dan zal het geheel nog beter regelen, maar dat is vrij moeilijk in te regelen. En ik denk niet dat we het te moeilijk moeten maken.