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]