Gepost door Jeroen Vreuls op woensdag 10 november 2021
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.
Dit artikel is geschreven door Lambiek.
Reacties
Leuk artikel, wellicht een goed idee om de auteur duidelijk in het artikel te vermelden? (Lambiek)?
Bedankt!
Dat ben ik inderdaad. Onder artikelen staat het erbij.
[Reactie gewijzigd op donderdag 25 november 2021 18:04:54]
In het schema van de regelaar staat "T1 t/m T4 goed koelen". Ik zie geen T1 t/m T4. Wel T7 t/m T10
Dat zie ik nu ook. Dat komt omdat ik het een aantal maal gekopieerd heb, dan hoogt het getal op zo te zien. Gebeurt ook met de andere componenten. Maar het schema wijst voor zich denk.
[Reactie gewijzigd op zaterdag 1 januari 2022 19:50:02]
Als je ingelogd bent kun je een reactie plaatsen.