Positioneren met een hall-sensor

Gepost door Jeroen Vreuls op woensdag 10 november 2021 22:40

De software van de controller voor Profilab

We gaan nu naar het programma van de controller kijken.

'*  Name    : POSITIE REGELING MET HALL-SENSOR EN PROFILAB.                                      
'*  Author  : H. van Zwieten                                    
'*  Notice  : Copyright (c) 2021 H.v.Z.                         
'*          : All Rights Reserved                               
'*  Date    : 21-10-2021                                        
'*  Version : 1.0                                               
'*  Notes   : POORT C.7 = RX EN POORT C.6 = TX BIJ GEBRUIK HSERIAL.
                                                  
Device 16F887                               ; Processor type

Xtal 10                                     ; Kristal 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 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

Declare Hserial_Baud 9600                   ; Set baudrate op 9600
Declare Hserial_RCSTA %10010000             ; Register instelling
Declare Hserial_TXSTA %10100110             ; Register instelling 
Declare Hserial_Clear = On                  ; Reset buffer bij een overflow 

Declare CCP1_Pin PORTC.2                    ; HPWM 1 op poort C.2

Symbol FREQUENTIE = 10000                   ; HPWM frequentie 10KHz

Symbol PULS = PORTA.1                       ; Ingang hall-sensor

Symbol S1 = PORTE.0                         ; Ingang invoer / reset ingave
Symbol S2 = PORTE.1                         ; Ingang As op nul zetten

Symbol RECHTS   = PORTC.0                   ; Uitgang motor rechtsom
Symbol LINKS    = PORTC.1                   ; Uitgang motor linksom
Symbol PULS_LED = PORTE.2                   ; Uitgang puls-led

Dim POSITIE As Word                         ; Variabele positie
                                    
Dim TOEREN As Byte                          ; Variabele toerental motor

Dim HERHALING As Byte                       ; Variabele herhaling

Dim DATA_1 As Byte                          ; Variabele data-1

Dim DATA_2 As Byte                          ; Variabele data-2

Dim TEL_BIT As Byte                         ; variabele tel-bit

Dim WAARDE As Word                          ; variabele waarde

Dim TELLER As Byte                          ; Variabele teller

Cls                                         ; Wis display

DelayMS 1000                                ; Pauze 1 sec 

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  = %011                               ; Poort_E I/O

         ;76543210                          ; Hulpregel analoog
;ADCON0 = %00000001                         ; 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

;--------------------------------------------------------------
; TEST PROGRAMMA POSITIE REGELING MET HALL-SENSOR EN PROFILAB.
;--------------------------------------------------------------

POSITIE = 0
TOEREN = 0
HERHALING = 0
DATA_1 = 0
DATA_2 = 0
TEL_BIT = 0
WAARDE = 0
TELLER = 0
RECHTS = 0
LINKS = 0

AS_NULLEN:


    Print At 1,1, "AS OP NUL ZETTEN"
    
    If S2 = 1 Then
       RECHTS = 1
       LINKS = 0
       HPWM 1,100,FREQUENTIE
    EndIf
    
    If S2 = 0 Then
       RECHTS = 0
       LINKS = 0
       HPWM 1,0,FREQUENTIE
    EndIf
    
    If S1 = 1 Then
       GoTo INVOER
    EndIf
    
GoTo AS_NULLEN
        
INVOER:


    Cls

    HSerIn [DATA_1, DATA_2, TOEREN, HERHALING] 
    
    POSITIE = ((DATA_1 * 100) + DATA_2)
    
    Print At 1,1, Dec5, POSITIE
    
    Print At 1,7, Dec3, TOEREN
    
    Print At 1,11, Dec3, HERHALING 
    
    DelayMS 2000
    
    GoTo RUN_RECHTS
    
GoTo INVOER

RUN_RECHTS:


    LINKS = 0
    RECHTS = 1
    
    Print At 2,1, Dec4 WAARDE

    If PULS = 1 Then
       TEL_BIT = 1
       PULS_LED = 0
    EndIf 

    If PULS = 0 Then
       If TEL_BIT = 1 Then
          WAARDE = WAARDE + 1
          TEL_BIT = 0
          PULS_LED = 1
       EndIf
    EndIf
    
    If WAARDE > = POSITIE Then
       LINKS = 0
       RECHTS = 0
       DelayMS 1000
       GoTo RUN_LINKS
    EndIf
    
    If S1 = 1 Then
       HERHALING = 0
       GoTo RESET_INGAVE
    EndIf
    
    HPWM 1,TOEREN,FREQUENTIE
     
GoTo RUN_RECHTS

RUN_LINKS: 


    RECHTS = 0
    LINKS = 1

    Print At 2,1, Dec4 WAARDE

    If PULS = 1 Then
       TEL_BIT = 1
       PULS_LED = 0
    EndIf 

    If PULS = 0 Then
       If TEL_BIT = 1 Then
          WAARDE = WAARDE - 1
          TEL_BIT = 0
          PULS_LED = 1
       EndIf
    EndIf
    
    If S1 = 1 Then
       HERHALING = 0
       GoTo RESET_INGAVE
    EndIf
    
    If WAARDE < 1 Then
       LINKS = 0
       RECHTS = 0
       DelayMS 1000
       GoTo RESET_INGAVE
    EndIf
    
    HPWM 1,TOEREN,FREQUENTIE
       
GoTo RUN_LINKS

RESET_INGAVE:


    RECHTS = 0
    LINKS = 0
    WAARDE = 0
    
    TELLER = TELLER + 1
    
    HSerOut [10]
    DelayMS 100
    HSerOut [0]
   
    If TELLER > = HERHALING Then
       HSerOut [20]
       DelayMS 100
       HSerOut [0]
       TELLER = 0
       TOEREN = 0
       HPWM 1,TOEREN,FREQUENTIE
       GoTo INVOER
    EndIf
    
    DelayMS 1000

    GoTo RUN_RECHTS
    
GoTo RESET_INGAVE

End

Zoals je kunt zien is er wel wat veranderd ten opzichte van het eerste programma. In het vorige voorbeeld hadden we twee schakelaars (S1 en S2), één schakelaar was voor de vrijgave en één schakelaar om de as op nul te zetten. Deze twee schakelaars blijven, alleen S1 krijgt een andere functie. S1 krijgt de functie invoer / reset ingave. Ook kun je zien dat er wat variabelen bijgekomen zijn en dat de declaratie voor de seriële poort is toegevoegd. De baudrate staat op de standaard waarde van 9600 baud.

Het begint met AS_NULLEN, dat gebeurt met schakelaar S2. Hier heeft Profilab dus niets mee te maken, dat gebeurt helemaal buiten Profilab om.

Onder INVOER kun je zie dat DATA_1, DATA_2, TOEREN en HERHALING binnenkomen, verstuurd door Profilab. DATA_1 en DATA_2 bevatten de waarde voor de positie van de as, deze waardes worden in de variabele POSITIE gezet. Dat gebeurt door deze formule: POSITIE = (DATA_1 * 100) + DATA_2. Hier kun je zien hoe die twee waardes weer samen gevoegd worden als de waarde groter is dan 255 zoals eerder uitgelegd onder grote waardes verzenden.

Onder RESET_INGAVE kun je zien dat de waardes 10 en 20 verzonden worden, als de voorwaarden kloppen. In die lus wordt de teller iedere keer met één opgehoogd, als de teller opgehoogd is wordt de waarde 10 verzonden door de controller. Ook wordt in die zelfde lus de teller stand vergeleken met het ingegeven aantal herhalingen. Als die waarde groter of gelijk is aan de ingegeven waarde, dan wordt de waarde 20 verzonden door de controller.

De ontvangen waardes verzonden door Profilab worden ook op een display getoond, op deze manier kun je controleren of ontvangen waardes kloppen met de verzonden waardes. Want serieel blijft toch wel een beetje een dingetje, het werkt wel of het werkt niet.

Dit was het weer zo'n beetje, maar zoals je gezien hebt is het goed mogelijk om de positie van een as te bepalen met een hall-sensor. Zolang de vertraging achter de motor maar groot genoeg is, is dit het geval dan is het geen probleem. Zo'n hall-sensor wordt vaak gebruikt voor dit soort doeleinden zoals beschreven in het begin van het artikel.

Reacties

Gepost door elmowww op donderdag 25 november 2021 11:11

Leuk artikel, wellicht een goed idee om de auteur duidelijk in het artikel te vermelden? (Lambiek)?

Gepost door Lambiek op donderdag 25 november 2021 17:58

Leuk artikel,...

Bedankt!

wellicht een goed idee om de auteur duidelijk in het artikel te vermelden? (Lambiek)?

Dat ben ik inderdaad. Onder artikelen staat het erbij.

[Reactie gewijzigd op donderdag 25 november 2021 18:04]

Als je ingelogd bent kun je een reactie plaatsen.