Positioneren met een hall-sensor

Gepost door Jeroen Vreuls op woensdag 10 november 2021

De software

We gaan nu naar de software kijken.

Het programma is gemaakt in PIC-BASIC en de gebruikte controller is een PIC16F887. De controller draait hier op 10 MHz. Dit is een controller die ik veel gebruik voor het testen en aansturen van diverse zaken. En ik gebruik de controller dan ook bij veel artikelen.

'*  Name    : POSITIE REGELING MET HALL-SENSOR.                                     
'*  Author  : H.van Zwieten.                                    
'*  Notice  : Copyright (c) 2021 H.v.Z.                         
'*          : All Rights Reserved                               
'*  Date    : 16-10-2021                                        
'*  Version : 1.0                                               
'*  Notes   : 360 GRADEN VAN DE UITGAANDE AS VAN DE VERTRAGING-
'*  Notes   : IS 110.592 PULSEN VAN DE HALL-SENSOR.                                                  
'*  Notes   : IN HET VOORBEELD MAAKT DE AS 10 ROTATIES.

Device 16F887                     ; Processor type

Xtal 10                           ; Kristal 10Mhz

Asm                               ; Config settings  HS_OSC
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 CCP1_Pin PORTC.2          ; HPWM Uitgang

Symbol FREQUENTIE = 10000         ; HPWM frequentie 10KHz

Symbol PULS = PORTA.1             ; Ingang hall-sensor

Symbol S1 = PORTE.0               ; Ingang vrijgave
Symbol S2 = PORTE.1               ; Ingang as op nul zetten

Symbol WAARDE_POSITIE = 1106      ; Waarde positie as ingeven

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

Dim WAARDE As Word                ; Variabele waarde positie

Dim TEL_BIT As Byte               ; variabele tel-bit

Dim TOEREN As Byte                ; Variabele toerental motor

Cls                               ; Wis display

DelayMS 1000                      ; Pauze 1 seconden

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

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

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

         ;543210                  ; Hulpregel analoog poort_B
;ANSELH = %000000                 ; ANSEL register analoog poort_B

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

RECHTS   = 0
LINKS    = 0

START:


    Print At 1,1, Dec4 WAARDE

    TOEREN = ADIn 0
    
    HPWM 1,TOEREN,FREQUENTIE

    If S1 = 1 Then
       GoTo RUN_RECHTS
    EndIf
    
    If S2 = 1 Then
       RECHTS = 1
       Else RECHTS = 0
    EndIf

GoTo START

RUN_RECHTS:


    LINKS = 0
    RECHTS = 1
    
    TOEREN = ADIn 0

    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
          Print At 1,1, Dec4 WAARDE
       EndIf
    EndIf
   
    If WAARDE > = WAARDE_POSITIE Then
       Cls
       GoTo RUN_LINKS
    EndIf
    
    If S1 = 0 Then
       GoTo RESET_WAARDE
    EndIf
    
    HPWM 1,TOEREN,FREQUENTIE

GoTo RUN_RECHTS: 

RUN_LINKS:


    RECHTS = 0
    LINKS = 1

    TOEREN = ADIn 0

    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
          Print At 1,1, Dec4 WAARDE
       EndIf
    EndIf
    
    If WAARDE < 1 Then
       Cls
       GoTo RUN_RECHTS
    EndIf
    
    If S1 = 0 Then
       GoTo RESET_WAARDE
    EndIf
    
    HPWM 1,TOEREN,FREQUENTIE

GoTo RUN_LINKS: 

RESET_WAARDE:


    Print At 1,1, Dec4 WAARDE
    Cls
    
    RECHTS = 0
    LINKS = 0
    WAARDE = 0
    
    GoTo START
    
GoTo RESET_WAARDE

End

Zoals je kunt zien zijn er een paar schakelaars toegevoegd om de motor te bedienen. Deze schakelaars staan niet in het principe schema. Met S1 kun je de motor starten en stoppen. Met S2 kun je de as in een bepaalde positie zetten of de as op het nulpunt zetten. Er zit ook een potmeter op de controller aangesloten om het toerental van de motor te regelen.

Er zit voor de test ook een display op de controller aangesloten om de binnenkomende pulsen te controleren. Verder zijn er vier uitgangen gebruikt, twee voor de richting (linksom en rechtsom), één voor het PWM-signaal (om het toerental van de motor te regelen) en één voor de puls LED (als controle voor de puls die van de hall-sensor). De PWM-frequentie staat op 10 KHz ingesteld.

Bij WAARDE_POSITIE is het getal 1106 ingevuld. We weten dat de motor 110,592 omwentelingen moet maken voor één rotatie van de uitgaande as van de planetaire vertraging, dus om er tien te maken krijgen we 10 x 110,592 = 1105,92. Afgerond maken we daar 1106 van omdat de controller met hele getallen werkt.

In het programma maakt de uitgaande as van de planetaire vertraging eerst tien omwentelingen naar rechts en daarna tien omwentelingen naar links.

Voor het tellen van de binnen komende pulsen is er een TEL_BIT aangemaakt, deze bit wordt hoog gezet als er een puls binnen komt. Als de puls weg is en de tel-bit is nog één, dan wordt de WAARDE met één opgehoogd. Als de WAARDE is opgehoogd, dan wordt de TEL_BIT weer op nul gezet totdat de volgende puls weer binnen komt. Bij het linksom draaien gebeurt precies hetzelfde, maar dan wordt de WAARDE tekens met één verlaagd.

De WAARDE wordt vergeleken met de ingegeven waarde bij WAARDE_POSITIE, als de WAARDE groter is of gelijk aan de WAARDE_POSITIE gaat de motor de andere kant op draaien.

WAARDE_POSITIE is nu een vast gegeven, die zou je ook variabel kunnen maken met bijvoorbeeld een tweede potmeter of met een paar drukknoppen om de waarde te verhogen of om de waarde te verlagen. Je zou het ook in combinatie met Profilab-Expert kunnen doen en daar ga ik ook een voorbeeld mee maken. Dan kun je de waardes serieel naar de controller sturen via Profilab.