Voorbeelden met Profilab Expert 4.0

Lambiek

Special Member

Het is de bedoeling dat ik in dit topic voorbeelden ga plaatsen met Profilab Expert 4.0 in combinatie met en zonder een microcontroller.

De controller die ik ga gebruiken is een 16F887. Dit type controller ga ik voor alle voorbeelden gebruiken. Maar voor de gene die dit na willen bouwen, een ander type controller kan ook.

Om te kunnen communiceren met Profilab hebben we een USB naar RS232 converter nodig. Of als je nog een seriële poort op de PC hebt, dan is de converter niet nodig natuurlijk.

Dit is in principe genoeg, maar ik heb er ook nog een interface tussen gemaakt voor de galvanische scheiding van het geheel. Op het schema kun je zien dat er een paar optocouplers gebruikt zijn van het type PC817, de optocouplers zijn snel genoeg voor 9600 baud. Hoger gebruik ik nooit, vaak is 2400 baud al ruim voldoende. Het enige wat ik er mee doe is commando's versturen naar de controller, de controller werkt dat verder af. Ik gebruik dit al jaren zo en heb er eigenlijk nooit problemen mee gehad. Voor de communicatie gebruik ik RSIN en RSOUT en dat is niet helemaal te vergelijken met het RS232 signaal, het werkt dus iets anders.

Ik heb ook een klein printje gemaakt voor de interface, alle getoonde printen zijn gemaakt met Sprint-Layout 4.0. Dat gebruik ik altijd vvor printontwerpen.

En hier de print van de gebruikte microcontroller.

Ik ga dit maar één keer laten zien, omdat dit iedere keer gebruikt gaat worden.

De printen worden trouwens hier mee gefreesd, sinds daar jaren geleden nieuwe software voor gekomen is werkt dat uitstekend. In het begin toen het net uit was, was het een ramp.

Als je haar maar goed zit, GROETEN LAMBIEK.
Lambiek

Special Member

Besturing motorregelaar met Profilab.
Voorbeeld – 0001.

In het eerste voorbeeld gaan we een kleine elektromotor besturen met Profilab Expert 4.0 in combinatie met een microcontroller.
Hieronder zie je het programma gemaakt in Profilab.

We beginnen links, daar zie je een formule module staan, een potmeter, een vaste waarde module met de waarde 30 en een display. De potmeter is ingesteld op een waarde tussen de 0 en 225, die waarde wordt opgeteld bij de waarde 30. De minimale waarde die verstuurd wordt is dus altijd 30. Dit heb ik zo gedaan omdat de motor pas reageert bij een waarde van 30, als je nu aan de potmeter draait gaat de motor direct draaien.

De formule in de module zorgt ervoor dat er een waarde tussen de 0 en 100 op het display gezet wordt. De waarde die er uit komt is decimaal, maar de waarde die verstuurd wordt is een string. Dit moet dus eerst omgezet worden en dat wordt gedaan met de CHR module.

Daarna komt de COM module, deze zet de waarde op de com-poort of op de usb poort. Het is net waar je voor kiest, het kan beide. Het signaal wordt met 5Hz verzonden, de led op de interface print staat dus ook te knipperen met 5Hz.

Als er op de drukknop linksom wordt gedrukt, wordt waarde 10 verzonden en waarde 10 komt ook weer terug. Die waarde wordt vergeleken door een vergelijker en als de waarde die binnen komt ook 10 is wordt de led linksom aangezet. Ook worden de drukknoppen vergrendeld door de vergelijkers, zodra er één van de twee knoppen linksom of rechtsom ingedrukt is kan de andere knop niet meer reageren op een indrukking. Dit kan pas weer als er op de stopknop gedrukt is. Dan wordt waarde 0 verzonden en de controller stuurt ook weer een waarde 0 terug.

Als er op de stopknop gedrukt is staan de leds met een frequentie van 1Hz rood te knipperen en na het indrukken van links of rechtsom worden de leds groen. Om het geheel te kunnen bedienen hebben we ook een frontplaat nodig, de bedienelementen komen automatisch op de frontplaat te staan als je ze in het programma naar het veld gesleept hebt. Je moet wel de frontplaat zelf indelen en dat dan op verschillende manieren. Hieronder zie je de indeling van de frontplaat.

Hier zie je de leds, drukknoppen, potmeter en het display waar het pwm percentage op komt te staan. De componenten kun je met een klik van de muis activeren, maar uiteraard niet in de voorbeelden die hier staan.

Hieronder het programma voor de controller.
Het programma is in basic geschreven, net zoals in alle voorbeelden die volgen.

pic basic code:


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 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 Rsin_Pin  PORTB.0                   ; Data in
Declare Rsout_Pin PORTB.1                   ; Data uit

Declare Serial_Baud 9600                    ; Baudrate 9600

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

Symbol FREQUENTIE = 5000                    ; PWM frequentie 5Khz
Symbol MOT_L   = PORTC.0                    ; Motor linksom poort C.0
Symbol MOT_R   = PORTC.2                    ; Motor rechtsom poort C.2

Dim DATA_IN As Byte                         ; Variabele in

Cls                                         ; Wis display

DelayMS 500                                 ; Pauze 0.5 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  = %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  = %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

;---------------------------------------------------------
; PROGRAMMA MOTORSTURING MINI MOTORREGELAAR VIA PROFILAB.
;--------------------------------------------------------- 

DATA_IN = 0
MOT_L = 0
MOT_R = 0 

;--------------------------------------------
; HIER WORDT OP DATA GEWACHT VANUIT PROFILAB.
;--------------------------------------------

RUN:

    DATA_IN = RSIn 
    DelayMS 5
    
    MOT_L = 0
    
    MOT_R = 0
    
    If DATA_IN = 10 Then
     RSOut 10
      DelayMS 5
     GoTo LINKS_OM
    EndIf 
    
    If DATA_IN = 20 Then
     RSOut 20
      DelayMS 5
     GoTo RECHTS_OM
    EndIf 
GoTo RUN

;-----------------------
; MOTOR DRAAIT LINKSOM.
;-----------------------

LINKS_OM:

    DATA_IN = RSIn 
    DelayMS 5
    
    HPWM 2, DATA_IN, FREQUENTIE
     
    MOT_L = 1
    
    MOT_R = 0
    
    If DATA_IN = 0 Then
     RSOut 0
      DelayMS 5
     GoTo RUN
    EndIf
GoTo LINKS_OM

;------------------------
; MOTOR DRAAIT RECHTSOM.
;------------------------

RECHTS_OM:

    DATA_IN = RSIn 
    DelayMS 5
    
    HPWM 2, DATA_IN, FREQUENTIE
    
    MOT_R = 1
    
    MOT_L = 0
    
    If DATA_IN = 0 Then
     RSOut 0
      DelayMS 5
     GoTo RUN
    EndIf
GoTo RECHTS_OM

End
 

Zoals je bovenin het programma kunt zien staat de baud rate hier ook op 9600, dit moet wel corresponderen met de waarde in Profilab anders gaat het niet werken. Je kunt zien dat RSIN op poort B.0 zit en RSOUT op poort B.1. De pwm frequentie staat hier op 5KHz en motor links en motor rechts zitten op poort C.0 en C.2. De pwm frequentie staat op poort C.1.

Onder run zie je dat de controller op data staat te wachten van Profilab, daaronder zie je dat als de waarde 10 binnen komt er ook een waarde 10 verzonden wordt. Als alles klopt gaat de motor nu linksom draaien. In de lus linksom wordt er weer gewacht op data van Profilab en in dit geval is dat de waarde van de potmeter.

Als er dus aan de potmeter gedraaid wordt op de frontplaat zal de motor sneller gaan draaien. Wordt er nu op de stopknop gedrukt op de frontplaat wordt waarde 0 verzonden door Profilab en de controller zend weer een waarde 0 terug. De motor zal nu dus stoppen en het programma staat nu weer in de run lus te wachten op een commando van Profilab.

Voor de andere richting werkt het precies het zelfde, alleen met andere waardes. In principe kun je hier iedere regelaar mee aansturen, ik heb hiervoor de mini motorregelaar gebruikt samen met een RB35 motor.

Hier het schema van de regelaar.

Hier de print van de regelaar.

Op pagina 1 kun je zien waar de poorten zitten op de printplaat van de controller.

Als je haar maar goed zit, GROETEN LAMBIEK.
Lambiek

Special Member

Verzenden van grote waarden met Profilab.
Voorbeeld – 0002.

We gaan nu naar een voorbeeld kijken om grote waarden met Profilab te verzenden. In voorbeeld 1 kon je maar van 0 tot 255 verzenden en dat komt omdat de compoort module maar 8 bit is. Maar daar is wel iets aan te doen, zie voorbeeld.

Op deze manier kun je een waarde van 0 tot 25000 verzenden. De ingegeven waarde wordt gedeeld door 100. Stel dat we een waarde van 10 willen verzenden, die waarde wordt gedeeld door 100 daar komt dus 0.1 uit.

Die waarde gaat door FRAC module en die plaatst de komma. Bovenin zie je dat de twee waardes van elkaar afgetrokken worden, dus 0.1 – 0.1 = 0. Door de eerste compoort module wordt dus de waarde 0 verzonden. Onder zie je dat de waarde uit de FRAC module vermenigvuldigt wordt met 100, dus 0.1 x 100 = 10, de onderste compoort module verzend dus waarde 10.

Nu zul je denken wat heeft dat voor zin. Stel dat we een waarde groter dan 255 verzenden, bijvoorbeeld waarde 1500. Dan krijgen we 1500 gedeeld door 100 = 15, dus de waarde 15 wordt weer door de bovenste compoort module verzonden. Na de FRAC module komt er 0 uit, en die waarde wordt door de onderste compoort verzonden. Nu zul je zeggen dat getal 15 is toch geen 1500, dat klopt maar daar doen we iets mee in het programma van de controller.

Zoals je kunt zien staan er maar twee modules op de frontplaat, dat is de drukknop om de waarde te verzenden en de ingaven module.

We gaan nu naar het programma kijken wat in de 16F887 staat.

pic basic code:


'*  Name    : GROTER DAN 8 BITS ONTVANGEN VAN PROFILAB.                                     
'*  Author  : H van Zwieten.                                    
'*  Notice  : Copyright (c) 2018 H.v.Z.                        
'*          : All Rights Reserved                              
'*  Date    : 16-1-2018                                         
'*  Version : 1.0                                               
'*  Notes   : VOORBEELD - 0002
                                                                                                    
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 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 Rsin_Pin  PORTB.0                   ; Data in
Declare Rsout_Pin PORTB.1                   ; Data uit

Declare Serial_Baud 2400                    ; Baudrate 2400

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

Dim DATA_IN_1 As Byte                       ; Variabele data in 1
Dim DATA_IN_2 As Byte                       ; Variabele data in 2

Dim WAARDE As Word                          ; Variabele waarde

Cls                                         ; Wis display

DelayMS 500                                 ; Pauze 0.5 sec 

Clear                                       ; Wis geheugen


         ;543210                            ; Hulpregel poort A
PORTA  = %000000                            ; Maak poort A laag
TRISA  = %000001                            ; 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  = %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 GROTER DAN 8 BITS ONTVANGEN VAN PROFILAB.
;-----------------------------------------------------

;---------------------
; ZET VARIABELE OP 0.
;---------------------

DATA_IN_1 = 0
DATA_IN_2 = 0

WAARDE = 0

;------------------------------------------------------
; LEES DATA IN 1 EN DATA IN 2.
; ZET DATA IN 1 X 100 + DATA IN 2 IN VARIABELE WAARDE.
; PRINT VARIABELE WAARDE.
; ZET VARIABELE OP 0.
; WIS DISPLAY.
;------------------------------------------------------

RUN:


    DATA_IN_1 = RSIn
    DelayMS 1
    DATA_IN_2 = RSIn
    DelayMS 1
 
    WAARDE = ((DATA_IN_1 * 100) + DATA_IN_2)
    
    Print At 1,1,Dec,WAARDE,
    
    DelayMS 5000
    
    DATA_IN_1 = 0
    DATA_IN_2 = 0
    WAARDE = 0
    
    Cls
    
GoTo RUN

End 

Je kunt zien dat we DATA_IN_1 en DATA_IN_2 binnen krijgen, dat is de data die na elkaar verzonden wordt door Profilab. De binnen komen de waarde wordt in de variabel WAARDE gezet, zoals je kunt zien staat die waarde als woord. Daar past dus een waarde in tussen de 0 en 65535.

Achter WAARDE zie je dit staan, WAARDE = ((DATA_IN_1 * 100) + DATA_IN_2). Hier wordt de binnen komen de data verwerkt door de formule. We hadden als voorbeeld de waarde 1500 genomen en we zagen dat de waarde 15 verzonden werd, die staat dus in DATA_IN_1. En in DATA_IN_2 staat de waarde 0. Hier wordt dus DATA_IN_1 met 100 vermenigvuldigt en dan krijgen we weer de waarde 1500.

Op deze manier kun je dus grote waardes verzenden via 8 bit. Je zou er nog een waarde achter aan kunnen verzenden voor nog grotere waardes, maar dat heb ik zelf nog niet nodig gehad.

Zoals je kunt zien wordt de waarde hier op een display gezet, maar in de software kun je daar allerhande andere zaken mee doen natuurlijk.

Als je haar maar goed zit, GROETEN LAMBIEK.
Lambiek

Special Member

Rc5 zender saa3010 via Profilab.
Voorbeeld – 0003.

Hier een voorbeeld hoe je via Profilab een RC5 signaal kunt verzenden in combinatie met twee microcontrollers. Op deze manier kun je bijvoorbeeld een relaiskaart aansturen via infrarood, eigenlijk kun je er van alles voor verzinnen.

De afstand waarmee ik getest heb is ruim 10 meter in een zonnige omgeving. Ik had nog een aantal SAA3010 IC’s liggen van Phillips en daarmee kun je in totaal 63 verschillende commando’s verzenden.

Hieronder het schema.

Bovenin zie je 8 jumper steek plaatsen, je kunt dus 8 verschillende commando’s per steekplaats verzenden. De lijnen worden doorverbonden doormiddel van 8 optocouplers, de optocouplers worden door de controller aangestuurd en de controller op zijn beurt weer door Profilab via de USB poort.

Je zou het printje ook rechtstreeks door de parallelle poort aan kunnen sturen, maar die kom je niet zo vaak meer tegen op de nieuwe pc’s van tegenwoordig. De twee IR led’s worden aangestuurd door een mosfet van het type IRF540.

Hieronder de het aansluitschema van de print.

Ik heb er ook een printje voor gefreesd, zie hieronder.

Het programma in Profilab stelt ook niets voor, zie hieronder.

Ik heb in het voorbeeld maar twee drukknoppen gemaakt, alleen drukknop 1 en 7. Je kunt zien dat er ook maar twee waardes verzonden worden. In de vaste waarde modules zie je die staan, waarde 1 en waarde 7. De waardes worden weer omgezet naar een string en aangeboden aan de compoort, dat is alles.

Naast de compoort zie je een schermpje staan voor de instellingen van de poort, in dit geval is dat com-3 en 2400baud.

Hieronder de frontplaat, op de frontplaat zie je de twee drukknoppen staan.

Ik heb twee controllers gebruikt in dit voorbeeld één voor het verzenden en de communicatie met Profilab en één voor het ontvangen van de verzonden RC5 IR code. We gaan eerst naar het zend gedeelte kijken.

pic basic code:


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 LCD_Lines 2                         ; Twee lijns display

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 Rsin_Pin  PORTB.0                   ; Data in
Declare Rsout_Pin PORTB.1                   ; Data uit
Declare Serial_Baud 2400                    ; Baudrate 2400
Declare Serial_Data 8                       ; Acht bit data

Symbol UIT1 = PORTC.0                       ; Uitgang 1
Symbol UIT2 = PORTC.1                       ; Uitgang 2

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

Dim DATA_IN As Byte

Cls                                         ; Wis display

DelayMS 2000                                ; Pauze 2 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  = %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  = %111                               ; 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

;-----------------------
; PROGRAMMA RC5 ZENDER.
;----------------------- 

DATA_IN = 0
UIT1 = 0
UIT2 = 0

RUN:


    DATA_IN = RSIn
    DelayMS 5
    
    If DATA_IN = 1 Then
      GoSub UITGANG1
    EndIf
    
    If DATA_IN = 7 Then
      GoSub UITGANG2
    EndIf
    
GoTo RUN
    
UITGANG1:


    UIT1 = 1
    DelayMS 300
    UIT1 = 0
    Return
    
UITGANG2:


    UIT2 = 1
    DelayMS 300
    UIT2 = 0
    Return

End

Zoals je kunt zien staat de baud rate hier ook op 2400 baud, net zoals in het Profilab programma. er staan twee uitgangen gedefinieerd die de twee optocouplers aansturen. In dit geval zijn dat optocoupler één en zeven. De jumper op de IR print staat hier dus op steekplaats X0.

In het programma kun je zien dat DATA_IN 1 en DATA_IN 2 afgevraagd wordt, deze waardes worden dus door Profilab verzonden als er op de knoppen 1 of 7 gedrukt wordt. Als de juiste data ontvangen wordt, wordt uitgang 1 of uitgang 7 voor 300mS hoog. Meer doet dit programma niet.

We gaan nu naar het programma van het ontvang gedeelte kijken.

pic basic code:


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 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 RC5In_Pin PORTB.0              ; ir ontvanger op poort B.0

Symbol LED1 = PORTC.0                  ; Uitgang led 1
Symbol LED2 = PORTC.1                  ; UItgang led 2
                                                                                               
Dim rc5_commando As Byte               ; variabele RC5 commando 

Cls                                    ; Wis display

Clear                                  ; Wis geheugen 

DelayMS 2000                           ; Wacht 2 seconden

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

         ;543210                       ; Hulpregel poort B
PORTB  = %000000                       ; Maak poort B laag
TRISB  = %000001                       ; 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
;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

;---------------------------------
; PROGRAMMA UITLEZEN IR COMMANDO.
;---------------------------------

START:
                                        

    Print At 1,1,"COMMANDO"
                    
    Repeat                                  
    rc5_commando = RC5In                   
    Until rc5_commando <> 255              
    Print At 1,10,Dec rc5_commando , "  "  
    
    If rc5_commando = 1 Then
      GoSub UIT1
    EndIf
    
    If rc5_commando = 7 Then
      GoSub UIT2
    EndIf

GoTo START 

UIT1:


    Toggle LED1
    DelayMS 500
    Return
    
UIT2:


    Toggle LED2
    DelayMS 500
    Return                                   

End                                           
 

Picbasic heeft een RC5_IN commando om eenvoudig een RC5 code in te lezen zoals je hierboven kunt zien. De TSOP1738 ziet op poort B.0 zoals je kunt zien, op deze poort komt het IR signaal dus binnen.

Er zijn twee uitgangen gedefinieerd die een led aan zetten als er een 1 of een 7 binnen komt. De uitgangen voor de led's hebben hier een toggle functie zoals je kunt zien. Verder valt er weinig over te vertellen en als er vragen zijn hoor ik het wel.

Tot zover dit voorbeeld.

Als je haar maar goed zit, GROETEN LAMBIEK.
Lambiek

Special Member

Dobbelsteen gooien met Profilab.
Voorbeeld – 0004.

We gaan nu een voorbeeld bekijken hoe je bijvoorbeeld een dobbelsteen waarde kunt gooien met Profilab. Je kunt de dobbelsteen waarde laten zien door op de knop gooien te drukken op de frontplaat of door op de knop te drukken die aan de controller zit. Als je het via de controller doet wordt er een waarde door de controller verzonden via de USB poort.

Hieronder het programma in Profilab.

Boven in het programma zie je een random generator staan die een waarde van 1 tot 6 genereerd, dit proces gaat achter elkaar door zodra het programma opgestart wordt. Daar achter staat een sample and hold module die de geselecteerde waarde vast houd. De waarde van de sample and hold module stuurt de analoge waarde naar een A/D converter. Daar achter hangen een paar and poorten voor het tekst en hex display. Daar wordt ook de waarde weer omgezet door een D/A converter voor de diaprojector die de dobbelsteen laat zien als er gegooid is.

De diaprojector kun je laden onder eigenschappen met bijvoorbeeld een JPEG of BITMAP bestand. Ik heb de plaatjes met Frontdesigner gemaakt en geëxporteerd naar een BITMAP en geladen in de diaprojector.

Als er nu op de knop gooien gedrukt wordt, dan wordt er voor twee seconden een waarde gesampled van de random generator. Als de tijd verstreken is wordt de desbetreffende dobbelsteen getoond door de diaprojector en de waarde in tekst en in een getal.

Onderaan kun je zien dat er ook een compoort in het programma gebruikt wordt, achter de compoort staat een D/A converter met een vergelijker. Als de waarde 100 binnen komt van de controller wordt er ook weer een waarde gegenereerd.

Hieronder de frontplaat.

Op de frontplaat zie de componenten staan, dit zijn de drukknop gooien, busy led, tekst display, hex display en de diaprojector staan. Dit is de frontplaat als het programma niet draait.

Hieronder een paar frontplaten als er gegooid is.

Hier is drie gegooid.

Hier is vijf gegooid.

We gaan nu naar het programma van de controller kijken.

pic basic code:


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 LCD_Lines 2                         ; Twee lijns display

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 Rsin_Pin  PORTB.0                   ; Data in
Declare Rsout_Pin PORTB.1                   ; Data uit
Declare Serial_Baud 2400                    ; Baudrate 2400
Declare Serial_Data 8                       ; Acht bit data

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

Symbol S1 = PORTA.0                         ; Ingang schakelaar

Dim DATA_IN As Byte                         ; Variabele data in

Cls                                         ; Wis display

DelayMS 2000                                ; Pauze 2 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  = %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  = %111                               ; 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

;---------------------------------
; WAARDE VERSTUREN NAAR PROFILAB.
;--------------------------------- 


RUN:


    If S1 = 1 Then
      RSOut 100
      DelayMS 1000
      RSOut 0
    EndIf
    
GoTo RUN
    
End

Het programma stelt weer niet veel voor, we hebben de drukknop S1 die op poort A.0 zit en meer eigenlijk niet. Als nu de drukknop ingedrukt wordt dan wordt de waarde Op het interface printje zie je de led dus twee maal een keer oplichten, één maal als de waarde 100 verzonden wordt en één maal als de waarde 0 verzonden wordt. Dit is eigenlijk alles wat er gebeurd. De waarde wordt weer met 2400 baud verstuurd.

Dit was het weer wat dit voorbeeld betreft.

Als je haar maar goed zit, GROETEN LAMBIEK.
Lambiek

Special Member

Het werd weer eens tijd om iets te maken in Profilab. :)

Hier een voorbeeld voor een BMI meter gemaakt in Profilab.

Normaal zet ik hier voorbeelden neer die ook samen werken met een controller, maar dit is alleen een voorbeeld met Profilab dus zonder controller.

Hieronder zie je de schakeling.

En hieronder de frontplaat voor het invullen van de data.
Hier wordt de waarde getoond van een normaal gewicht.

Op de frontplaat kun je het gewicht, lengte en de omtrek van je middel ingeven. Daarna wordt direct de BMI waarde, enz. getoond.

Je kunt ook kiezen tussen man of vrouw, voor vrouwen gelden andere waardes.

onder op de frontplaat staat wat het vet percentage mag zijn bij een bepaalde leeftijd.

Hieronder nog een voorbeeld van een waarde met overgewicht.

Zoals je kunt zien zijn dit geen beste waardes voor een gezond leven.

Ik vond het wel leuk om zoiets eens te maken, de formule komt van het net en is verwerkt in het programma.

Als je haar maar goed zit, GROETEN LAMBIEK.
Jeever

Golden Member

Voor die lezers die ProfiLab Expert helemaal niet kennen heb ik al in 2018 een kennismakingsartikel geschreven op mijn blog:
https://verstraten-elektronica.blogspot.com/p/profilab-expert-bloksche…

Bezoek mijn elektronica-hobby blog https://verstraten-elektronica.blogspot.com/
PE9SMS

Special Member

Grafisch programmeren en de mogelijkheid om een grafische user interface te maken. Doet me sterk denken aan NI Labview en Keysight (HP/Agilent) VEE.

This signature is intentionally left blank.
Lambiek

Special Member

Op 22 maart 2023 17:27:53 schreef PE9SMS:
Grafisch programmeren en de mogelijkheid om een grafische user interface te maken. Doet me sterk denken aan NI Labview en Keysight (HP/Agilent) VEE.

Het is een beetje vergelijkbaar, alleen niet zo vreselijk duur.

De software van de Siemens Logo is net zoiets.

Op 22 maart 2023 17:16:07 schreef Jeever:
Voor die lezers die ProfiLab Expert helemaal niet kennen heb ik al in 2018 een kennismakingsartikel geschreven...

Ik ook, maar dan iets eerder. In 2015 heb ik een boek geschreven over het werken met Profilab.

https://www.circuitsonline.net/artikelen/view/46

Ik heb het toen nog aangeboden bij Elektor, maar omdat er geen producten van Elektor in voorkwamen wilde ze het niet publiceren. Alleen maar commercieel gedoe daar. Ze wilden het wel hebben, als ik de producten van Elektor erin verwerkte.

Als je haar maar goed zit, GROETEN LAMBIEK.
Lambiek

Special Member

TEST COMPOORT DIRECT MET PROFILAB.

In Profilab heb je een module waarmee je de com-poort in je pc kunt benaderen. Daarmee kun je via DTR, RTS, en TXD signalen uitsturen en via CTS, DSR, RI en DCD signalen binnenhalen. Dus als je op je pc nog een com-poort hebt, kun je die nog gebruiken om verschillende zaken aan te sturen.

Met deze opstelling kun je dus een kleine interface maken met drie uitgangen en vier ingangen.

Hieronder het schema van de interface.

Voor de galvanische scheiding gebruik ik een optocoupler van het type PC817 en voor de buffering van de uitgang een ULN2003. Hier kan ik dan bijvoorbeeld relais mee schakelen met 12VDC. De ULN2003 is TTL/C-MOS compatible, dus die mag 5VDC op de ingang hebben. Door nu 4k7 aan de ingang toe te voegen kun je ze voor 12VDC gebruiken.

Ik heb een kleine test gedaan om de snelheid van de signalen te meten, met Profilab kun je max 1kHz genereren via een generator module. Maar het ontvangen heb ik eigenlijk nooit getest.

Hieronder de opzet voor de test.

Via de schuifpotmeter kan ik een signaal van 0 tot 1kHz genereren via de DTR pin. En via de DCD pin kan ik een signaal binnen halen in Profilab.
Hieronder de frontplaat.

Hier stuur ik 500Hz uit naar de DTR pin.

De meting heb ik met een DSO – TC2 gedaan, die heb ik laatst aangeschaft. En ik moet zeggen voor deze toepassing is het een leuk hand health scope en er zit ook een componenten tester in.

Hieronder het vervolg.

Als je haar maar goed zit, GROETEN LAMBIEK.
Lambiek

Special Member

En hier stuur ik 1kHz uit naar de DTR pin.

Met de meting.

Hier haal ik een signaal binnen op de DCD pin, ik stuur met de DSO – TC2 een duty cycle signaal uit van 1kHz. (de rechtste meter) Gelijktijdig stuur ik een signaal naar de DTR pin van 500 Hz. (de linkse meter) Dit gaat allemaal goed, je kunt gelijktijdig 1kHz verzenden en ontvangen.

Maar hoger dan 1kHz werkt niet, het gaat dan teveel afwijken. Waar dat precies door komt weet ik zo niet, waarschijnlijk verstuurt en meet Profilab niet hoger dan 1kHz. Maar ik vind dit redelijk snel en is voor veel doeleinden dan ook meer dan genoeg.

Op deze manier kun je dus een kleine interface maken met drie uitgangen en vier ingangen.

Het is allemaal niet supper snel, maar vele malen sneller dan bijvoorbeeld een K8055 of een K8061.

Als je haar maar goed zit, GROETEN LAMBIEK.
Lambiek

Special Member

Naar aanleiding van het artikel K16f887 interface met Profilab-Expert, https://www.circuitsonline.net/artikelen/view/64 heb ik nog een voorbeeld gemaakt met een relaiskaart en een motorregelaar. De motorregelaar kun je bedienen via Profilab, met een schuif potmeter kun je de richting en het toerental van de motor bedienen. Als je het programma opstart, dan wordt de schuif potmeter in het midden gezet en staat de motor dus stil. Beweeg je de schuif potmeter nu naar boven of naar beneden, dan zal de motor een bepaalde kant op lopen en het toerental zal verhoogt worden.

Dit kan met één schuif potmeter, alleen moet het signaal uit de schuif potmeter geïnverteerd worden. Dit kan met een KT module, zie hieronder.
Hier kun je zien dat de waardes geïnverteerd zijn ten opzichte van elkaar.

Je bied de interface dus twee signalen aan met één schuif potmeter, de twee signalen worden ingelezen in de controller en de controller stuurt weer twee geïnverteerde PWM signalen uit naar de motorregelaar.

Hieronder zie je het gedeelte voor de besturing van de motorregelaar. Je ziet de twee led-balken, de schuif potmeter en de KT module. Je kunt zien dat beide signalen op de pinnen DO-C1 en DO-C2 binnenkomen, dit zijn de twee PWM poorten op de controller. Op deze manier stuur je dus de PWM pinnen aan.

Hieronder de frontplaat.

Op de frontplaat kun je zien dat de motorregelaar bedient is, ook kun je zien dat de ene led-balk omhoog gaat en de andere led-balk naar beneden. Dat is dus het geïnverteerde signaal uit de schuif potmeter. Onder de schuif potmeter zie je START VOORWAARDE MOTOR staan, deze knippert als de schuif potmeter in het midden staat, je moet eerst de schuif potmeter één tikje verschuiven wil je het vrijgave signaal naar de controller kunnen sturen.

De schuif potmeter kun je met de computermuis bedienen doormiddel van aan het scrolwieltje te draaien, dit kan dus met één klikje tegelijk. Als START VOORWAARDE MOTOR niet meer knippert kun je C0 – AAN bedienen, daar zit het vrijgave signaal voor de motorregelaar op.
Verder zie je dat uitgang A0, A2 en E2 aan zijn, deze uitgangen sturen de relaiskaart aan. Ook kun je zien dat ingang B5 hoog is, die wordt bediend door een schakelaar die op een ingang van de controller zit. In totaal zitten er 10 ingangen op de interface en 12 uitgangen.
Hieronder een foto van het geheel.

Je ziet de waarde (heb ze even pot1 en pot2 genoemd) van de schuif potmeter op het display staan, 160 en 95. Dit zijn de twee geïnverteerde waardes die naar de controller gaan. Ook kun je zien dat relais 1, 3 en 8 hoog zijn, corresponderend met wat er op de frontplaat staat.
Op de frontplaat zie je ook nog een drukknop met de tekst AFSLUITEN, daar sluit je Profilab mee af. Maar ook de uitgangen die op dat moment hoog zijn worden eerst laag gezet voordat het programma afgesloten wordt. Dat is bijvoorbeeld niet het geval bij de K8055 van Velleman, die blijven hoog als je het programma afsluit.

Hieronder nog een totaal plaatje van de schakeling in Profilab.

Boven aan zie je het gedeelte voor de START VOORWAARDE, links zie je het uitgang gedeelte met de potmeter en de schakelaars en rechts het ingang gedeelte waar je bijvoorbeeld een led, teller , schrijver, enzovoort aan kunt sluiten. Rechtsonder zie je een MONO FLOP module met de STOP module staan, die zorgen voor het afsluiten van het programma.

Hier nog een korte video.

https://www.youtube.com/watch?v=bJLyikYjbis

Als je haar maar goed zit, GROETEN LAMBIEK.
Lambiek

Special Member

DOSEERSYSTEEM MET PROFILAB.

Ik heb een voorbeeld gemaakt in Profilab Expert 4.0 voor een doseersysteem, dit werkt samen met een 16F887 controller. De doseerschuif wordt aangestuurd door een zware servo, waar de slag instelbaar van is. Doormiddel van draaimagneten wordt er een doseerschuif gekoppeld aan het schuifsysteem.

Hieronder het schema in Profilab.

Linksboven zie je het generator gedeelte voor de servo, dat gedeelte zorgt ervoor dat de servo heen en weer gaat om de schuif te bedienen. Daarnaast de usb modules die die zorgen voor de communicatie tussen pc en controller.

Hieronder de frontplaat voor de bediening.

Je ziet zes silo’s met daaronder zes signaleringen en zes bedieningsschakelaars. Met de schakelaars kun je een keuze maken welke silo er aan het schuifsysteem gekoppeld moet worden. Op de frontplaat zie je dat silo drie ge koppelt is met het schuifsysteem.
Onder de silo’s staat een controlelamp of de data aanwezig is, deze knippert als er data verkeer is. Daaronder staan twee controlelampen met de tekst doseer 50 en 100%, die wordt bedient door de schakelaar eronder. Links onderin nog een lamp met de tekst run programma en een knop afsluiten, met die knop sluit je het programma af.
Zodra je een silo gekozen hebt wordt er data naar de controller gestuurd die de servo aanstuurt en de desbetreffende draaimagneet bediend.

Hieronder de software voor de controller.

pic basic code:


'*  Name    : DOSEERSYSTEEM MET PROFILAB EN EEN 16F887.                                     
'*  Author  : H. van Zwieten                                    
'*  Notice  : Copyright (c) 2023 H.v.Z.                         
'*          : All Rights Reserved                              
'*  Date    : 9-4-2023                                          
'*  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 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 overflow 

Symbol SERVO_MOT = PORTA.0                  ; Uitgang servo motor
                      
Symbol SILO_1  = PORTA.1                      ; Uitgang 1
Symbol SILO_2  = PORTA.2                      ; Uitgang 2
Symbol SILO_3  = PORTA.3                      ; Uitgang 3
Symbol SILO_4  = PORTA.5                      ; Uitgang 4
Symbol SILO_5  = PORTE.0                      ; Uitgang 5
Symbol SILO_6  = PORTE.1                      ; Uitgang 6

Symbol CONTROLL = PORTA.4                   ; Uitgang controle led

Dim ADRES As Byte                           ; Variabele adres
Dim DATA_IN As Byte                         ; Data in serieel

Dim POSITIE As Word                         ; Variabele positie servo

DelayMS 1000                                ; Pauze 1 sec 

Clear                                       ; Wis geheugen

         ;543210                            ; Hulpregel poort A
PORTA  = %000000                            ; Maak poort A laag
TRISA  = %000000                            ; 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  = %000                               ; Poort_E I/O

;----------------------------------------------
; LEES DATA IN VANUIT PROFILAB EN VERWERK DATA.
;----------------------------------------------

RUN:
   

    HSerIn 100, UIT, [ADRES]    
    DelayMS 1
    
    CONTROLL = 1
    
    If ADRES = 1 Then
       GoSub ADRES_1
    EndIf
    
    If ADRES = 2 Then
       GoSub ADRES_2
    EndIf
    
    If ADRES = 3 Then
       GoSub ADRES_3
    EndIf
    
    If ADRES = 4 Then
       GoSub ADRES_4
    EndIf
    
    If ADRES = 5 Then
       GoSub ADRES_5
    EndIf
    
    If ADRES = 6 Then
       GoSub ADRES_6
    EndIf
    
    If ADRES = 7 Then
       GoSub ADRES_7
    EndIf
    
    CONTROLL = 0
    
;-----------------------------------------
; STUUR DATA UIT. (SET LAMP RUN PROGRAMMA)
;-----------------------------------------
    
UIT:


     HSerOut [5]
     DelayMS 1
        
GoTo RUN

;-----------------
; STUUR SERVO AAN.
;-----------------

ADRES_1:
    

    HSerIn [DATA_IN] 
    DelayMS 1
    
    POSITIE = 850 + (DATA_IN*3)
    Servo SERVO_MOT,POSITIE 
    DelayMS 20
    
    Return
    
;------------------
; STUUR SILO-1 AAN.
;------------------
    
ADRES_2:


    HSerIn [DATA_IN] 
    DelayMS 1
    
    If DATA_IN > 2 Then
       SILO_1 = 1
       Else SILO_1 = 0
    EndIf
    
    Return
    
;------------------
; STUUR SILO-2 AAN.
;------------------
    
ADRES_3:


    HSerIn [DATA_IN] 
    DelayMS 1
    
    If DATA_IN > 2 Then
       SILO_2 = 1
       Else SILO_2 = 0
    EndIf
    
    Return
    
;------------------
; STUUR SILO-3 AAN.
;------------------
    
ADRES_4:


    HSerIn [DATA_IN] 
    DelayMS 1

    If DATA_IN > 2 Then
       SILO_3 = 1
       Else SILO_3 = 0
    EndIf
    
    Return
    
;------------------
; STUUR SILO-4 AAN.
;------------------
    
ADRES_5:


    HSerIn [DATA_IN] 
    DelayMS 1
    
    If DATA_IN > 2 Then
       SILO_4 = 1
       Else SILO_4 = 0
    EndIf
    
    Return
    
;------------------
; STUUR SILO-5 AAN.
;------------------
    
ADRES_6:


    HSerIn [DATA_IN] 
    DelayMS 1
    
    If DATA_IN > 2 Then
       SILO_5 = 1
       Else SILO_5 = 0
    EndIf
    
    Return
    
;------------------
; STUUR SILO-6 AAN.
;------------------    
  
ADRES_7:


    HSerIn [DATA_IN] 
    DelayMS 1
    
    If DATA_IN > 2 Then
       SILO_6 = 1
       Else SILO_6 = 0
    EndIf
    
    Return
                                                                                  
End                  

Ik heb een keer zo'n systeem gemaakt voor een kleine silo, dat werkte ook met een servo. Ik zal nog een keer laten zien hoe je zo'n servo kunt maken en besturen met Profilab.

Hier nog een kort filmpje.

https://www.youtube.com/watch?v=xSnLgcnuCqo

Als voorbeeld is hier een kleine modelbouw servo gebruikt, qua aansturing werkt een grote omgebouwde servo het zelfde.

Als je haar maar goed zit, GROETEN LAMBIEK.
Lambiek

Special Member

Ik had belooft om keer keer een voorbeeld te maken hoe je een grote servo kunt bouwen, met deze servo kun je bijvoorbeeld een doseerschuif aansturen. Ik heb nog een voorbeeld gemaakt in Profilab voor zo’n systeem. Het is niet voor hele grote silo’s, maar voor de wat kleinere met bijvoorbeeld kippenvoer kan dat goed.

Hieronder het gedeelte in Profilab.

Rechts zie je het gedeelte die de waarde voor de servo genereerd, die waarde loopt op en af. De waarde varieert tussen de 850 en 1850, de schuif waarde staat nu op 200 die kun je aanpassen door de waarde bij FW2 groter of kleiner te maken. Al ligt dat aan het soort voer, eenmaal ingesteld op de goede waarde hoef je er niets aan te veranderen.

Links zie je de knoppen voor de instellingen, zoals de doseer knop, de noodstop, de reset knop voor de teller en het invoerveld voor het gewicht en de bijbehorende signaal lampen.

Hier de frontplaat voor de bediening via de pc.

Daar hoort een stukje programma bij voor de controller die de servo gaat bedienen.

pic basic code:


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 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  

Symbol SERVO_MOT = PORTC.0               ; Uitgang servo

Dim POSITIE As Word                      ; Variabele positie servo

Dim DATA_IN As Byte                      ; Variabele data servo

Cls                                      ; Wis display

DelayMS 500                              ; Wachttijd

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  = %000001                         ; 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

;----------------------------
; TEST PROGRAMMA SUPER-SERVO
;----------------------------

RUN: 


    Print At 1,1,"SERVO"
    Print At 2,1,"POSITIE:",Dec4 POSITIE
    
    HSerIn [DATA_IN]
    DelayMS 1  
                          
    POSITIE = 850 + (DATA_IN*5)
    Servo SERVO_MOT,POSITIE 
    DelayMS 10 
                                                             
GoTo RUN                                    

End                          

De besturing gaat via de usb poort, voor de seriële overdracht gebruik ik een usb serieel converter met een FTDI chipset.

Hoe je zo'n servo kunt bouwen? Daar komt binnenkort een artikel over op CO.

Ik kan wel alvast een klein filmpje laten zien.

https://www.youtube.com/watch?v=AphECkxOpss

Het gewicht staat ingesteld op 100, als dat bekijkt is slaat het doseersystemen af. Aan het eind zie je de aangepaste motor als servo.

Als je haar maar goed zit, GROETEN LAMBIEK.
Lambiek

Special Member

ENCODER INLEZEN MET 16F887.

Ik ga een voorbeeld geven hoe je een encoder in kan lezen, dit gaan we doen met een motor met een encoder. We gaan de motor bedienen via een potmeter in het Profilab programma. Wat we daar voor nodig hebben is een H-brug en een controller die het geheel gaat bedienen.
Het schema van de H-brug.

De gebruikte eindtransistoren zijn de TIP142 en de TIP147, dit zijn darlington transistoren. Deze transistoren mogen maximaal 100V schakelen, de versterkingsfactor is minimaal 1000 maal. De transistoren worden aangestuurd door twee IRF540 mosfets.

De TIP142 en de TIP147 zijn op een ruimtebesparend koelprofiel gemonteerd, onder dat koelprofiel zit ruimte voor de componenten. Op het koelprofiel staan twee ventilatoren voor extra koeling.

Rechts zie je de aansluitingen van de regelaar. Rechtsonder zie je de aansluiting voor de stroommeting, deze gaat naar een analoge ingang van de controller.

Je kunt die aansluiting op verschillende manieren gebruiken, als stroommeting of als terugkoppeling of als beiden. Als stroommeting stel je een bepaalde waarde in, in het programma van de controller. Als die waarde overschreden wordt dan wordt de stroom terug geregeld. Als terugkoppeling kun je bijvoorbeeld het toerental van je motor constant houden bij meer belasting, dan wordt het PWM signaal dat op de regelaar staat aangepast. En die twee (stroommeting en terugkoppeling) kun je dan eventueel combineren.

Maar in dit voorbeeld gebruiken we dat niet, hier gaan we gebruik maken van een motor met een encoder zonder stroomregeling.

Hieronder een tekening van de regelaar met de aansluitingen.

Hieronder het complete aansluitschema van de regeling.

We gaan nu naar de software van de controller kijken.

pic basic code:



'*  Name    : TEST ENCODER INLEZEN 16F887.                                      
'*  Author  : H.van Zwieten.                                   
'*  Notice  : Copyright (c) 2021 H.v.Z.                         
'*          : All Rights Reserved                               
'*  Date    : 25-12-2021                                       
'*  Version : 1.0                                               
'*  Notes   : POORT C.7 = RX EN POORT C.6 = TX BIJ GEBRUIK HSERIAL. 
'*  Notes   : MOTOR MET OPTISCHE ENCODER.                                                 

;-----------------------------
; ENCODER AANSLUITING:
; ENCODER B_PLUS OP PORTB.0.
; ENCODER A_PLUS OP PORTB.1.
;-----------------------------
; AANSLUITING REGELAAR:
; RECHTS WIT/GEEL OP PORTC.0
; LINKS GRIJS/GROEN OP PORTC.2
; PWM GRIJS/BRUIN OP PORTC.1
;-----------------------------
; MOTOR AANSLUITING:
; ZWART OP REGELAAR MIN. 
; WIT OP REGELAAR PLUS.
;-----------------------------
; VOEDING REGELAAR:
; VOEDING MAXIMAAL 24VDC.
;----------------------------- 

;#######################################################################                                                     

Device 16F887                               ; Processor type

Xtal 10                                     ; Cristal 10Mhz

On_Interrupt ROTARY_ENCODER                 ; Interrupt rotary encoder

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 = 10                       ; resolutie 10 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 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 CCP2_Pin PORTC.1                    ; HPWM 2 op poort C.1

IOCB.0 = 1                                  ; Interrupt op RB.0
IOCB.1 = 1                                  ; Interrupt op RB.1

Symbol RBIF = INTCON.0                      ; PORTB Change Interrupt Flag bit
Symbol INTF = INTCON.1                      ; RB0 Extern interrupt vlag      
Symbol RBIE = INTCON.3                      ; PORTB Change Interrupt Enable bit
Symbol INTE = INTCON.4                      ; RB0 Extern interrupt enabel   
Symbol PEIE = INTCON.6                      ; Peripheral Interrupt Enable bit
Symbol GIE  = INTCON.7                      ; Global Interrupt enabel

Symbol ENCODER_A = PORTB.0                  ; Ingang encoder_A
Symbol ENCODER_B = PORTB.1                  ; Ingang encoder_B

Symbol S1 = PORTE.0                         ; Ingang start & run
                                 
Symbol LED = PORTE.2                        ; Uitgang controle led puls

Symbol LINKS = PORTC.2                      ; Uitgang linksom
Symbol RECHTS = PORTC.0                     ; Uitgang rechtsom

;#######################################################################
;                INSTELLING BIJ 12VDC VOEDING VOOR MOTOR.
;#######################################################################                   
Symbol HYSTERESIS = 0                       ; Ingave hysteresis = 0    
Symbol HOLD = 60                            ; Ingave Hold = 60
;#######################################################################


;#######################################################################
;                INSTELLING BIJ 24VDC VOEDING VOOR MOTOR.
;#######################################################################                   
;Symbol HYSTERESIS = 2                       ; Ingave hysteresis = 2    
;Symbol HOLD = 20                            ; Ingave Hold = 20
;#######################################################################

Dim POTMETER As Byte                       ; Variabele waarde potmeter

Dim TELLER As Word                          ; Variabele teller

Dim WAARDE As Word                          ; Variabele waarde

Dim PREVIOUSSTATE As Bit                    ; Variabele status encoder   

Cls                                         ; Wis display

DelayMS 500                                 ; Pauze 0.5 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  = %10000000                          ; 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  = %001                               ; Poort_E I/O

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

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

;###########################

;---------------------------
; INTERRUPT ROTARY ENCODER.
;---------------------------

;###########################

TELLER = 0

PREVIOUSSTATE = ENCODER_A

GoTo OVER_IRQ

ROTARY_ENCODER:


Context Save

If ENCODER_A < > PREVIOUSSTATE Then
   If ENCODER_B < > PREVIOUSSTATE Then
      Inc TELLER 
   Else
      Dec TELLER 
  EndIf
  
  Toggle LED
  
EndIf

PREVIOUSSTATE = ENCODER_A

INTF = 0
RBIF = 0

Context Restore

OVER_IRQ:


GIE  = 0
INTE = 1
RBIE = 1
GIE  = 1
PEIE = 1

;################################################################

;----------------------------------------------------------------
; PROGRAMMA BESTURING MOTOR VIA POTMETER MET 16F887 EN PROFILAB.
;----------------------------------------------------------------

;################################################################ 

;-------------------
; START VOORWAARDE.
;-------------------

START_VOORWAARDE:


    If S1 = 1 Then

    Print At 1,1,"ENCODER: ",Dec5 TELLER
    Print At 2,1,"POTMETER: ",Dec5 WAARDE
    
    HSerIn [POTMETER]
    
    HSerOut [5]
    
    WAARDE = POTMETER * 4 + 1000
    
    TELLER = 1000
    LINKS = 0
    RECHTS = 0
    
    If TELLER = 1000 Then
       If POTMETER = 0 Then
          GoTo RUN
       Else GoTo START_VOORWAARDE
       EndIf
    EndIf
    
    EndIf
        
GoTo START_VOORWAARDE

RUN:


    If S1 = 1 Then

    HSerIn [POTMETER]

    WAARDE = POTMETER * 4 + 1000
    
    Print At 1,1,"ENCODER: ",Dec5 TELLER
    Print At 2,1,"POTMETER: ",Dec5 WAARDE

    If TELLER > WAARDE And TELLER - WAARDE > HYSTERESIS Then
       RECHTS = 1
       LINKS = 0
       HPWM 2,(HOLD + (TELLER - WAARDE)),10000
    EndIf
    
    If TELLER < WAARDE And WAARDE - TELLER > HYSTERESIS Then
       LINKS = 1
       RECHTS = 0
       HPWM 2,(HOLD - (TELLER - WAARDE)),10000
    EndIf
    
    If TELLER = WAARDE Then
       LINKS = 0
       RECHTS = 0
    EndIf
    
    EndIf
    
    If S1 = 0 Then
       HSerOut [0]
       GoTo START_VOORWAARDE
    EndIf
      
GoTo RUN

End

Omdat we een signaal van de encoder in gaan lezen, maken we gebruik van een interrupt. Het stukje code van de interrupt draait op de achtergrond, zodat de rest van het programma daar geen last van heeft.

Voor de hysterese en hold functie hebben we twee verschillende instellingen, één voor 12VDC voeding en één voor 24VDC voeding. De test is gedaan met een 12VDC voedingsspanning, in het programma kun je zien dat die geselecteerd is.

Bij de startvoorwaarde zie je dat de teller op 1000 gezet wordt, dat is gedaan voor als de motor as iets doorschiet bij het terug draaien. Als je daar bijvoorbeeld waarde 0 in zou geven en de as schiet daar bij terug draaien iets voorbij, dan slaat de motor op hol omdat de waarde dan 65535 is. De motor zal nu door draaien tot dat de waarde 1000 bereikt is. Van daar dat de waarde 1000 gekozen is.

De potmeter wordt via de seriële ingang (POORTEN C6-TX en C.7-RX) ingelezen, dit is een 8 bit waarde. In de run lus wordt de waarde van de potmeter vermenigvuldigt met 4 en daarbij wordt 1000 opgeteld. Als de potmeter helemaal naar rechts gedraaid wordt krijgen we 255 x 4 + 1000 = 2020. De encoder zal dus tussen de 1000 en 2020 pulsjes geven bij één omwenteling.

We hebben een encoder die 500 pulsje geeft per omwenteling, omdat we het A+ en B+ signaal uitlezen van de encoder, hebben we 1000 pulsjes per omwenteling. We kijken hier alleen naar de opgaande flank van het A en B signaal van de encoder. Met de bovenstaande berekening maakt de motor as dus één omwenteling bij volle uitslag van de potmeter.

Als we de waarde nu veranderen naar bijvoorbeeld 8 x dan krijgen we 255 x 8 + 1000 = 3040 Dan maakt de motor as dus twee omwentelingen bij een volle potmeter uitslag.

We gaan naar het schema in Profilab kijken.

De potmeter PT1 is verbonden met seriële module CS1 (TX) en via de formule module FRM1 met het display ND1. In de formule module staat E0 X 4 + 1000, het zelfde dus als in het programma voor de controller.

Dan hebben we nog de seriële module CRB2 (RX), deze ontvangt data van de controller. Op de controller is een schakelaar aangesloten (S1), als deze ingedrukt wordt dan wordt de waarde vijf verzonden door de controller. Nu kan de seriële module SC1 data gaan verzenden naar de controller.

Je ziet ook nog een aantal logische poorten, deze zorgen er voor dat de led LED1 knippert als S1 niet is ingedrukt en als S1 ingedrukt is brand LED1 continue.

Dan hebben we de frontplaat nog.

Hier zien we staan START-VOORWAARDE / RUN, dat is de tekst in de led LED1. Verder zie je de potmeter PT1 en het display ND1.
Meer is er niet nodig voor dit voorbeeld. Het is trouwen een Closed loop systeem, dus als de motor as een positie bereikt heeft wordt de positie vast gehouden. Je kunt de as dus niet verdraaien.

Hier het filmpje.

https://www.youtube.com/watch?v=KBEJzGUC2wM

In het begin wordt de potmeter met de muis bediend en daarna met de PgUp en PgDn knop van het toetsenbord. Op het werkblad kun je zien welke lijnen er hoog zijn. Aan het eind zie je de motor as verdraaien, hier wordt de motor as met het toetsenbord bediend.

Het kleine printje linksboven zorgt voor het data verkeer tussen pc en controller.

Als je haar maar goed zit, GROETEN LAMBIEK.
Lambiek

Special Member

BESTURING LENZE FREQUENTIEREGELAAR VIA PROFILAB.

Ik heb een voorbeeld gemaakt hoe je een frequentieregelaar aan kunt sturen via Profilab Expert 4.0. We gebruiken hiervoor de PC als MMI, (man machine interface) op deze manier geven we commando’s aan een controller via de PC. Voor het versturen van de commando’s gaan we weer gebruikmaken van de usb poort van de PC. Dit doen we weer via een usb serieel adapter met FTDI chipset. De data versturen we weer via optocouplers voor de galvanische scheiding. Het schema van de interface staat op de eerste pagina van het topic.

Als frequentieregelaar maak ik gebruik van een LENZE regelaar van het type 33.8202-E. Dit is een 230VAC naar 3 X 230VAC frequentieregelaar, deze regelaar kan dus gewoon uit een 1 fase net gevoed worden.

De regelaar heeft optisch gescheiden ingangen en kan dus met 5VDC aangestuurd worden. Voor het regelen van het toerental kun je kiezen uit een spanning van 0 tot 5VDC, 0 tot 10VDC of 4 tot 20mA. De keuze kun je instellen via een jumper, deze jumper kun je vinden onder het display, deze is verwijderbaar van de frequentieregelaar.

Dan heb je nog een aantal digitale ingangen die gebruikt kunnen worden voor de vrijgave, jog-functie, keuze 20, 30, 40Hz, links/rechts en een paar alarm contacten.

Voor het regelen van het toerental maken we gebruik van de 0 tot 10VDC instelling, omdat we een pwm naar analoog converter gebruiken die op 10VDC aangesloten is.

Voor de converter wordt er gebruik gemaakt van een rail to rail opamp van het type TLV271. Het pwm signaal gaat eerst door een low-pass filter, (R1 en C1) daarmee wordt een 0 tot 5VDC signaal gemaakt en twee maal versterkt door de opamp. De versterking wordt bepaald door R2 en R3.
Op deze manier krijgen we dus een analoge uitgang op de controller en die hebben we nodig om het toerental van de motor te regelen die aangesloten zit op de frequentieregelaar.

Hieronder een tekening van de regelaar.

Nog even iets over de aansluitingen die we gaan gebruiken op de regelaar. Klem-7 is de 0VDC, klem-8 is de ingang voor de 0 tot 10VDC, klem-39 is de 0VDC voor de digitale ingangen, Klem-E4 is voor links en rechtsom, klem-E3 is voor de rem, klem-E2 is voor de jog functie, klem-E1 is voor de keuze 20, 30 of 40Hz en klem-28 en klem-20 is voor de vrijgave van de regelaar. Dan hebben we nog de klemmen voor de motor aansluiting, W, V, U, en de klemmen voor de netspanning en de aarde PE.
De klemmen -UG en +UG zijn voor het aansluiten van een remchopper, maar die gebruiken we nu niet.

Hieronder het totale schema hoe het aangesloten is op de controller.

Op poort A.0 tot A.3 van de controller zit de bediening voor links en rechtsom, rem, jog-1 en jog-2 en poort C.1 is de pwm uitgang voor het regelen van het toerental. Poort C.6 en poort C.7 is voor de communicatie met de PC. De rest wijst voor zich lijkt mij.

We gaan nu kijken naar het programma gemaakt in Profilab.

Dit is eigenlijk het zelfde opgezet als het programma van de K16F887 interface die ook hier in het topic staat, er wordt gebruik gemaakt van een potmeter en vier drukschakelaars om het geheel te bedienen.

Dit zijn de gebruikte componenten:
De gegenereerde stuklijst is wel in het Duits.
4x Schalter logisch, 1x Taster logisch, 1x Einsteller analog (Potentiometer), 6x AND, 2 Eingänge, 6x OR, 2 Eingänge, 1x OR, 5 Eingänge, 5x RS-FlipFlop, 3x Taktgenerator 1Hz...1kHz, 1x Simulation Stop, 1x Formel universell, 5x Mittelwert, 1x D/A-Wandler, 8 Eingänge, 6x LED, 1x Numerisches Display, 5x COM String senden, 1x COM Byte lesen, 5x $Character, 15x Analog- Vergleicher en 10x Festwert.

Hieronder de frontplaat.

Hier kun je de potmeter zien, de drukknoppen, de lampen en het display die het aantal Hz aangeeft. Als de potmeter op nul staat knippert het run lampje, zodra de potmeter iets verdraait wordt gaat het run lampje continu branden.
Het data lampje knippert als de potmeter verdraaid wordt of als er een drukknop ingedrukt wordt, dit ten teken dat er communicatie is met de controller.
Als je bijvoorbeeld de knop L/R indrukt dat krijg je een terugmelding van de controller die de lamp L/R aanstuurt boven de drukknop en dat zelfde gebeurd ook bij de andere drukknoppen.
Dan hebben we nog de drukknop afsluiten, hiermee sluiten we het programma mee af.
We hebben ook nog een stukje software voor de controller, daar gaan we nu naar kijken.

pic basic code:


'*  Name    : BESTURING - FREQUENTIEREGELAAR.                                     
'*  Author  : H.van Zwieten.                                    
'*  Notice  : Copyright (c) 2023 H.v.Z.                         
'*          : All Rights Reserved                               
'*  Date    : 14-5-2023                                         
'*  Version : 1.0                                               
'*  Notes   : POORT C.7 = RX EN POORT C.6 = TX BIJ GEBRUIK HSERIAL.
'*  Notes   : POORT B.0 = RX EN POORT B.1 = TX BIJ GEBRUIK RSIN.               

Device 16F887                     ; Processor type

Xtal 10                           ; Cristal 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 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 CCP2_Pin PORTC.1          ; HPWM 2 op poort C.1

Symbol FREQUENTIE = 1000          ; Instelling frequentie HPWM

Symbol UIT_1 = PORTA.0            ; Uitgang links rechts
Symbol UIT_2 = PORTA.1            ; Uitgang jog-1
Symbol UIT_3 = PORTA.2            ; Uitgang jog-2
Symbol UIT_4 = PORTA.3            ; uitgang brake

Dim DATA_IN As Byte               ; Variabele data-in
Dim ADRES As Byte                 ; Variabele adres

DelayMS 1000                      ; Wachttijd i sec

Clear                             ; Wis geheugen

;------------------------------------------------------
; ALS TRISA - TRISB - TRISC - TRISD OF TRISE IS 0, DAN
; STAAT DE POORT ALS EEN UITGANG.
; ALS TRISA - TRISB - TRISC - TRISD OF TRISE IS 1, DAN
; STAAT DE POORT ALS EEN INGANG.
;------------------------------------------------------ 

         ;543210                  ; Hulpregel poort A
PORTA  = %000000                  ; Maak poort A laag
TRISA  = %000000                  ; 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  = %000                     ; Poort_E I/O

;-------------------------------------------
; AFVRAGEN VERZONDEN ADRES VANUIT PROFILAB.
; EN DATA VERSTUREN NAAR PROFILAB.
;-------------------------------------------

RUN:

    HSerIn 100, UIT, [ADRES]
    DelayMS 1
    
    If ADRES = 1 Then
    GoSub ADRES_1
    EndIf 
    
    If ADRES = 2 Then
       GoSub ADRES_2
    EndIf 
    
    If ADRES = 3 Then
       GoSub ADRES_3
    EndIf 
    
    If ADRES = 4 Then
       GoSub ADRES_4
    EndIf 
    
    If ADRES = 5 Then
       GoSub ADRES_5
    EndIf
    
;-----------------------------------------------------------
; HIER WORDT BEPAALD WELKE LAMP ER AANGESTUURD MOET WORDEN.
; DAT ZIJ NE LAMPEN L/R, JOG-1, JOG-2 OF BRAKE.
;-----------------------------------------------------------
    
UIT:


    If ADRES = 2 Then
       If UIT_1 = 1 Then
          HSerOut [5]
          Else HSerOut [10]
       EndIf
    EndIf
    
    If ADRES = 3 Then
       If UIT_2 = 1 Then
          HSerOut [15]
          Else HSerOut [20]
       EndIf
    EndIf
    
    If ADRES = 4 Then
       If UIT_3 = 1 Then
          HSerOut [25]
          Else HSerOut [30]
       EndIf
    EndIf
    
    If ADRES = 5 Then
       If UIT_4 = 1 Then
          HSerOut [35]
          Else HSerOut [40]
       EndIf
    EndIf
    
GoTo RUN

;-----------------------------------------------
; DATA INLEZEN VAN DE POTMETER BINNEN PROFILAB.
; PWM SIGNAAL UITSTUREN VANUIT CONTROLLER.
;-----------------------------------------------

ADRES_1:


    HSerIn [DATA_IN]
    DelayMS 1
    
    HPWM 2,DATA_IN,FREQUENTIE
    
    Return
    
;--------------------------------------------
; DATA INLEZEN VAN KNOP L/R BINNEN PROFILAB.
; UITGANG HOOG OF LAAG ZETTEN OP CONTROLLER.
;--------------------------------------------    
    
ADRES_2:


    HSerIn [DATA_IN]
    DelayMS 1

    If DATA_IN > 2 Then
       UIT_1 = 1
       Else UIT_1 = 0
    EndIf
    
    Return
    
;----------------------------------------------
; DATA INLEZEN VAN KNOP JOG-1 BINNEN PROFILAB.
; UITGANG HOOG OF LAAG ZETTEN OP CONTROLLER.
;---------------------------------------------
    
ADRES_3:


    HSerIn [DATA_IN]
    DelayMS 1

    If DATA_IN > 2 Then
       UIT_2 = 1
       Else UIT_2 = 0
    EndIf
    
    Return
    
;----------------------------------------------
; DATA INLEZEN VAN KNOP JOG-2 BINNEN PROFILAB.
; UITGANG HOOG OF LAAG ZETTEN OP CONTROLLER.
;----------------------------------------------
    
ADRES_4:


    HSerIn [DATA_IN]
    DelayMS 1

    If DATA_IN > 2 Then
       UIT_3 = 1
       Else UIT_3 = 0
    EndIf
    
    Return
    
;----------------------------------------------
; DATA INLEZEN VAN KNOP BRAKE BINNEN PROFILAB.
; UITGANG HOOG OF LAAG ZETTEN OP CONTROLLER.
;----------------------------------------------
    
ADRES_5:


    HSerIn [DATA_IN]
    DelayMS 1

    If DATA_IN > 2 Then
       UIT_4 = 1
       Else UIT_4 = 0
    EndIf
    
    Return

End

Zoals je kunt zien is het programma het zelfde opgesteld als het programma voor de K16F887 interface. Het is het afvragen van data die door Profilab verstuurd wordt en het bevestigen door de controller als er data ontvangen is. De baudrate staat weer op de standaard instelling van 9600, dit is meer dan snel genoeg voor dit doel. Er hoeft maar weinig data verzonden en ontvangen te worden. De ontvangen data wordt verwerkt door de controller en deze voert de opdrachten uit, niet meer en niet minder.

Hier nog een filmpje, Er staat alleen een stom type foutje bij de rem drukknop, dat moet uiteraard BRAKE zijn. |:(

https://www.youtube.com/watch?v=_L4_cu7U0Pk&pp=ygURaGFycnkgdmFuIHp…

Als je haar maar goed zit, GROETEN LAMBIEK.
Lambiek

Special Member

POSITIE REGELING MET HALL-SENSOR.

In 2021 heb ik een artikel geschreven over “Positioneren met een hall-sensor”, dat ga ik hier gedeeltelijk nog een keer plaatsen. Met name het gedeelte in Profilab en de software voor de controller plus een schema.

Hieronder het aansluit schema.

Hier is weer de zelfde controller en motorregelaar gebruikt voor het voorbeeld. Op het display wordt de ontvangen data getoond die verzonden is door Profilab. Op poort A.1 zit de Hall-sensor aangesloten, de Hall-sensor wordt gebruikt om de positie te bepalen van de motor-as.

Op poort E.0 zit een schakelaar die gebruikt wordt om de motor-as te positioneren, dit gebeurt eenmalig alleen bij het opstarten. Als de motor-as in positie is moet er op de knop invoer gedrukt worden en die is aangesloten op poort E.1, nu is het systeem klaar om data van Profilab te ontvangen.

Als de data geladen is en de motor-as gaat naar de ingegeven positie, dan knippert de led die op poort E.2 aangesloten is. Als de motor langzaam draait zal de led met een lage frequentie knipperen en als de motor snel draait knippert de led met een hoge frequentie. Op poort C.5 en C.6 wordt de usb naar serieel converter aangesloten.

We gaan nu naar het Profilab schema kijken.

Hier de stuklijst van de gebruikte modules.

3x Taster logisch, 3x Numerisches Eingabefeld, 2x Inverter, 2x AND,
2x Eingänge, 1x RS-FlipFlop, 2x Taktgenerator 1Hz...1kHz, 3x MonoFlop, 1x Simulation Stop, 1x Formel universell, 1x Subtrahierer, 1x Multiplizierer, 1x Dividierer, 1x Math, 1x D/A-Wandler, 8 Eingänge, 1x LED, 1x Zähler, 4x COM String senden, 1x COM Byte lessen, 4x $Character, 2x Analog- Vergleicher, 4x Festwert.

Op deze manier kun je via Profilab grote data verzenden. De serieel modules zijn 8 bit binnen Profilab, dus daar kun je een maximale waarde tussen de 0 en 255 mee verzenden. Maar omdat we het getal voor de komma nu delen door 100 en het getal achter de komma vermenigvuldigen met 100, kunnen we een getal verzenden met een waarde van maximaal 25500. Dit moet uiteraard ook bewerkt worden in het programma van de controller.

We gaan nu naar de frontplaat kijken.

Je kunt zien dat we op drie velden een waarde in kunnen vullen, positie, toeren percentage en herhaling. Helemaal boven aan zien we de teller voor het aantal herhalingen, bij iedere herhaling wordt er één bij op geteld, dit wordt verzonden door de controller.

Dan hebben we nog drie drukknoppen, reset, start en afsluiten. Met de resetknop kunnen we de herhaal teller op nul zetten. Met de startknop verzenden we de data van de positie, toerental en het aantal herhalingen naar de controller. Met de knop afsluiten, sluiten we het programma af.
Op deze manier verzenden we dus data naar de controller en de controller handelt het verder af.

We gaan nu naar de software kijken van de controller.

pic basic code:


'*  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                                     ; 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 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 Bit                          ; 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

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

;---------------------------------------
; VARIABELE EN UITGANGEN OP NUL ZETTEN.
;---------------------------------------

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

;---------------------------------------
; AS OP NUL ZETTEN MET S2.
; NAAR INVOER DATA VAN PROFILAB MET S1.
;---------------------------------------

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

;-------------------------------------
; DATA UITLEZEN VAN PROFILAB.
; PRINT OPDRACHTEN GEVEN VAN DE DATA.
;-------------------------------------
        
INVOER:


    Cls 
    
    Print At 1,6,"INVOER"
    
    POSITIE = 0
    TOEREN = 0
    HERHALING = 0
    DATA_1 = 0
    DATA_2 = 0
    TEL_BIT = 0
    WAARDE = 0
    TELLER = 0
    
    HSerIn [DATA_1, DATA_2, TOEREN, HERHALING] 
    
    POSITIE = ((DATA_1 * 100) + DATA_2)
    
    Cls
    
    Print At 1,1,"POS-"
    Print At 1,5, Dec5, POSITIE
    Print At 2,1,"POS-"
    Print At 2,5, Dec5 WAARDE
    
    Print At 1,11,"T-"
    Print At 1,13, Dec3, TOEREN/2.55
    Print At 1,16,"%"
    
    Print At 2,11,"H-"
    Print At 2,13, Dec3, HERHALING
    Print At 2,16,"X" 
    
    DelayMS 2000
    
    GoTo RUN_RECHTS
    
GoTo INVOER

;---------------------------------------------
; MOTOR GAAT NAAR INGEGEVEN POSITIE RECHTSOM. 
;---------------------------------------------
 
RUN_RECHTS:


    LINKS = 0
    RECHTS = 1

    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 2,5, Dec5 WAARDE
       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

;--------------------------------------
; MOTOR GAAT NAAR NUL POSITIE LINKSOM.
;--------------------------------------

RUN_LINKS: 


    RECHTS = 0
    LINKS = 1

    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 2,5, Dec5 WAARDE
       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 ALS HET AANTAL HERHALINGEN BERIJKT ZIJN.
; STUUR DATA NAAR PROFILAB VAN AANTAL HERHALINGEN.
; KEER TERUG NAAR RUN RECHTS OM HERHALINGEN AF TE RONDEN.
;---------------------------------------------------------

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 KLAAR
    EndIf
    
    DelayMS 1000

    GoTo RUN_RECHTS
    
GoTo RESET_INGAVE

;---------------------------------------
; AANTAL HERHALINGEN ZIJN KLAAR.
; GEEF PRINT OPDRACHT.
; NAAR INVOER NIEUWE DATA VAN PROFILAB.
;---------------------------------------

KLAAR:


    Cls

    Print At 1,6,"KLAAR"
    DelayMS 2000
    
    GoTo INVOER
    
GoTo KLAAR   
  
End

Bovenin het programma weer de instellingen voor het type controller, de declaraties, de instelling op welke poort wat zit, de variabelen en de instelling voor de in en uitgangen.

Als we bij het programma kijken zien we eerst de voorwaarden om de motor-as op nul te zetten, als dat gebeurt is kun je via S1 naar de invoer gaan. Als de motor-as al in positie is kun je direct naar de invoer gaan door S1 in te drukken.

Bij invoer komt de data binnen verzonden via Profilab en wordt daar verwerkt. Hier kun je ook zien dat de waarde van DATTA_1 wordt vermenigvuldigt met 100 en opgeteld wordt bij DAT_2 en die totale waarde wordt in de variabele POSITIE gezet.

Daarna volgen er wat print opdrachten en gaat de motor-as rechtsom draaien naar de opgegeven positie. Als de positie bereikt is gaat de motor-as linksom draaien naar zijn startpositie en dit wordt dan een X aantal maal herhaald. Het aantal herhalingen wordt bepaald door wat er ingegeven is bij herhalingen binnen Profilab.

De teller van het aantal herhalingen wordt op gehoogd binnen de lus RESET_INGAVE, daar wordt na iedere herhaling data verzonden naar Profilab.

Hier nog een filmpje over de werking.
https://www.youtube.com/watch?v=UxMyfWwpX0A&pp=ygURaGFycnkgdmFuIHp…

Als je haar maar goed zit, GROETEN LAMBIEK.
Lambiek

Special Member

Het is alweer even geleden dat ik hier een voorbeeld geplaatst heb, ik heb een voorbeeld gemaakt met Profilab Expert 4.0 waarmee ik serieel een unipolaire stappenmotor kan besturen. De motor wordt aangestuurd via ramp-up en ramp-down, op deze manier heeft de motor een hoger aanloop koppel dan wanneer de motor met een hoger toerental gestart wordt. De gebruikte stappenmotor is een Sanyo Denki van het type 103H7126-0744. Hieronder de grafiek met toerental en koppel.

Zoals je in de grafiek kunt zien is de start frequentie +/- 1250Hz met het daarbij behorende koppel van iets boven de 1Nm. Hoe lager je de start frequentie maakt hoe hoger het koppel is, maar dat is inherent voor een stappenmotor. De max draai frequentie is 2500Hz, dat is na de ramp-up. Je kunt ook zien dat het koppel inzakt bij een hoger draai frequentie, ik noem het hier draai frequentie, maar eigenlijk is het de puls frequentie die aangeboden wordt aan de stappenmotor driver. Je ziet dat het koppel nu tussen de 0.6 en 0.7 Nm zit, maar dat is nog best veel en goed bruikbaar om iets aan te drijven. Als je veel hoger gaat met de puls frequentie dan zie je dat het koppel vrij snel verder inzakt, dit kun je wel voorkomen door de spanning op de driver te verhogen. Maar ik kan niet hoger dan max 15VDC, daar heb ik niet aan gedacht toen ik de driver ontworpen heb. Ik had hem eigenlijk voor 24VDC moeten maken. Hieronder het schema van de driver.

Zoals je kunt zien op het schema ben ik nu afhankelijk van de gate spanning voor de mosfets, die spanning is max 20VDC. Ik zou dus naar max 18VDC kunnen gaan, maar dat zal niet zoveel schelen in toerental en koppel. Ik hou het dus bij max 15VDC. Voor de driver heb ik de aloude L297 gebruikt, deze kan hele en halve stappen doen. Pin 13 en 14 worden normaal gebruikt voor de stroomregeling van de stappenmotor, maar dat heb ik niet gedaan omdat dat niet lekker werkt. Ik wil de stroom zelf in kunnen stellen, vandaar dat ik een kleine microcontroller gebruik om de stroom te regelen. Ik kan de stroom nu apart instellen voor als de motor draait en als de motor stilstaat. Dat gebeurt via een PWM signaal dat aangeboden wordt op de vier (AND) poorten. Deze poorten sturen twee maal een IR4427 gate driver aan voor de vier mosfets. Verder zie je nog wat beveiligingen voor de mosfets en wat filtering voor de spoelen van de stappenmotor. Het geheel wordt aangestuurd met drie signalen, richting, puls en run-hold. Verder valt er over de stappenmotor driver niet zoveel te vertellen.
We gaan nu naar het complete aansluitschema kijken.

Het geheel wordt weer aangestuurd door een 16F887, met de poorten C0, C1 en C2. Op de stappenmotor driver zie je rechtsboven de twee meerslagen instel potmeters zitten voor de stroom instelling I-run en I-hold, zoals ik al eerder zei kan ik de twee verschillende stromen (I-run en I-hold) apart instellen. Op poort C6 (TX) en poort C7 (RX) wordt de usb serieel converter aangesloten voor de verbinding met de PC. Ik heb dus weer met twee programma’s te maken, één in Profilab en één voor de controller. De stappenmotor is een 200 stap unipolair type en we gaan hem gebruiken in halve stappen. Die instelling maken we met de jumper J1 op de driver.
We gaan nu naar het programma binnen Profilab kijken, zie hieronder.

Met het gedeelte links kunnen we weer grote waardes versturen, in dit geval van 400 tot 2500. Ik heb hier al eens een voorbeeld van gemaakt, (grote waardes verzenden) dat doen we dus nu weer. Met het rechtse gedeelte halen we waardes binnen verzonden door de controller. De waardes wordt door een aantal led’s getoond, dat kun je straks zien op de frontplaat. Helemaal rechts onderaan en in het midden onderaan is het gedeelte voor automatisch draaien. We gaan nu naar de frontplaat kijken.

Op de frontplaat zie je de vijf led’s staan, (FOUT, STOP, LINKS-OM, RECHTS-OM en RUN-AUTO). De led (FOUT) licht op als je een waarde probeert te verzenden die kleiner is dan 400 of een waarde die groter is dan 25000. De stop led brand als de motor stil staat of dat de waarde bereikt is. Dan hebben we de twee richting led’s (LINKS-OM en RECHTS-OM) en de led (RUN-AUTO). De eerste vier led’s worden aangestuurd door de controller, de laatste led (RUN-AUTO) wordt door de schakelaar (RUN-AUTO) bediend. Op de ingave module kun je het aantal stappen ingeven en het display erboven geeft het aantal omwentelingen weer die de motor gaat maken, in dit geval maakt de motor 11.5 omwentelingen bij een waarde van 4600. Dan hebben we nog de (START) knop en de knop (AFSLUITEN), daar mee sluiten we het programma af. Met de (START) knop verzenden we de ingegeven waarde en start de stappenmotor met de ramp-up, als de motor een half rondje voor het einde is stopt de motor met een ramp-down. Als de knop (RUN-AUTO) ingedrukt is blijft de motor naar links en rechts draaien op de ingestelde waarde.

Hier onder het programma voor de controller.

pic basic code:



'*  Name    : SERIEELE STAPPENMOTOR BESTURING MET PROFILAB EXPERT 4.0.                                     
'*  Author  : H. van Zwieten                                    
'*  Notice  : Copyright (c) 2023 H.v.Z.                         
'*          : All Rights Reserved                               
'*  Date    : 14-11-2023                                        
'*  Version : 1.0                                               
'*  Notes   : POORT C.7 = RX EN POORT C.6 = TX BIJ GEBRUIK HSERIAL.
'*  Notes   : POORT B.0 = RX EN POORT B.1 = TX BIJ GEBRUIK RSIN. 
'*  Notes   : GEBRUIKTE MOTOR SANYO DENKI TYPE 103H7126 - 0744.
'*  Notes   : STAPPENMOTORDRIJVER UNIPOLAIR ZELFBOUW HELE HALVE STAPPEN.                                                                                

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 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 

Symbol PULS = PORTC.2                       ; Uitgang puls voor stappenmotor driver
Symbol DIR = PORTC.1                        ; Uitgang richting stappenmotor driver
Symbol STEP_HOLD = PORTC.0                  ; Uitgang step hold stappenmotor driver

Symbol WACHTTIJD = 2000                     ; Wachttijd 2 seconden
                                            
Dim FREQUENTIE As Word                      ; Variabele frequentie

Dim DATA_IN_1 As Byte                       ; Variabele data in 1
Dim DATA_IN_2 As Byte                       ; Variabele data in 2

Dim DATA_UIT As Byte                        ; Variabele data uit

Dim WAARDE_RECHTS As Dword                  ; Variabele waarde rechtsom
Dim WAARDE_LINKS As Dword                   ; Variabele waarde linksom

DelayMS 2000                                ; Pauze 2 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  = %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 BESTURING STAPPENMOTOR.
; STAPPENMOTOR OP LAGE STROOM.
; DATA BINNEN HALEN VAN PROFILAB EN CONTROLEREN.
;------------------------------------------------

START:


    HSerOut [0]

    STEP_HOLD = 0                   
    PULS = 0             

    HSerIn [DATA_IN_1]
    DelayMS 1
    HSerIn [DATA_IN_2]
    DelayMS 1
    
    WAARDE_RECHTS = ((DATA_IN_1 * 100) + DATA_IN_2)
    WAARDE_LINKS  = ((DATA_IN_1 * 100) + DATA_IN_2)  

    If WAARDE_RECHTS > 25000 Then
       GoTo FOUT
    EndIf
    
    If WAARDE_LINKS > 25000 Then
       GoTo FOUT
    EndIf
    
    If WAARDE_RECHTS < 400 Then
       GoTo FOUT
    EndIf
    
    If WAARDE_LINKS < 400 Then
       GoTo FOUT
    EndIf
    
     If WAARDE_RECHTS > = 400 Then
       GoTo RAMP_UP_RECHTS
    EndIf
    
GoTo START

;-------------------------------
; DATA UITSTUREN NAAR PROFILAB.
; STAPPENMOTOR OP HOGE STROOM.
; RICHTING RECHTSOM.
; TOERENTAL OPBOUWEN.
;-------------------------------

RAMP_UP_RECHTS:


    HSerOut [5]

    STEP_HOLD = 1
    DIR = 1
    
    For FREQUENTIE = 400 To 200 Step - 1   
        PULS = 1
        DelayUS FREQUENTIE
        PULS = 0
        DelayUS FREQUENTIE
    
        If FREQUENTIE = 200 Then  
           GoTo RUN_RECHTS
        EndIf
    Next
     
GoTo RAMP_UP_RECHTS

;--------------------------------------
; RICHTING RECHTSOM.
; STAPPENMOTOR OP HOGE STROOM.
; STAPPENMOTOR NAAR INGEGEVEN POSITIE.
;--------------------------------------

RUN_RECHTS:                  


    DIR = 1                         
    STEP_HOLD = 1 
    
    For WAARDE_RECHTS = WAARDE_RECHTS - 400 To 0 Step - 1                 
    
        PULS = 1                      
        DelayUS FREQUENTIE            
        PULS = 0                      
        DelayUS FREQUENTIE
    
        If WAARDE_RECHTS = 0 Then
           GoTo RAMP_DOWN_RECHTS
        EndIf
    
    Next
       
GoTo RUN_RECHTS

;-------------------------------
; RICHTING RECHTSOM.
; STAPPENMOTOR OP HOGE STROOM.
; TOERENTAL AFBOUWEN.
; VAN RICHTING VERANDEREN.
; DATA UITSTUREN NAAR PROFILAB.
;-------------------------------

RAMP_DOWN_RECHTS:


    DIR = 1                         
    STEP_HOLD = 1 
      
    For FREQUENTIE = 200 To 400 Step  1   
        PULS = 1
        DelayUS FREQUENTIE
        PULS = 0
        DelayUS FREQUENTIE
    
        If FREQUENTIE = 400 Then   
           STEP_HOLD = 0 
           HSerOut [0]
           DelayMS WACHTTIJD 
           GoTo RAMP_UP_LINKS  
        EndIf
    Next
          
GoTo RAMP_DOWN_RECHTS

;-------------------------------
; DATA UITSTUREN NAAR PROFILAB.
; RICHTING LINKSOM.
; STAPPENMOTOR OP HOGE STROOM.
; TOERENTAL OPBOUWEN.
;-------------------------------

RAMP_UP_LINKS:


    HSerOut [10]           
    
    STEP_HOLD = 1
    DIR = 0
       
    For FREQUENTIE = 400 To 200 Step - 1  
        PULS = 1
        DelayUS FREQUENTIE
        PULS = 0
        DelayUS FREQUENTIE
    
        If FREQUENTIE = 200 Then  
           GoTo RUN_LINKS
        EndIf
    Next
     
GoTo RAMP_UP_LINKS

;--------------------------------------
; RICHTING LINKSOM.
; STAPPENMOTOR OP HOGE STROOM.
; STAPPENMOTOR NAAR INGEGEVEN POSITIE.
;--------------------------------------

RUN_LINKS:                  


    DIR = 0                         
    STEP_HOLD = 1 
    
    For WAARDE_LINKS = WAARDE_LINKS - 400 To 0 Step - 1                 
    
    PULS = 1                      
    DelayUS FREQUENTIE            
    PULS = 0                      
    DelayUS FREQUENTIE
    
    If WAARDE_LINKS = 0 Then
       GoTo RAMP_DOWN_LINKS
    EndIf
    
    Next
       
GoTo RUN_LINKS

;-------------------------------
; RICHTING LINKSOM.
; STAPPENMOTOR OP HOGE STROOM.
; TOERENTAL AFBOUWEN.
; DATA UITSTUREN NAAR PROFILAB.
; NAAR BIGIN PROGRAMMA.
;-------------------------------

RAMP_DOWN_LINKS:


    DIR = 0                         
    STEP_HOLD = 1 
      
    For FREQUENTIE = 200 To 400 Step  1   
        PULS = 1
        DelayUS FREQUENTIE
        PULS = 0
        DelayUS FREQUENTIE
    
        If FREQUENTIE = 400 Then  
           HSerOut [15]
           GoTo START
        EndIf
    Next
          
GoTo RAMP_DOWN_LINKS

;-------------------------------
; DATA UITSTUREN NAAR PROFILAB.
; WAARDE OP NUL ZETTEN.
; NAAR BEGIN PROGRAMMA.
;--------------------------------

FOUT:


    HSerOut [50]
    
    DelayMS 2000

    WAARDE_RECHTS = 0
    WAARDE_LINKS = 0
    
    GoTo START
    
GoTo FOUT
        
End

Het programma wijst voor zich denk, er komt data binnen van Profilab en wordt verwerkt door de controller. De data die binnen komt is de positie waar de stappenmotor naar toe moet. Als die waarde bijvoorbeeld kleiner is dan 400 of groter dan 25000 dan wordt dat als een fout gezien. Dat heeft te maken met de ramp-up en ramp-down, het aanlopen van de stappenmotor kost een X aantal stappen. In dit geval het 200 stappen voor ramp-up en 200 stappen voor ramp-down, als je de stappenmotor dus 360 graden wil laten verdraaien doet deze alleen ramp-up en ramp-down. Als je bijvoorbeeld de waarde 4600 ingeeft maakt de stappenmotor 11.5 omwentelingen.
Verder valt er niet zoveel over te vertellen, maar als er vragen zijn hoor ik het graag. :)

Als je haar maar goed zit, GROETEN LAMBIEK.