Jag har en gammal Weller WECP-20 hemma som jag vill förbättra. Weller är ett mycket bra märke och är tyvärr ofta förknippat med dom där blåa tegelstenarna så som WECP-20, WS 81, WESD51, WES51 med mera. Det är liksom Weller budgetversioner. Men bara för att dom är budget betyder inte att dom inte kan utföra jobbet korrekt.
Hur som helst. Hemligheten bakom en lödstation vilar i följande:
- Stabil temperatur reglermässigt
- Snabbhet från viloläge upp till arbetstemperatur
- Robust temperatur mot yttre temperaturförändringar
- Lödspetsen har låg eller ingen läckageström
- Lödspetsen har en god kvalité och behöver bytas sällan
Planen:
En Weller WECP-20 är ett rentoldat AC system som styr värmelementet via en triac. Jag har tänkt och konvertera AC till DC och styra värmelementet via likström som regleras med en N-kanal MOSFET. Alltså en klassisk sak.
För att göra detta så måste jag först konvertera AC till DC och där efter så måste jag se till så en mikrokontroller kan utföra följande:
- Reglering av strömmen till lödspetsen
- Mätning av temperaturen i lödspetsen
- Läckageströmvakt för att indikera om lödspetsen har fått en skada eller blir ledande
- Läsning av inställningstemperaturen
I början så tänkte jag att vi skulle titta oss in i en Weller WECP-20. Denna Weller har en transformator som skalar ned 230V till 24V. Det är fortfarande växelström. Kretskortet är sitter fast med bara en skruv som röda pilen visar. Detta är en jord-skruv för ESD anslutning. Notera att en Weller WECP-20 har dock ingen jordanslutning via nätkabeln! Så blir det kortslutning där inne, ja, då blir troligtvis kretskortet laddat med 230V spänning om man har otur, vilket leder till att värmelementet kommer få 230V istället för 24V. Dock så kommer spetsen inte att bli laddad med 230V då en spets från en Weller är isolerad från värmelementet. Men detta hindrar inte att ledarbanorna på kretskortet går av först. Visst, en Weller WECP-20 är ett helt analogt AC system som reglerar värmen med en PI-regulator. Då tänkte jag att jag gör en klassisk AC till DC konvertering. Så här kommer vi få 24VAC till 24VDC med andra ord. Men jag måste konvertera enda ned till 3.3V för jag tänkte köra en STM32F051 uC!

Målet med detta är att försöka kolla om man kan implementera en Model Predictive Controller (MPC) istället för PID.
Om ni har svårt att förstå vad han menar så kan man säga att en PID reglerar med avseende på felet mellan mätsignalen (ärvärde) och referenssignalen (börvärde). En MPC reglerar på att vilka insignaler behöver jag för att mätsignalen följa snabbaste vägen till referenssignalen.
Om man vill ha en matematisk förklaring på detta så ska man först och främst bygga en modell av dynamiken i mätspetsen. När strömmen u kommer in i lödspetsen så kommer vi få y värme ut. Matriserna A, B, C, D beskriver bara dynamiken. Detta är ett sätt att skriva en Ordinär Differentials Ekvation (ODE) på första graden, då andra gradens ODE:er går inte att simulera, än. Denna modell kallas för tillståndsmodell där tillståndet är x. Ett tillstånd kan vara t.ex. innersta temperaturen på solen, medan y är endast mätbara signalen, t.ex. en temperaturgivare hos en rymdsond hos planeten Mercurius och u är förbrukningen av helium hos solen per sekund. Som sagt, x går inte att mäta på riktigt, men det går att estimera och få ett godtyckligt värde. Jag förstår om ni ser ut så här just nu:

\(x(k+1) = Ax(k) + Bu(k)\\y(k) = Cx(k) + Du(k)\)
Se dessa filmer i serie. Då kommer du förstå tillståndsmodellen. A, B, C, D är bara en standardform för att simulera linjär dynamik. Notera att dynamik på riktigt är inte linjärt, men det går att approximera linjärt i en olinjär miljö.
Här är målet med tillståndsmodeller. Du kan simulera dessa. Låt oss säga att vi vet initiala tillståndet x_0. Det kan vara t.ex. temperaturen 20 grader C. Sedan applicerar vi strömmen u = 1A för alla u_n. Då kan vi räkna ut alla tillstånd. Om vi säger att tillståndet x är exakt som utsignalen y så måste matrisen C = 1, alltså tillståndet x är observerbart.
Då kan vi räkna ut
\(x_2 = Ax + Bu_1 \\
x_3 = Ax_2 + Bu_2 = A[Ax + Bu_1] + Bu_2\\
x_4 = Ax_3 + Bu_3 = A[A[Ax + Bu_1] + Bu_2] + Bu_3\\
x_5 = Ax_4 + Bu_4 = A[A[A[Ax + Bu_1] + Bu_2] + Bu_3] + Bu_4\\
x_6 = Ax_5 + Bu_5 = A[A[A[A[Ax + Bu_1] + Bu_2] + Bu_3] + Bu_4] + Bu_5\\
x_7 = Ax_6 + Bu_6 = A[A[A[A[A[Ax + Bu_1] + Bu_2] + Bu_3] + Bu_4] + Bu_5] + Bu_6\)
Vilket resulterar på slutet
\(x_7 = A^6x + A^5Bu_1 + A^4Bu_2 + A^3Bu_3 + A^2Bu_4 + ABu_5 + Bu_6\)
Men hela serien kan skrivas till:
\(x_n = A^{n-1}x_0 + \sum_{k = 0}^{n-2} A^{k}Bu_{n-k-1}\)
Då är frågan...vad ska vi ha med detta att göra? Vi kan alltså veta framtida insignaler igenom att simulera från initiala tillståndsväret x0.
Ja, det är detta MPC är skapat för!
Låt oss säga att skriver om hela serien som jag beskrev ovan, till matrisform:
\(\begin{bmatrix}
x_1\\
x_2\\
x_3\\
x_4\\
\vdots\\
x_{n}
\end{bmatrix} = \begin{bmatrix}
A\\
A^2\\
A^3\\
A^4\\
\vdots\\
A^{n-1}
\end{bmatrix}x_0+\begin{bmatrix}
B & 0 & 0 & 0 & \dots & 0\\
AB & B & 0 & 0 & \dots & 0\\
A^2B & AB & B & 0 & \dots& 0\\
A^3B & A^2B & AB & B & \dots& 0\\
\vdots & \vdots & \vdots &\ddots &\ddots & 0\\
A^{n-2}B & A^{n-3}B & A^{n-4}B & A^{n-5}B & \dots & B
\end{bmatrix} \begin{bmatrix}
u_0\\
u_1\\
u_2\\
u_3\\
\vdots\\
u_n
\end{bmatrix}\)
Ni alla som har läst första kurs i Linjär algebra 7.5 hp på ett valfritt universitet, så har ni säkert kommit i kontakt med Row Echelon Form och Gaussian Elimination för att lösa linjära ekvationssystem på formen:
\(Ax = b\)
Där A är en känd matris, x är en vektor okänd vektor och b är en känd vektor.
Så vad ska vi använda denna form till? Jo, för att vi ska konvertera till följande form. Notera att jag använder samma A och x för att beskriva standardformen för linjära system och tillståndsmodeller, men det är inte samma. Så skilj på dom.
\(\overset{\begin{bmatrix}
B & 0 & 0 & 0 & \dots & 0\\
AB & B & 0 & 0 & \dots & 0\\
A^2B & AB & B & 0 & \dots& 0\\
A^3B & A^2B & AB & B & \dots& 0\\
\vdots & \vdots & \vdots &\ddots &\ddots & 0\\
A^{n-2}B & A^{n-3}B & A^{n-4}B & A^{n-5}B & \dots & B
\end{bmatrix}}{A} \overset{\begin{bmatrix}
u_0\\
u_1\\
u_2\\
u_3\\
\vdots\\
u_n
\end{bmatrix}}{x} = \overset{\begin{bmatrix}
x_1\\
x_2\\
x_3\\
x_4\\
\vdots\\
x_{n}
\end{bmatrix} - \begin{bmatrix}
A\\
A^2\\
A^3\\
A^4\\
\vdots\\
A^{n-1}
\end{bmatrix}x_0}{b} \)
Så vad ska vi göra med denna form då?
\(Ax = b\)
Jo, om vi sätter alla x_n till samma värde t.ex. "350 grader C" så har vi bara insignalerna u_n att lösa!
Superenkelt! Detta är fundamentala grunden till optimal reglering, men problemet är att om vi skulle reglera med detta så skulle vi dom absolut bästa signalerna redan vid första tiden vid start. Detta låter osannolikt att temperaturen kan öka från 20 grader C till 350 grader C på en iteration hos processorn. Så vi måste sätta in begräsningar på hur kraftigt insignalen u_n får vara. Vi kan bestämma att den får inte gå starkare än 1A i ström och den kan inte gå under 0A i ström.
Så ni kommer vi in på optimeringslära. Här kan vi använda den linjära formen Ax = b och skriva om den på den kvadratiska optimeringsformen:
\(J = \frac{1}{2}x^TQx + c^Tx\)
Där J ska vara så liten som möjligt. Visst kan vi sätta x = 0, men då blir egentligen felet större för om tillståndet ej rör sig, så kommer avståndet mellan referensmålet och initiala målet vara stort, alltså J blir stort.
Jag tror detta är lite väl för mycket teori för er, men i grund och botten handlar MPC om att räkna ut hur mycket effekt vi behöver för att uppnå till en viss referens (börvärde).
Jag skriver min kvadratiska MPC regulator i rent ANSI C.

24V till 7.5V:
Tidigare ovan så berättade jag att jag vill konvertera 24VAC till 24VDC. Men jag har även behov utav att konvertera 24V till 7.5V, likström alltså.
Jag kommer även konvertera om den switchande nätaggregatet från 7.5V till 3.3V igenom en linjär spänningsregulator. Mest bara för att den linjära spänningsreglatorn har inte så mycket brus.
Tanken är att 3.3V ska driva processorn Processor:
Processorn är en STM32F051R8T6 processorn som jag ska programmera i C99.
Den har några fåtal intressanta in- och utgångar:
- TEMPERATURE: Detta är temperaturmätningen hos termoelementet i JBC spetsen
- CURRENT: Detta är strömmätningen som går igenom JCB spetsen
- HEATER_PWM: Detta styrningen för att pytsa in strömmen till JBC spetsen
- LEAKAGE_LEVEL: Detta är spänningsmätningen hos JBC spetsen för att avgöra om termoelementet börjar läka ström
- LEAKAGE_THRESHOLD: Detta är ett fixerat gränsvärde i form av en spänning som läckaget i termoelementet ej får överstiga
- POTENTIOMETER: Referensvärdesinställningen, även kallat börvärde. Detta är samma potentiometer på Wellern.
- LEAKAGE_ACTIVE: Detta är en digital utgång som indikerar om termoelementet i JBC spetsen börjar läka mer än normalt
- N_SLEEP: Detta är en pull-up som ska anslutas mot JBC spetsen. JBC spetsen ska vara väldigt nära 0V, fast inte helt 0V. Kanske några mV ovanför. Men när N_SLEEP ansluts mot JBC spetsen, så kommer lödstationen gå ned till 100 grader C
Styrningen är enkelt. Det är en vanligt MOSFET Gate drivare som driver en liten N-kanal MOSFET.
Lite enkelt förklarat så går strömmen igenom N-kanalen och vidare till RED som är den röda kabeln på ett JCB handtag. Strömmen går sedan spetsen och ut på BLUE, vilket är den blåa kabeln på ett JBC handtag. Notera att strömmen går vidare till 5 mOhm motståndet som har väldigt hög effekt. Detta har med att jag ska mäta spänningsfallet över motståndet för att räkna ut strömmen. Annars så finns det en diod mellan RED och BLUE och denna är till för att leda bort spänningsspikar då ett JCB värmeelement har en stark induktans. Ja, klassisk "diod över spole"-teknik. Inte så många som tänker på detta för en JCB spets

Mätningen är väldigt enkel. Ena mäter temperaturen och andra mäter strömmen. Men här finns något som heter GREEN. Det är en gröna kabeln i ett JBC handtag. Denna är själva "GND" kabeln i ett JCB handtag, men inte helt exakt 0V. Utan den är något upphöjt för att man ska kunna mäta termoelementets temperatur. Som du ser så är varje fysisk rörbar in och utgång skyddad med TVS dioder. Läckage:
Här kommer läckaget. Notera att här förekommer GREEN igen. Som du ser så kör jag strömmen från GREEN igenom två stycken 100 mOhm motstånd på 0.25W. Detta har med att jag gör en spänningsfördelning. För låt oss säga att RED som är 24V och GREEN som ska vara väldigt nära 0V, men om termoelementet är sönder, t.ex. kortslutning, då kommer GREEN och RED få samma spänningsnivå. Då kommer LEAKAGE_LEVEL att vara runt 3.044V.
Här kan vi notera att GREEN är ganska låg på spänning. Skulle N_SLEEP ta kontakt med GREEN så kommer N_SLEEP få en låg spänning.
Utgångar:
Här är utgångarna. Jag har valt 2.54mm pinnar som jag ska montera Weller-kablarna i, istället för att sätta dit stift och sedan löda fast kablar på stiften. 3D model:
Kretskortet är ett 2 lagers kretskort. Ingen impedansanpassning. 0.3/0.5 vior och ibland 0.3/0.7 vior för starkare strömmar. Minsta ledarbana är 0.24mm i bred. Minsta isolationsavstånd är 0.2mm. Då kan vilket arsle som helst tillverka kretskortet (Fick höra detta från en på mitt jobb, tyckte det lät som ett fint uttryck för att beskriva tillverkare

- Fixa så en gröna LED-dioden på Weller WECP-20 kan styras av processorn
- Stitcha massvis med vior (0.3/0.5) så alla signalvior kan få sin referensvia
- Välja systemidentifieringsalgoritm för att bygga tillståndsmodellen
- Bygga på C biblioteket för Model Predictive Control
- Fundera på hur man ska kunna kalibrera systemet utan att använda potentiometrar eller interaktiv LCD......
Kanske UART är en lösning.
- Gå igenom så allt ser bra ut t.ex inte missat något