Luchtdruk regeling

Hallo allemaal,

Onlangs heb ik een item gepost over het inventariseren van een luchtdruk regeling.
Toen werd er verteld dat het programmeren van de regeling die ik voor ogen had met een PI regelaar moest gebeuren.
Omdat ik het lastig vond te begrijpen hoe je een PI regeling in PROTON gebruikt heb ik dit niet gedaan.

De regeling zou als volgt moeten werken:

Met de PWM functie van PROTON stel ik een proportioneel luchtdruk ventiel (0 - 5V) op bijvoorbeeld 6 bar.
Een luchtdruk sensor (0 - 5V) meet aan het einde van het systeem of deze druk klopt. Als deze niet klopt moet de afwijking gecorrigeerd worden.

De regeling begint op 6,6 bar en iedere keer als schakelaar S1 hoog wordt moet de druk met 0,4 bar afnemen.

Het probleem is nu dat mijn programma al begint te corrigeren voordat de ingestelde druk bereikt is.
Ik wil een druk instellen --> dan het regelverschil meten --> en dan corrigeren.

Onderstaand mijn programma en schakeling.
Kan iemand mij hiermee helpen?

pic basic code:

[;**************************************************************************************:
;                                                                                      ;
;                 Naam programma:                                      ;
;                 Autheur:                      Wouter Peeters Weem                    ;
;                 Opdrachtgever:                                    ;
;                 Datum aangepast:              06-01-2017                             ;
;                                                                                      ;
;**************************************************************************************;

Device 16F877                                             ; We gebruiken een PIC16F877A
Xtal = 20                                                 ; Kristal is 20 Mhz

Config  WDT_OFF,_                                         ; instellingen van alle Fuses
        PWRTE_ON,_
        LVP_OFF,_
        HS_OSC

All_Digital true                                          ; Alle ingangen digitaal
PortB_Pullups true                                        ; On-chip weerstanden actief

;Declareren
Declare Adin_Res = 8                                      ; De analoge resolutie is 8 bits
Declare Adin_Tad = frc                                    ; Set rc osc
Declare Adin_Stime = 50                                   ; Samlple tijd op 5

; Logische constanten
Symbol AAN = 1                                            ; Het symbool AAN heeft de waarde "1"
Symbol UIT = 0                                            ; Het symbool UIT heeft de waarde "0"

; Alegemene constanten
Symbol Contactdender = 20                                 ; Tijd om Contactdender tegen te geaan (20ms)

; Poortnamen
Symbol LED1 = PORTC.1                                     ; LED1 zit op poort C.1 (Knipperend groen, gereed voor gebruik)
Symbol LED2 = PORTC.2                                     ; LED2 zit op poort C.2 (Stabiel groen, programma bezig)
Symbol LED3 = PORTC.3                                     ; LED3 zit op poort C.3 (Stabiel rood, programma gestopt)
Symbol Regtronic = PORTD.2                                ; De Regtronic zit op poort D.2
Symbol S1 = PORTA.3                                       ; Schakelaar S1 (Start) zit op poort A.3
Symbol S2 = PORTA.4                                       ; Schakelaar S2 (Stop) zit op poort A.4
Symbol S3 = PORTA.5                                       ; Schakelaar S3 zit op poort A.5
                                 
; Variabelen
Dim Aflees As Byte                                        ; Wika drukopnmer ( afgelzen druk )
Dim SOM As Byte                                           ; Som van waarde's  (Instel - Pot1)
Dim SOM2 As Word                                          ; Som van waarde's  (Instel + Som)
Dim Teller As Byte                                        ; Teller die het aantal pulsen op S1 telt
Dim Instel As Byte                                        ; Variabele instelwaarde
Dim AQ1 As Byte                                           ; Variabele uitgangswaarde voor PWM

Clear                                                     ; Alle variabele op 0 zetten

DelayMS 1000                                              ; Stabilisering systemen

        ;76543210                                         ; <-- Hulpregeltje
PORTA = %00000000                                         ; Alle poorten van PORTA laag maken
TRISA = %00000011                                         ; Poorten A0 en A1 als ingangen gebruiken, de rest als uitgang
PORTC = %00000000                                         ; Alle poorten van PORTC laag maken
TRISC = %00000000                                         ; ALle poorten van PORTC als uitgang gebruiken
PORTD = %00000000                                         ; ALle poorten van PORTD laag maken
TRISD = %00000000                                         ; Alle poorten van PORTD als uitgang gebruiken

ADCON0 = %00000011                                        ; A/D control register

; Hoofdprogramma
While 1 = 1                                               ; Oneindige lus

; Rekensom     
    SOM = Instel - Aflees                                 ; Som = Instel - Potmeter1

; Declareren      
    LED1 = LED1 ^ 1                                       ; Als LED1 aan is uitzetten en andersom
    Aflees = ADIn 0                                     ; Drukopnemer zit op analoge ingang 0

; Acties bij schakelaars    
    If S1 = AAN Then                                      ; Als S1 aan is dan
      DelayMS Contactdender                               ; Vertraging tegen contactdender 
      Inc Teller                                          ; Teller met 1 verhogen                                       
      While S1 = AAN : Wend                               ; Wachten tot S1 word losgelaten
      DelayMS Contactdender                               ; Vertraging tegen contactdender
    EndIf                                                 ; Einde als
    
    If S2 = AAN Then                                      ; Als schakelaar S2 aan is dan
      DelayMS Contactdender                               ; Vertraging tegen contactdender
      Clear                                               ; Alle variabele op 0 zetten
      While S2 = AAN : Wend                               ; Wachten tot S2 word losgelaten
      DelayMS Contactdender                               ; Vertraging tegen contactdender                
    EndIf                                                 ; Einde als
                                                     
; Beveiliging dat teller boven de 255 komt    
    If SOM2 > 255 Then                                    ; ALs SOM2 groter is als 255 dan
      AQ1 = 255                                           ; Analoge uitgang AQ1 heeft de waarde 255
      Else                                                ; Anders
      AQ1 = SOM2                                          ; AQ1 heeft de waarde van SOM2
    EndIf                                                 ; Einde als

; Beveiliging voor storingen door negatieve waarde's    
    If Aflees > Instel Then                               ; Als afgelezen waarde groter is als de ingestelde waarde dan
      SOM2 = Instel                                       ; SOM2 is gelijk aan de ingestelde waarde
      Else                                                ; Anders
      SOM2 = Instel + SOM                                 ; SOM2 is de som van Instel + SOM
    EndIf                                                 ; Einde als

; Wat moet er gebeuren bij welke tellerstand?    
    Select Teller                                         ; Kies de variabele Teller om te vergelijken
      
      Case 0                                              ; Als Teller 0 is, onderstaande uitvoeren 
      Instel = 0
      LED3 = AAN
      LED2 = UIT
      
      Case 1  ;6,6                                            ; Als Teller 1 is, onderstaande uitvoeren
      Instel = 182
      LED3 = UIT
      LED2 = AAN
      
      Case 2  ;6,2                                              ; Als Teller 2 is, onderstaande uitvoeren
      Instel = 172
      LED3 = UIT
      LED2 = AAN
      
      Case 3   ;5,8
      Instel = 162
      LED3 = UIT
      LED2 = AAN
      
      Case 4  ;5,4
      Instel = 153
      LED3 = UIT
      LED2 = AAN
      
      Case 5   ;5
      Instel = 143
      LED3 = UIT
      LED2 = AAN
      
      Case 6    ;4,6
      Instel = 134
      LED3 = UIT
      LED2 = AAN
      
      Case 7   ;4,2
      Instel = 124
      LED3 = UIT
      LED2 = AAN
      
      Case 8   ;3,8
      Instel = 114
      LED3 = UIT
      LED2 = AAN
      
      Case 9   ;3,4
      Instel = 104
      LED3 = UIT
      LED2 = AAN
      
      Case 10  ;3
      Instel = 94
      LED3 = UIT
      LED2 = AAN
      
      Case 11  ;2,6
      Instel = 84
      LED3 = UIT
      LED2 = AAN
      
      Case 12  ;2,2
      Instel = 74
      LED3 = UIT
      LED2 = AAN
      
      Case 13  ;1,8
      Instel = 63
      LED3 = UIT
      LED2 = AAN
      
      Case 14   ;1,4
      Instel = 53
      LED3 = UIT
      LED2 = AAN
      
      Case Else
      Instel = 0
      If Teller > 14 And S2 = UIT Then
      LED1 = UIT 
      LED2 = UIT
      LED3 = UIT
      Repeat
        LED1 = LED1 ^ 1
        LED2 = LED2 ^ 1
        LED3 = LED3 ^ 1
        DelayMS 100
      Until S2 = AAN
    EndIf
     
 EndSelect
    

      
    PWM Regtronic, AQ1, 20                                ; Stuur pulsjes naar regtronic met waarde van AQ1, 20 keer
 
 Wend                                                     ; Einde lus

End                                                       ; Einde programma]
Lambiek

Special Member

Ik mis nogal wat ontkoppeling op je print. Ik zie geen enkele elco of condensator op je print staan, ook de ontstoring rond je MCLR is niet in orde en dat kan voor veel problemen zorgen.

En als je via pwm 0 tot 5VDC wil maken heb je minimaal een filter nodig die daar voor zorgt, liever nog een filter in combinatie met een opamp.

Ik weet ook niet hoe lang de bedrading is tussen je ingang schakelaars, te lange bedrading geeft ook problemen.

Als je haar maar goed zit, GROETEN LAMBIEK.

Hoi Lambiek,

Bedankt voor je snelle reactie.

Ik ben nog nieuw met het maken van PCB's. Dit is daarom ook een van mijn eerste printplaten.

Ik ben van plan om deze print overnieuw te fabriceren. Wat netter/professioneler en ook wat minder storingsgevoelig inderdaad.

Ik heb 1 condensator op de print zitten om de gemiddelde analoge spanning van de PWM op te slaan.

Zou je mij wat tips kunnen geven over goede ontkoppeling van de print?
En hoe je zorgt voor een goede ontstoring van de MCRL?

Echter kan ik dit printje nog wel gebruiken om het programma te testen denk ik.

Lambiek

Special Member

Op 25 januari 2017 09:31:18 schreef wouterpw:
Ik heb 1 condensator op de print zitten om de gemiddelde analoge spanning van de PWM op te slaan.

Zelf doe ik het altijd op deze manier.
https://www.uploadarchief.net:443/files/download/resized/pwm%20naar%20analoog%2010vdc.jpg
In jou geval zonder R2 en R3, maar met een doorverbinding tussen pin_2 en pin_6. Omdat jij met 5VDC werkt. De voedingspanning moet uiteraard ook 5VDC zijn.

En ik zie nu dat ik dit al eens voorgesteld had in het andere topic, doe er iets mee zou ik zeggen.

Zou je mij wat tips kunnen geven over goede ontkoppeling van de print?

Begin met een paar elco's van rond de 100uF over je voeding te zetten, en twee condensatoren van 100nF over de voedingspinnen van de 16F877 (zo dicht mogelijk bij de pinnen).

En hoe je zorgt voor een goede ontstoring van de MCRL?

Dat kan je in de datasheet vinden van je 16F877. De MCLR ligt via 10K aan de 5VDC, en op het knooppunt van je weerstand en MCLR pin een condensator van 100nF naar de GND.

Ik zou ook aandacht aan de ingangen besteden in de vorm van ontkoppeling, in verband met eventueel lange bedrading.

Als je haar maar goed zit, GROETEN LAMBIEK.

Top!

Dat zijn inderdaad leerzame punten waar ik iets mee kan doen.
Wil proberen om na dit weekend een nieuwe PCB gereed te hebben.

Heb je misschien ook nog een idee hoe ik er in mijn programma voor kan zorgen dat hij pas begint te corrigeren nadat het systeem op druk is.

Ik wil eerst mijn ingestelde waarde (bijv. 168 bij 6.6 Bar) naar het ventiel sturen d.m.v. PWM en pas als het systeem op druk is (dit duurt ongeveer 2 seconden), beginnen met het corrigeren.

Is dit mogelijk?

Lambiek

Special Member

Hier heb je nog wat info over de print, kijk hier eens naar.

https://www.uploadarchief.net:443/files/download/resized/controller%20-%2016f887.gif

Dit is een 16F887, maar die heeft de zelfde pinning als de 16F877.

Ik zie dat je drie schakelaars hebt, S1, S2, en S3. Die zitten op poort A3, 4 en 5, maar die poorten staan niet als ingang gedefinieerd.

Als je haar maar goed zit, GROETEN LAMBIEK.

Bedankt!
Daar zal ik eens goed induiken van het weekend!

Oja, ik zal de schakelaars definiëren als ingangen.
Toch werken de ingangen wel naar behoren.

Het enige probleem wat ik nu eigenlijk heb is dat het programma de ingestelde waarde al begint te corrigeren voordat het systeem op druk is. Waardoor de afwijking veel hoger lijkt dan dat die is.

Voor de beeldvorming:
Als ik in plaats van de druksensor een potmeter gebruik om mijn schakeling te simuleren werkt alles perfect.

Snap je wat ik hiermee bedoel?

buckfast_beekeeper

Golden Member

Op 25 januari 2017 10:07:02 schreef wouterpw:
...
Heb je misschien ook nog een idee hoe ik er in mijn programma voor kan zorgen dat hij pas begint te corrigeren nadat het systeem op druk is.

Ik wil eerst mijn ingestelde waarde (bijv. 168 bij 6.6 Bar) naar het ventiel sturen d.m.v. PWM en pas als het systeem op druk is (dit duurt ongeveer 2 seconden), beginnen met het corrigeren.

Is dit mogelijk?

Timer inbouwen dat na elke correctie x seconden gewacht wordt voor er terug wordt geregeld? Laat de timer een boolean true maken zodra de tijd verlopen is. Corrigeer je, reset je de timer en zet je de boolean false. Je hoeft dan alleen een if booleanX rond je case te zetten. Timer mag gewoon blijven lopen. Alleen de interrupt wordt dan altijd uitgevoerd en de boolean wordt steeds true gezet. Wil je dat niet, moet je de timer stoppen en starten als het nodig is.

Van Lambiek wordt goede geuze gemaakt.

Oke,

Met een vertraging had ik ook geprobeerd.
Het probleem was toen echter, dat als het programma in het "DELAYMS 2000" stukje aan het wachten was, de ingestelde waarde ook niet naar het ventiel werd ge PWM'd. Dus na de vertraging begon het programma pas te PWM'en, waardoor het probleem eigenlijk hetzelfde bleef.

Of begrijp ik je verkeerd met het gebruik van een timer?

Lambiek

Special Member

Op 25 januari 2017 10:32:47 schreef wouterpw:
Voor de beeldvorming:
Als ik in plaats van de druksensor een potmeter gebruik om mijn schakeling te simuleren werkt alles perfect.

Wat voor een sensor gebruik je?, en hoe is die aangesloten?

Als je haar maar goed zit, GROETEN LAMBIEK.

Luchtdrukopnemer van Conrad.

https://www.conrad.nl/nl/tt-electronics-ab-9670501035-druksensor-0-bar…

Deze wordt aangesloten op het blauwe schroefklemblokje links langs de LEDs.
Pin 1 = +24V
Pin 2 = GND
Pin 3 = Ingang naar de PIC
pin 4 = Ingang naar de PIC via spanningsdeler (pin 4 is niet aangesloten)

Ons systeem werkt van 0 tot 10 bar, met deze meter heb ik dus altijd een 0 -> 5V signaal.
Als ik weet dat mijn schakeling werkt wil ik een duurdere en nauwkeurige sensor aanschaffen.

Op 25 januari 2017 10:57:21 schreef wouterpw:
Oke,

Met een vertraging had ik ook geprobeerd.
Het probleem was toen echter, dat als het programma in het "DELAYMS 2000" stukje aan het wachten was, de ingestelde waarde ook niet naar het ventiel werd ge PWM'd. Dus na de vertraging begon het programma pas te PWM'en, waardoor het probleem eigenlijk hetzelfde bleef.

Of begrijp ik je verkeerd met het gebruik van een timer?

Heeft deze PIC geen Hardware PWM want nu gebruik je software PWM en dat gaat bij delays inderdaad fout.
Dus als deze PIC een Hardware PWM heeft, gebruik dan de juiste poort (Zie datasheet PIC) en gebruik dan het commando HPWM ipv PWM.

Anders zou je het inderdaad op moeten lossen door een interrupt-routine waar je wat waardes bij houdt en naar believen aanpast als dit nodig is.

Edit: Hardware PWM is aanwezig op poort RC1 en RC2, je moet dan even kijken op welke poort PROTON dan de HPWM zet....

Domoticz en ESP8266, goede combo!!!
Lambiek

Special Member

Ik vind de sensor al duur genoeg eigenlijk. :)

Weet je de resolutie van de sensor, dus hoeveel volt/mV stuurt de sensor uit per stapje?

Op 25 januari 2017 14:33:15 schreef Roches:
Heeft deze PIC geen Hardware PWM want nu gebruik je software PWM en dat gaat bij delays inderdaad fout.

Ik vond het PWM gebeuren ook een beetje vreemd, dit type pic heeft ook HPWM.

Als je haar maar goed zit, GROETEN LAMBIEK.

Dus als ik het goed begrijp kan ik beter HPWM gebruiken omdat deze onafhankelijk van mijn programma constant doorgaat?

De resolutie van de sensor durf ik zo niet te zeggen.

Kan ik de HPWM waarde wel softwarematig aanpassen als bijvoorbeeld S1 word gemaakt?

Lambiek

Special Member

Hier heb je een voorbeeld:

pic basic code:


Symbol FREQUENTIE = 5000   ; PWM frequentie 5Khz

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        ; Variabele in

pic basic code:


HPWM 2, DATA_IN, FREQUENTIE

Data_in is een variabele waarde tussen de 0 en 255, de frequentie is een vaste waarde. In dit geval is dat 5KHz.

En let even hierop, dit zijn de HPWM frequenties waar je je aan moet houden. Die mogen niet onder de aan gegeven waarde komen.

code:


Xtal    frequency Lowest useable Pwm frequency
4MHz    145Hz
8MHz    489Hz
10MHz   611Hz
12MHz   733Hz
16MHz   977Hz
20MHz   1221Hz
24MHz   1465Hz
33MHz   2015Hz
40MHz   2442Hz

Jij mag dus niet onder de 1221Hz komen, anders werkt het niet goed.

De resolutie van de sensor durf ik zo niet te zeggen.

Misschien is die vrij grof, omdat het met een potmeter wel goed werkt volgens jou.

Als je haar maar goed zit, GROETEN LAMBIEK.

Welk type van die sensor heb je? De meeste industriële sensors zijn 4-20mA die kan je niet zomaar aan je processor hangen.

Automotive engineer - www.easy-tech.nl
Lambiek

Special Member

Als je haar maar goed zit, GROETEN LAMBIEK.

Op 25 januari 2017 15:20:52 schreef wouterpw:
Dus als ik het goed begrijp kan ik beter HPWM gebruiken omdat deze onafhankelijk van mijn programma constant doorgaat?

De resolutie van de sensor durf ik zo niet te zeggen.

Kan ik de HPWM waarde wel softwarematig aanpassen als bijvoorbeeld S1 word gemaakt?

Ja de HPWM loopt gewoon door en je kunt hem in je programma gewoon aanpassen zoals jij dat wilt...

Dus zoals lambiek al heeft aangegeven en je aansluiting van de klepaansturing op de juiste poort zetten.

Daarna kun je rustig een delay in je programma zetten om te wachten op de juiste drukgegevens....

Domoticz en ESP8266, goede combo!!!

Op 25 januari 2017 16:20:11 schreef Paul Welther:
Welk type van die sensor heb je? De meeste industriële sensors zijn 4-20mA die kan je niet zomaar aan je processor hangen.

Met een 250 ohm weerstand in serie krijg je een 1-5V signaal en daarmee kan die wel overweg.

Voor de testopstelling had ik eerder gekozen voor een drukomvormer die op 5V werkt met een uitgang van 0.5-4.5V, daarmee heb je geen 24V voeding meer nodig en kan de spanningsdeler ook weg.

buckfast_beekeeper

Golden Member

Op 25 januari 2017 10:57:21 schreef wouterpw:
Oke,

Met een vertraging had ik ook geprobeerd.
Het probleem was toen echter, dat als het programma in het "DELAYMS 2000" stukje aan het wachten was, de ingestelde waarde ook niet naar het ventiel werd ge PWM'd. Dus na de vertraging begon het programma pas te PWM'en, waardoor het probleem eigenlijk hetzelfde bleef.

Of begrijp ik je verkeerd met het gebruik van een timer?

Je gebruikt een delay en dan stopt je programma. Maak een timer aan die om de x tijd afloopt. Zodra deze timer afloopt krijg je een interrupt (programma onderbreking). In deze interrupt routine maak je de boolean hoog en stop je desgewenst de timer. Daarna gaat het programma gewoon verder waar het gebleven was. Zodra de boolean true is ga je het ventiel desgewenst bijsturen waarna je de timer terug start en de boolean terug false maakt. Je lus wordt gewoon constant doorlopen.

Een hardware PWM is uiteraard handiger dan een software variant. Je hoeft jezelf niks aan te trekken van timing. Alleen nieuwe waarde en gaan met die banaan.

Van Lambiek wordt goede geuze gemaakt.

Bedankt allemaal!

Morgen wil ik aan de slag met de HPWM!

Ter info: Deze drukopnemer heb ik genomen omdat ik er voor nood snel eentje nodig had.
Een P-30 pressure transmitter van WIKA (0-5V, 0 - 10 Bar) staat in bestelling.

Zal jullie op de hoogte houden!

Domoticz en ESP8266, goede combo!!!

Heb het druk gehad van het weekend maar de ontwerpfase is afgerond.
Hoop dat ik de nieuwe print deze week geëtst krijg.

Ik heb alle tips die ik de vorige keer gekregen heb verwekt in het schema van mijn nieuwe pcb.
Heb er ook maar meteen een dubbelzijdige van gemaakt met wat smd componenten.

Als alles gelukt is zal ik het direct posten!
Bedankt voor de interesse!

Update:
Hieronder wat foto's van het proces.

[Bericht gewijzigd door wouterpw op 31 januari 2017 09:25:23 (13%)]

Ik heb helaas wat vertraging met mijn project.
Zal jullie op de hoogte houden als ik ga afronden.

Een vraagje tussendoor:
Is het mogelijk om met een PIC Controller een uitgangssignaal van 4-20mA te realiseren?

Shiptronic

Golden Member

Niet direkt , maar met behulp van wat randcomponenten is het prima te doen. Rijst mij de vraag, waarom zelf print ed. maken, ipv bv, een logo?

Wat doen C9 & C10? Heb je een schema, zo ja is het vaak handiger die eerst te posten voor je een print gaat etsen.

[Bericht gewijzigd door Shiptronic op 14 februari 2017 13:15:19 (29%)]

Wie de vraag stelt, zal met het antwoord moeten leren leven.