REGOLATORE PI

 

Questa apparecchiatura ha  2 ingressi :

  1. la sonda temperatura
  2. il potenziometro per il setpoint

ed una uscita analogica a tensione variabile (PWM)

 

Il programma legge la temperatura sul canale analogico 3 ,ADC3  ed il segnale del potenziometro sul canale analogico 4 ,ADC4.

Sul CB280   sono rispettivamente ADC3=P27 e ADC4= P28

Il segnale di uscita su P5=PWM0

 

La lettura della sonda , termocoppia 1 sulla scheda , avviene tramite la corrispondenza:

 

t= 0,0732*N+14

 

dove N=valore risultante dalla conversione ADC(fra 0 e 1023)

con la chiamata della funzione :

 

tempm=termocoppia_1(3)

che  richiama l’espressione di cui sopra.

La scheda della termocoppia

 

 

 

 

 

 

 

La scheda di comando della lampadina e impostazione,tramite trimmer, delsetpoint

 

 

 

IL LISTATO

 

Const Device = CB280

'termocoppia 1 su ADC3

'lampadina su porta P5

'potenziometro su ADC4

 

'18 aprile 2011

Dim tempo As Single

Dim azp As Single

Dim azi As Single

Dim intervallo As Single

Dim pwm_out As Single

Dim area As Single

Dim area_t As Single

Dim kp As Single

Dim ki As Single

Dim lux As Integer

Dim setpoint As Single

Dim bandap As Single

Dim tempoint As Single

Dim tempm As Single

Dim max_uscita As Integer

Dim menouno As Single

Dim tipouscita As Byte

Dim old As Single

Dim r As Single

Dim scostamento As Single

Dim sp1 As String

Dim supc As Byte

supc=1

If supc=1 Then intervallo=300

If supc=0 Then intervallo=2000

'non e possibile mettere un IF !

Set Debug Off

menouno=-1

tempo=0

max_uscita=1023

Low 5

area_t=0

tempo=0

Debug CLR

Do

Debug CLR

tempo=tempo+intervallo/1000

tempm=termocoppia_1(3)

setpoint=leggo_setpoint(4)

sp1="Temp="

scrivi 2,sp1,tempm,1

sp1="SETPOINT="

scrivi 3,sp1,setpoint,1

scostamento=tempm-setpoint

sp1="Scostamento="

scrivi 4,sp1,scostamento,1

sp1="tempo[sec]="

scrivi 5,sp1,tempo,0

sp1="regolazione=PI  Banda Proporzionale=2'C"

scrivist 6,sp1

bandap=2

kp=menouno*1023/bandap

sp1="kp="

scrivi 7,sp1,kp,2

tempoint=30

sp1="tempo integrale[sec]="

scrivi 8,sp1,tempoint,0

r=1023/tempoint

ki=1023/(bandap*tempoint)

sp1="Kintegrale="

scrivi 9,sp1,ki,3

r=(setpoint-tempm)*intervallo/1000

area_t=area_t-r

If tempm<setpoint-bandap/2 Then area_t=0

If tempm>setpoint+bandap/2 Then area_t=0

sp1="Area parziale['C x sec]        ="

scrivi 10,sp1,r,2

sp1="Area Totale                    ="

scrivi 11,sp1,area_t,2

r=azione_prop()

azp=r

sp1="Azione proporzionale           ="

scrivi 12,sp1,azp,2

r=azione_int()

azi=r

sp1="Azione integrale               ="

scrivi 13,sp1,azi,2

pwm_out=azp+azi

If pwm_out>max_uscita Then pwm_out=max_uscita

If pwm_out<10 Then pwm_out=10

lux=pwm_out

Pwm 0,lux,1023

sp1="potenza totale                 ="

scrivi 14,sp1,pwm_out,1

sp1="potenza totale in %            ="

r=pwm_out*100

r=r/1023

scrivi 15,sp1,r,1

If supc=0 Then Delay intervallo

If supc Then seriale

Loop

End

Sub lampeggio(porta As Byte)

Out porta,1

Delay 100

Out porta,0

Delay 100

End Sub

Sub scrivo(riga As Byte)

Dim sp As String

Debug Goxy,1,riga

Debug sp

End Sub

Function leggo_setpoint(porta As Integer) As Single

Dim nnn As Integer

nnn=Adin(porta)

r=30*nnn

r=r/1023

r=25+r

leggo_setpoint=r

End Function

Function leggo_bandap(porta As Integer) As Single

Dim nnn As Integer

nnn=Adin(porta)

leggo_bandap=0.5+10*nnn/1023

End Function

Function leggo_tempoint(porta As Integer) As Single

Dim nnn As Integer

nnn=Adin(porta)

leggo_tempoint=30+210*nnn

End Function

Function azione_prop()

Dim vt As Single

vt=512-max_uscita*(tempm-setpoint)/bandap

If vt<0 Then vt=0

If vt>max_uscita Then vt=max_uscita

azione_prop=vt

End Function

Function  azione_int()

azione_int=-ki*area_t

If tempm>setpoint+bandap/2 Then azione_int=0

If tempm<setpoint-bandap/2 Then azione_int=0

End Function

 

        'provaseriale

Sub seriale()

Dim i As Integer

Bclr 0,1

Opencom 0,9600,18,9,54

Bclr 1,2

For i=1 To 9

If i=5 Then r=azp

If i=6 Then r=azi

If i=7 Then r=scostamento*100

If i=8 Then r=88888

If i=9 Then r=99999

If i=1 Then r=tempm*10

If i=4 Then r=bandap*10

If i=3 Then r=tempoint

If i=2 Then r=setpoint

sp1=Fp(r,5,0)

Putstr 0,sp1

Next

Delay intervallo

End Sub

'soubroutine che visualizza alla riga

'il numero=num Con decimali=decim

's=testo

Sub scrivi(riga As Integer,ss As String,num As Single,decim As Integer)

Debug Goxy,1,riga

Debug ss

Debug Fp(num,10,decim)

Debug Goxy,1,riga

End Sub

'soubroutine che visualizza alla riga

'il testo=s

Sub scrivist(riga As Integer,ss As String)

Debug Goxy,1,riga

Debug ss

End Sub

'lettura termocoppia con amplificatore

Function termocoppia_1(porta As Integer)As Single

Dim nn As Integer

nn=Adin(porta)

r=732*nn

r=r/10000

r=14+r

termocoppia_1=r

End Function

Function retta(porta As Integer,min As Single,max As Single)As Single

Dim nn As Integer

nn=Adin(porta)

r=min+nn*(max-min)/1023

retta=r

End Function

 

N.B. Se si cambia :

SUPC=1

Set Debug Off

In :

Set Debug ON

supc=0

 

L’uscita è sul monitor anzichè sul PC

 

 

 

 

 

 

Il programma che visualizza il grafico leggendo i valori dal micro

 

Grafico temperatura

 

 

 

 

 

Figura 1

 

Uscita del micro sul monitor

 

 

 

 

 

Figura 2

 

Figura 3

 

 

 

Lampadina  5 watt (senza il coperchio) e termocoppia

 

SVILUPPI:

Con il ULN2803 la lampadina può essere al massimo da 5 watt per canale(se ne potrebbero mettere più di una )

Con il mosfet IRF530 si arriva a 21 Watt

Con il dimmer in alternata si arriva a 750 watt:il programma è uguale ,cambia l’uscita che va al DIMMER

 

 

la scheda con il dimmer ed il sensore di temperatura

Il segnale del micro di comando lampadina va a VREG1

Il segnale di acquisizione temperatura va prelevato da OUT SONDA 1

Temperatura=-23+N*100/1023

N=valore letto dal canale analogico