Building Blocks ‐ HU - gajdipajti/fan-control GitHub Wiki

Építőelemek

A dokumentáció, rajzok, áramköri vázlatok CC BY-SA-4.0 license alatt érhetőek el.

Az építőelemeket, amikkel dolgozni fogunk, vagy más projekt során előkerülhet, itt gyűjtöm össze. Nehéz meghúzni a vonalat, hogy mit írjak le és mit hivatkozzak be. Ami fontos, hogy nem kell végigolvasni, mindenki válogassa ki számára a nem világos elemeket, és ha még kérdés van, akkor inkább térjen vissza ide. Idővel bővíteni fogom, és ábrákkal tarkítani.

Egy projekt indítása kapcsán sokszor utána kell néznem a forrásoknak, hogy összerakjam a kivitelezési tervet. Ha ezek egy helyen össze lennének gyűjtve, akkor az nekem is megkönnyítené a visszaemlékezést.

Olyan elemeket válogattam, amiket könnyű beszerezni, jó a támogatottságuk, és a kezdő felhasználókat sem rémíti meg. Ez egy hatalmas téma, és több irányból is meg lehet közelíteni. Tipikusan azt az utat fogom követni, hogy leírom a saját megközelítésem és egy másik megközelítésként mellékelek GreatScott! vagy EEVBlog videót is a témáról, ha van.

A tipikus probléma az szokott lenni, hogy ha egy katalógust előveszünk, akkor a sok választékban elveszhetünk. Mi alapján választunk? Mennyire precíz, mekkora a szórása? BJT vagy FET a kimenete? Mekkora a működési feszültségtartomány? Sok esetben elegendő csak egy általános és olcsó elemet használni, főleg prototípusoknál. Ebben próbálok meg segíteni.

Pár hivatkozás (odysee), ami máshol érdekes lehet:

SZTE Egyetemi kurzus anyaga (amit én is tanultam):

Megjegyzés: A feszültséget végig V-vel fogom jelölni a magyarban használatos U betű helyett. Ezt a kódban is így teszem.

Alap áramköri elemek

A furatszerelési technológia vagy THT szerint fogjuk megvalósítani a projektet. Ez egyszerűbb, gyorsabb és több javításra ad lehetőséget, mintha a felületszerelést (SMD) választanánk.

Ellenállás

Az Ohm-törvény írja le az ellenállás-feszültség-áramerősség kapcsolata között:

$$ R = {V \over I} $$

Mértékegysége az Ohm, vagy Ω. Tipikusan használt értékei 200 Ω és 10 000 Ω tartományon mozognak. Értéksorozatok szerint [E6, E12, E24] tudjuk vásárolni őket. Ha nem lenne az általunk kívánt értékű, akkor kettő vagy több ellenállás soros vagy párhuzamos kapcsolásával elő tudjuk állítani a kívánt értéket. Az ellenállásokon színes sávokkal jelölik az érték számjegyeit, tartományát és az érték szórását. Rajzokon és szövegben értékek jelölésénél az Ω jelet el szokás hagyni, és egy tömör jelölést használunk:

  • 100 Ω -> 100R
  • 200 Ω -> 200R
  • 1000 Ω -> 1k
  • 4700 Ω -> 4k7

Úgy gondolkozzunk az Ohm-törvényről, hogy ha van egy 5 V-os feszültségforrásunk és sorba kötünk vele egy 330 Ω értékű ellenállást, akkor az átfolyó áram 0,015 A lesz, ha nincs más fogyaszó az áramkörben. Erről pedig tudunk működtetni egy sorba kötött LED diódát. Ebben az esetben kevesebb áram folyna a diódán, mert számolnunk kell egy feszültség eséssel és egy belső ellenállással is. Ha 1k-ra választjuk az értékét, akkor 0,005 A lesz az átfolyó áram, és sorba kötve ugyanaz a LED halványabban fog világítani.

Az értékek szórása lehet 10%-tól lefelé egészen 0.01% is. Ez természetesen az ár növekedésével is jár. Ahol az ellenállás érték kevésbé fontos (LED dióda fénye, felhúzó ellenállás, ...) ott 5%-os ellenállásokat szoktam használni. Míg ahol fontos az érték (feszültségosztó, műveleti erősítős kapcsolás, mérési kapcsolás, ...) ott 1%-0,5% ellenállásokat szoktam használni. Kivételes esetben 3-5 1%-os ellenállást párhuzamosan kötök, hogy a hiba mértékét csökkentsem. Felesleges mindenféle értékű és pontosságú ellenállásból tartani otthon a készletünkben. Ne legyünk gyűjtögetők.

Projekthez szoktam összerakni az ellenállás készletet, általában ami nálam tipikusan a polcról levehető az:

  • 5%: 220R, 470R, 1k, 3k3, 4k7, 10k
  • 1%: 1k, 4k7

Ami még fontos, az a hőfejlődés az ellenállásban. Az átfolyó áram alapján így kapjuk meg a teljesítményt:

$$ P = I^{2} \cdot R $$

Vegyük észre, hogy az átfolyó áramtól négyzetesen, míg az ellenállástól lineárisan függ a teljesítmény. Vagyis ha az 5 V feszültség forrásunkra egy 1 Ω értékű ellenállást kötünk, akkor P = 25 W. Ne fűtsük el az ellenállásainkat.

A projekt kapcsán mi 1k értékű 5%-os és 4k7 értékű 1%-os ellenállásokat fogunk használni. Az előbbiek a bipoláris tranzisztorokhoz fognak kelleni, míg az utóbbiak a feszültségosztóhoz és a DS18B20 szenzorhoz. A szenzornak nem lenne lényeg az ilyen pontos ellenállás, de egy projektnél ne növeljük a különböző komponensek számát. Tartsuk meg ezt a jó szokást.

További anyagok:

Dióda

A dióda egy nemlineáris és asszimetrikus áramköri elem. Alap esetben csak egy irányban vezeti az áramot, és csak egy bizonyos feszültségérték felett. Ez utóbbit hívjuk nyitófeszültségnek.

Két dolgot emelnék ki, ami miatt érdemes használni:

  • Ha szeretnénk feszültséget csökkenteni, akkor egy 0,7 V nyitófeszültségű diódát sorba kötve a 12 V feszültség forrással 11,3 V-ot kapunk. Nagyobb áramoknál a feszültségesés növekszik, és akár 1 V is lehet, így ne a pontos értékben gondolkodjunk ha alkalmazzuk.
  • Védelmi szempontból, a 12 V-os ágra szoktam tenni egy diódát, hogyha véletlenül felcserélem a pólusokat, akkor ne tudjon áram folyni. Nem minden esetben használható, de érdemes gondolni rá. Nem szeretem az égett szilícium illatát éjfél után.

A legklasszikusabb dióda az 1N400x család, ahol az 1-es a pólusszám - 1, míg az x pedig a záró irányú feszültség maximális értékére utal 1-7 között. Itt 1 az 50 V-ot, míg 7 az 1000 V-ot jelöli.

A diódák egy külön csoportja fényt bocsát ki, ha a két pólusuk közötti feszültség meghaladja a nyitófeszültséget. Ezek a LED-ek, a nyitófeszültségük pedig a kibocsátott fény hullámhosszával ellentétesen változik. A vörös LED akár 2 V alatt, míg a kék 3,5 V felett nyit ki. Ami fontos, hogy saját magukba soha ne használjuk őket, mivel általában feszültség forrásról működnek. Mindig kössük sorba egy 220 Ω vagy 330 Ω ellenállással az átfolyó áram korlátozására.

További információ:

Bipoláris tranzisztor

A bipoláris tranzisztor is egy nemlineáris, asszimetrikus áramköri elem, de három kivezetéssel. Ezek a C-kollektor, E-emitter, B-bázis. Két fő típusa van: NPN és PNP. Az előbbi a Bázison befolyó áram esetén engedi az áram átfolyást a Kollektor felől az Emitter irányába. Az utóbbinál az Emitterből a Bázison kifolyó áram esetén engedi az Emitter->Kollektor áram átfolyását.

A projekt során mi NPN típusút fogunk használni és az esetek nagyobb részében a ilyenekkel kell megoldani a problémát. A Kollektor áramát a következő képlet adja meg:

$$ I_{C} = \beta \cdot I_{B} $$

Itt β (vagy hFE) az erősítési faktor, tipikusan 50 és 250 közötti érték szokott lenni. Ez azt jelenti, hogy kis áramokkal tudunk százszor vagy kétszázszor nagyobb áramot szabályozni. Hasonlóan a diódákhoz, itt is el kell érni egy nyitófeszültséget $ (V_{BE}) $, hogy az áram át tudjon folyni.

Amire használjuk majd az a 12 V-os feszültséggenerátor kapcsolása 5 V vagy 3,3 V segítségével. Vagyis a Bázist az Arduino Nano vagy a Raspberry Pi fogja kapcsolni ki be, és ezell nyitjuk vagy zárjuk a Kollektor-Emitter áramot.

Egy klasszikus NPN bipoláris tranzisztor a 2N3904, míg PNP testvére a 2N3906. Az N előtti szám itt is a pólusszám - 1 értékre utal, csak érdekesség képpen. Fontos, hogy ezek kis teljesítményű tranzisztorok, tehát tipikusan kapcsolásra lehet őket használni. A projekthez mi a BD139-16 tranzisztort fogjuk használni, amely nagyobb Kollektor-Emitter áramoknál sem fog túlmelegedni.

Egy fontos dolgot kell megemlíteni, hasonlóan a diódánál a Bázis-Emitter áramot semmi nem akadályozza, ha egyszer elértük a nyitófeszültséget. Ezért egy ellenállást kell a mikrovezérlő kimenet és a bipoláris tranzisztor Bázis lába közé tenni. Ennek az értékét vagy a mikrovezérlőhöz méretezzük vagy a megoldandó feladathoz. Amelyik az áramra szigorúbb feltétel. Gondolatok:

  • A kezemben egy 12 V; 0,6 A számítógép ventillátor van.
  • A BD139-16 erősítése 150-250 között van, ennek a középértékét fogom használni a becslésekhez. 1,5 A a maximális állandó ICE, míg impulzusszerűen 3 A. A VBE nyitófeszültség 1 V, míg a VCE feszültség nyitott állapotban 0,5 V-nak vehető, ami a 12 V-ból jön le veszteségként.
  • Arduino Nano esetén 5 V és 40 mA a limit. A legközelebbi ellenállás a 220 Ω értékű lenne az E6 készletben, tehát 22,7 mA-t tudna keresztülfolyni rövidzár esetén. Ha figyelembe vesszük a VBE nyitófeszültésget, akkor 18 mA lenne az átfolyó IBE áram. Míg az ICE maximális értéke 3,636 A, amit a ventillátor limitál majd 0,6 A-re.
  • Ugyanez 1k ellenállással 5 mA rövidzárlati áramot, 4 mA IBE-t és 800 mA ICE-t jelentene.
  • Raspberry Pi esetén 3,3 V és 16 mA a limit, a korábbi 220 Ω ellenállással 15 mA tudna keresztülfolyni rövidzár esetén. Számolva a feszültségeséssel ez 10,5 mA-t jelentene IBE irányba, ami 2,09 A maximális ICE-t jelentene.
  • Ugyanez 1k ellenállással 3,3 mA rövidzárlati áramot, 2,3 mA IBE-t és 460 mA ICE-t jelentene. Itt érdemes lenne elgondolkodni egy 680 Ω, 470 Ω, vagy 500 Ω értékű ellenálláson is. Az utóbbit két párhuzamosan kötött 1k Ω ellenás adná ki.

További olvasnivaló:

Kondenzátor

Ez az alap elektronikai építőelem úgy viselkedik, mint egy elektromos energia tároló, és meg is állnék ennél a tulajdonságánál a projekt szempontjából. Mi csatolásmentesítésre (leválasztás, decoupling) fogjuk használni, vagyis hogy egy bizonyos elemet az áramkör többi részének zajától leválasszuk, vagy stabilizáljunk.

Két fő típust emelnék ki, ezek a kerámia és az elektrolit kondenzátorok. Az előbbiek tipikusan 1 uF és 10 pF értékek között érhetőek el, és nem polarizáltak. Az utóbbiak 1 uF és 100 mF értékek között érhetőek el, és nem összetévesztendő a pozitív és negatív oldaluk. Valamint figyelnünk kell arra, hogy mekkora a megengedett maximális feszültség.

Esetünkben ez a külső Analog-Digital átalakítót kellhet zajmentesíteni, és ökölszabály szerint egy 100 nF-os kerámia kondenzátort tennék oda (de az adatlappal konzultáljunk, mert a projektben más értéket kell használnunk majd). Ha zajos a feszültségforrásunk, akkor egy 22 uF - 100 uF értékű elektrolit kondenzátorral kötném párhuzamosan 16 V - 25 V maximális feszültséggel. A leválasztó kondenzátor használata nem kötelező, de elegáns.

További információ:

Analog-Digital átalakítás (ADC)

Folytonos analóg jelek digitális számmá történő alakítását analóg-digitális átalakítók (A/D átalakító, vagy ADC) végzik. Ez az átalakítás azonban nem lehet tökéletes, mert egy véges felbontáson tudjuk csak ábrázolni a jel pillanatnyi értékét egy egész számmal a mérési tartományon belül. Ez a felbontás (N) lehet 8, 10, 12, vagy 16 bit. Sőt akár ennél finomabb is. Figyelni kell arra, hogy feleslegesen ne válasszunk nagy felbontású A/D átalakítót, mert a legkisebb bitek sokszor már csak zajt tartalmaznak. Alacsony felbontású A/D átalakító tipikusan gyorsabban számol, míg egy nagyobb felbontásúnak több idő kell, amíg visszaadja az eredményt. A mérési tartomány általában 0 V és a referencia feszültség (VREF). A legelterjettebb mód a jelek digitalizálására a szekvenciális közelítésen (successive approximation) alapul. Egy másik egyszerű mód pedig komparátorokat és ellenállásokat használ, feláldozva a felbontást a sebesség oltárán.

adc-step

Egy rossz felbontású ADC szemléltetése.

A cél mindig a feladatnak megfelelő A/D átalakító megtalálása a "sebesség – ár – felbontás – hiba mértéke" paraméterek mentén. A tipikus kérdések egy projekt elkezdésekor, hogy milyen felbontásra van szükség, milyen gyorsan kell mintavételezni, illetve mekkora hibát engedhetünk meg. Egy mikrovezérlőben lévő ADC átlagos minőségűnek tekinthető, az igazán pontos mintavételezéshez, vagy ha a mikrovezérlő nem tartalmazza az ADC-t, akkor külső feszültség és hőmérséklet stabilizált A/D átalakítóra van szükség. Ilyen lehet például a Microchip MCP3008 (10 bit felbontás, 8 csatorna), vagy az MCP320x (12 bit felbontás) család. Ezek SPI interfészen kommunikálnak, Arduino-hoz és Raspberry Pi-hez is van támogatásuk. Arduino esetén több library is elérhető a Library Managerből, Raspberry Pi-nél pedig hagyatkozhatunk a device tree overlay-re vagy gpizero megvalósítására.

Megjegyzés: Mielőtt választanánk más külső ADC-t, érdemes rákeresni, hogy milyen a támogatottsága és hogy nekünk kell-e megírni hozzá a kódrészletet. Megfordítva a kérdést, fizeti-e a projekt, hogy nulláról induljunk?

Jelen projekt kapcsán elegendő számunkra a 0,5 °C felbontás, a 15 másodpercenkénti mintavételezés, és +/-2%-os hiba. Ennél rosszabb specifikáció is megtenné, mert egy lassan változó folytonos értéket szeretnénk követni. Természetesen ettől többet fogunk teljesíteni.

A mintavételi frekvenciával most nem foglalkozunk, gyorsan változó jeleknél az érdekes. Ilyen esetben a Shanon-Nyquist mintavételi tételt kell figyelembe venni: a visszaállítandó jel frekvenciájához képest a mintavételi frekvenciának legalább kétszeresnek kell lennie.

Egy A/D konverter esetén a felbontást az alábbi képlet írja le: $$ V_{LSB} = {V_{REF} \over 2^{N}} $$ Arduino Nano esetén elegendő lesz a belső A/D átalakító pontossága és 10 bites felbontása. Raspberry Pi esetén a device tree és gpizero támogatottság miatt az MCP3202-re esne a választás, ami jóval többet tud, mint amire szükségünk van.

Az adatlap javaslatait követve az MCP3202-nél egy 1 uF-os kondenzátort kell használni a leválasztáshoz.

További referencia:

Feszültség referencia

A legegyszerűbb feszültség referencia a két sorban kötött ellenállásból álló feszültségosztó lenne. Ebben az esetben a R1 a referencia feszültséghez közelebbi ellenállást jelenti. A R2 ellenálláson ekkor Vout feszültség mérhető: $$ V_{out} = {R_{1} \over (R_{2} + R_{1}) } \cdot V_{ref} $$

A probléma ezzel a módszerrel, hogy nem terhelhető, mert akkor megváltozik a feszültség érték. Ennél sokkal pontosabb eredményt kapunk egy feszültség stabilizátort használunk, vagy még pontosabbat, ha egy feszültség referenciát használunk.

Feszültség stabilizátorok általában terhelhetőek is 100 mA - 3 A tartományon tipikusan, és a klasszikusa ennek a kategóriának az L7805, ami 7,5 V - 35 V tartományból stabil 5 V-ot állít elő. A különbséget az átfolyó áram szerint pedig elfűti (hűteni kell). Valamint a stabilabb feszültség eléréséhez a bemeneten egy 330 nF-os a kimeneten pedig egy 100 nF-os kondenzátort kell használni az adatlap szerint. Az Arduino Nanón is található egy a VIN táplálás esetén, az LM1117MPX-5.0, ami 800 mA terhelhetőségű és a 6,5 V - 15 V tartományból stabil 5 V-ot állít elő.

Ha csak kis mértékű terhelhetőség kell, viszont annál precízebb és pontosabb érték, akkor feszültség referenciát használunk.

Az A/D átalakítók és mikrovezérlők általában tartalmaznak belső feszültség referenciát, vagy a tápellátásukhoz van kötve a referencia. Erről az adatlapjuk nyújthat tájékoztatást. De mi is megválaszthatjük a referenciát, ha a pontosabbat vagy az elvégzendő feladathoz jobban illeszkedőt szeretnénk.

Arduino Uno és Nano esetén a belső feszültség referencia 5,0 V és 1,1 V lehet. Természetesen az előbbi 5,0 V akkor érvényes és pontos, ha nem USB-ről tápláljuk meg az Arduino-t. Más értékekhez használhatunk külső referenciát amit az AREF bemenetre kell kötni (ne felejtsük el módosítani a kódban), és akkor mi választhajuk meg az ADC mérési tartományát. Raspberry Pi-ben nincs saját ADC, de ha külső ADC-t választunk, akkor ahhoz használhatjuk a 3,3 V-os kimenetét.

A teljesség igénye nélkül említenék pár külső feszültség referenciát: az LM285Z-1.2G esetén ez 1,2 V-ot, az LM385Z-2.5 esetén 2,5 V-ot, míg az LM336Z-5 esetén 5 V-ot jelent. A külső feszültség referenciák értékeiket nagy hőmérséklet tartományon (-50 °C – 150 °C) pontosan is tartják, ami a mérési hibánkat csökkenti.Csak érdekesség képpen, választhatunk az A/D átalakítónkhoz passzoló feszültségforrást is mondjuk a Texas Instruments LM4040-N-4.1-ét használva, ami 4,096V feszültséget állít elő. Egy 12-bites ADC felbontása ekkor 0,001 V, és megkönnyíti a számolást.

Az alábbi táblázatban láthatjuk, hogy különböző mérési tartományokon milyen felbontással tudjuk digitalizálni a feszültséget. Egy jól megválasztott referencia feszültséggel is lehet spórolni a bitszámon.

N 2N VLSB (VREF = 5 V) VLSB (VREF = 2,5 V) VLSB (VREF = 1,1 V)
8 256 0,0195 V 0,00977 V 0,0043 V
10 1024 0,00488 V 0,00244 V 0,001074 V
12 4096 0,00122 V 0,00061 V 0,000268 V
16 65536 0,00000763 V 0,0000381 V 0,0000168 V

Ha tudjuk, hogy a mérendő feszültségünk 0-1 V között lesz, akkor 1,1 V-ra választva a referencia feszültséget jobb felbontást tudunk elérni 8 bites ADC-vel, mintha 5 V-os referenciával használnánk egy 10 biteset.

A projekthez elegendő az 5 V-os vagy az 1,1 V-os referencia Arduino esetén. Ezt a hőmérséklet szenzor választásunk határozza majd meg. Az 5,0 V érték azonban csak akkor stabil, ha a VIN lábról tápláljuk meg lapot. Raspberry Pi esetén ha olyan hőmérséklet mérést választunk, hogy külső A/D átalakítóra is szükség lesz, akkor a 3,3 V-os referencia feszültséget tudjuk használni. Vagy mi választunk egy ennél kisebb értékű külső feszültség referenciát.

Hőmérséklet mérés

Külső hőmérséklet mérésére több megoldást is szeretnék mutatni, amelyek közül bármelyik megfelelő lehet a levegő vagy egy felület hőmérsékletének a mérésére. A megoldandó feladat szempontjából bármelyik elegendő lenne. Csak a 10 °C – 85 °C tartományra vagyunk kíváncsiak, nem kell figyelni a maró hatású anyagokra, nincs porra vagy kondenzálódó vízre kiemelt elvárás. De nézzük meg hogyan is tudunk választani a lehetőségek közül. Három fogalmat fogok használni: precizitás, pontosság, és linearitás. Az összegzésben fejtem ki őket.

Feszültség kimenetű szenzorok

A/D átalakítóval rendelkező mikrovezérlőre vagy külső A/D átalakítóra építve a legegyszerűbb olyan szenzort használni amely már eleve feszültség kimenettel rendelkezik. Ilyen például az Analog Devices AD22100 szenzora vagy a Texas Instruments LM35 szenzora. Ebben az esetben az ADC által kiolvasott értéket feszültséggé kell alakítani, majd az adatlapban található képlet alapján ki lehet számolni a hőmérsékletet. Arduino Nano esetén a 0 V – VREF tartomány 10 bit-en digitalizálódik, vagyis 0-1023 értéket kapunk vissza. A továbbiakban ezt fogom alapul venni. A külső MCP3202 esetén a mért érték 12 bit-en digitalizálódik, ha ezt használjuk, akkor 4096-ra helyettesítsük az 1024-et.

Az AD22100 adatlapja alapján a szenzor -50 °C és 150 °C tartományon használható, +5 V-ról táplálható ami +4 V és +6,5 V tartományt jelent. Linearitása +/- 1%, pontossága +/-2% a teljes mérési tartományon. Képletéből kiderül, hogy -50 °C hőmérsékleten 0,25 V-ot, míg 150 °C-on 4,75 V-ot mérnénk: $$ V_{out} = \left( {V_{+} \over 5V} \right) \cdot (1,375 V + 0,0225 V/°C \cdot T) $$ Feltételezve, hogy $ V_{+} = 5 V $ az egyenletből a hőmérsékletet kifejezve: $$ T = {V_{out} – 1,375V \over 0,0225 V/°C} $$ Arduino esetén pedig: $$ T = {{ADC \cdot (V_{ref}/1024) – 1,375 V} \over 0,0225 V/°C} $$

Az LM35 adatlapja alapján a szenzor -55 °C és 150 °C tartományon használható, +5V-ról táplálható ami +4 V és +20 V tartományt jelent. Pontosságát +/- 0,75 °C-ra írja az adatlap a teljes tartományra. Képletéből kiderül, hogy a -55 °C hőmérsékleten -0,55 V-ot, míg 150 °C-on 1,5 V-ot mérnénk: $$ V_{out} = 0,01 V/°C \cdot T $$ Egyszerű esetben csak pozitív tartományt tudunk mérni vele, ami nekünk meg is felel. Az adatlapjában benne van a megoldás, hogy negatív tartományt is tudjunk mérni (diódával el kell tolni a 0 °C értéket). Arduino esetén a hőmérséklet: $$ T = {{ADC \cdot (V_{ref}/1024) } \over {0,01 V/°C}} $$ Megjegyzés: a felbontást úgy tudjuk növelni, hogy a $ V_{ref} $ értéket csökkentjük.

Ellenállás kimenetű szenzorok

Az anyagok ellenállása a hőmérséklet hatására változik. Ha a periódusos rendszert nézzük, akkor általánosan elmondható, hogy fémek esetén a hőmérséklet növelésével nő az ellenállás, míg félvezetők és szigetelők esetén csökken. Ez a változás általában kis mértékű és nem használható mérésre. Bizonyos anyagok, ötvözetek, vegyületek esetén azonban jó hőmérő készíthető.

A teljesség igénye nélkül két típust említenék meg. Ipari alkalmazásokban a platina ellenállására építő Pt100 és Pt1000 hőmérők az elterjedtek, ahol a névben szereplő szám a 0 °C-on mért ellenállást jelenti Ohm-ban (Ω) kifejezve. Hőmérsékletfüggésük egészen jól leírható egy lineáris összefüggéssel. Elektronikában a termisztorok terjedtek el NTK (NTC) és PTK (PTC) kivitelben sokféle értékkel. Az N és a P azt jelenti, hogy a hőmérséklet növelésével csökken (N) vagy növekszik (P) a termisztor ellenállása. Hőmérséklet mérés mellett szabályozásra is használhatóak, az előbbi a hidegindításkor fellépő nagy áramok elleni védelemre, míg az utóbbi a túlmelegedés elleni védelemre használható.

A termisztor ellenállása erősen függ a hőmérséklettől és exponenciális függvénnyel írható le. Ehhez két paraméterre van szükségünk, ami tipikusan leírja a termisztort:

  • R25 – a 25 °C-hoz tartozó ellenállásérték. Általában 1k Ω, 4k7 Ω, 10k Ω, vagy 100k Ω lehet.
  • K vagy β – az anyagra jellemző hőmérsékleti tényező. Tipikusan egy 4000 1/Kelvin körüli érték, abszolút értékben.

Az ellenállás kiszámítható az alábbi képlet segítségével: $$ R_{T} = R_{25} \cdot e^{(K \cdot (1/T – 1/T_{25}))} $$

ntc

Amit fontos megjegyezni, hogy a képletben hőmérsékletek Kelvinben értendőek, vagyis a $ T_{25} = 298,16 K $. Az ábrán Celsius skálát használtam.

Ebből kifejezhetjük a hőmérséklet reciprokát: $$ {1 \over T} = {1 \over T_{25}} + {1 \over K} \cdot \ln {\left( {R_{T} \over R_{25}} \right) } $$ Mikrovezérlővel és külső A/D átalakítóval nem tudunk ellenállást mérni közvetlen módon. Egy feszültségosztós elrendezéssel viszont már vissza lehet vezetni egy már megoldott módszerre, vagyis hogy feszültséget mérjünk. A pontosságot a feszültségosztóhoz választott ellenállás (Rs) értéke, pontossága fogja befolyásolni. Érdemes ezért az R25 értékkel megegyező ellenállást választani és az 1%-os tűrésű ellenállás sorozatból. Igényesebb áramkörök esetén külső feszültség referencia itt is használható (például LM336Z-5 5V-hoz), vagy az ADC VREF értékéhez kötjük a feszültségosztónk.

Arduino esetén így alakul a termisztor ellenállásának kinyerése az ADC értékéből: $$ V_{out} = {R_{T} \over (R_{s} + R_{T}) } \cdot V_{ref} $$ $$ ADC = {V_{out} \over V_{ref}} \cdot 1024 $$ $$ ADC = {R_{T} \over (R_{s} + R_{T})} \cdot 1024 $$ $$ {ADC \over 1024} = {1 \over (R_{s}/R_{T}) + 1} $$ $$ R_{T} = {R_{s} \over (1024/ADC) -1)} $$

Ezt az RT ellenállás értéket pedig csak vissza kell helyettesíteni a korábbi 1/T egyenletbe. Ha külső A/D átalakítót használunk, akkor ne felejtsük el a felbontást átírni.

Digitális szenzorok

Az igazán kényelmes megoldás eleve olyan szenzorokat használni, amelyek a hőmérséklettől függő komponenst és az A/D átalakítót is magukban tartalmazzák. A hőmérséklet értéket pedig SPI (Serial Peripheral Interface, vagy 3-Wire Interface), I2C (Inter-Integrated Circuit, vagy 2-Wire Interface), vagy 1-Wire kommunikációs protokollon lehet kinyerni. Ha ezekből a szenzorokból szeretnénk választani keressünk rá a támogatottságra, például a Bosch BME és BMP családba tartozó szenzoraihoz már szinte minden megvan. Ez ugyancsak igaz a Maxim (régebben Dallas) DS18B20 1-Wire hőmérséklet szenzorára, de az olcsó DHT22-es ismeretlen szabványú 1-Wire szerű hőmérséklet-páratartalom szenzorára is. Nekem legtöbb tapasztalatom a DS18B20 szenzorral van, így ezzel folytatom.

ds Raspberry esetén a bekötés.

A DS18B20 szenzor táplálása történhet +3,3 V és +5 V feszültségről, és a 1-Wire hálózathoz egy digitális I/O lábat és hozzá egy 4k7 Ω felhúzó ellenállást kell használni Arduino vagy Raspberry Pi esetén. A szenzor felbontása állítható 9-12 bit között, mérési tartománya -55 °C – 125 °C. Pontossága +/- 0,5 °C.

További előnye, hogy egy 1-Wire hálózaton (tehát egy digitális I/O lábat használva) fél-duplex módon akár több szenzorral is tudunk kommunikálni, és mindegyik külön is címezhető. Bár kézzel is megírhatnánk a 1-Wire kommunikációt (egyetem alatt megcsináltuk laborgyakorlaton mikrovezérlőre), a projekt kapcsán mi az előre elkészített könyvtárakat használhatjuk majd és csak egy szenzorral. Arduino esetén ez a OneWire és a DallasTemperature használatát jelenti majd, míg Raspberry Pi esetén ez a w1-gpio overlay-t, valamint a w1_gpio és a w1_therm Linux kernel modulokat jelenti.

További információ:

Összegzés

Mivel egy referencia áramkört akarok építeni és hozzá referencia kódot, ezért mindhárom típusú hőmérséklet-mérésből megvalósítok egyet-egyet. Mindenki válassza ki magának, hogy melyik tetszik és melyik kényelmes a számára.

Egy kis méréselmélet

Egy fizikai mennyiséget (távolság, hőmérséklet, feszültség, ...) többször megmérve, a kapott értékek eltérhetnek egymástól. Ha szigorú vagyok, akkor azt mondanám, hogy kétszer nem kaphatjuk ugyanazt az értéket, ha végtelen felbontású a mérőeszközünk. Két mérés között az eltérés olyan kicsi is lehet, hogy a mérőeszközünk nem is biztos, hogy ki tudja jelezni. Ha a mért érteket szeretnénk megbecsülni a mérőeszközünk által kijelzett értékekből, akkor átlagot számolunk. A kijelzett értékek szórásából pedig precizitást is meg tudjuk kapni. Több mérés és átlagolás növelheti a precizitást, de ne essünk abba a hibába, hogy feleslegesen sokat mérünk, és valójában nem jutunk pontosabb értékhez.

Az átlagolásból kapott mért érték nem biztos, hogy megegyezik a valós értékkel. A műszerünk által kijelzett értékek rendelkezhettek egy konstans eltolással (offset) pozitív vagy negatív irányba. Az átlagolás során kapott eredmény is rendelkezni fog ezzel az eltolással, és azt hogy ez mekkora, a pontossággal tudjuk megadni. Ha ismerjük a pontosságát a mérési módszerünknek, akkor arra tudunk korrigálni.

Lineáris összefüggésről akkor beszélünk, ha két fizikai mennyiség kapcsolata visszavezethető egy lineáris egyenletre $ f(x) = Ax + B $. A valóságban általában ez csak kis mérési tartományban igaz, nagyobb mérési tartományon a linearitás nem teljesül. Ha például a feszültség és ellenálláson átfolyó áram kapcsolatára vagyunk kíváncsiak, akkor számolnunk kell az ellenállás melegedésével is. Fémréteg ellenállások ellenállása növekedni, míg a szénréteg ellenállások ellenállása csökkenni fog a hőmérséklet növelésével.

Impulzushossz moduláció (PWM) és időzítők

Az impulzushossz moduláció egy módszer arra, hogy a mikrovezérlő által kiadott analóg jel időben átlagolt teljesítményét, vagy időben átlagolt értékét tudjuk egy digitális érték alapján változtatni. A cél nem a pontos jelalak visszaállítása, arra ott lenne a Digital-Analog átalakító (DAC), az időbeli átlagot állítjuk vissza, átlagolás nélkül. Arduino Nano esetén jól ismertek a PWM-ek és időzítók. Raspberry Pi esetén a gpiozero PWMOutputDevice tudjuk használni.

Két fontos érték van, amire figyelni kell:

  • Ismétlési frekvencia - hányszor adja ki a mikrovezérlő az impulzust, ez egy fix érték általában, a kód futása közben nem változtatjuk.
  • Kitöltési tényező (duty cycle) - az impulzus időablakában az impulzus meddig volt magas (vagy bekapcsolt) állásban a teljes időablakhoz képest.

$$ \tau = {T_{on} \over {T_{on} + T_{off}}} \cdot 100 % $$

Ha a bekacsolt állapot 5 V-ot jelent, míg a kikapcsolt 0 V-ot, akkor egy τ = 20% kitöltési idejű PWM jel időbeli átlaga 1 V. Arduino Nano esetén a kitöltési tényezőt 8 biten tudjuk megadni, tehát az 0-255 értéket vehet fel. Az alábbi ábrán láthatjuk a különböző kitöltési tényezőket és hozzá az Arduino parancsot.

PWM

Forrás: Basics of PWM

Egyszerű terheléseknél (LED, ellenállás, motor, izzó) a PWM vezérlés nem jelent gondot. Ha szeretnénk időbeli átlagolást hozzáadni a PWM-hez, akkor egy ellenállásból és kondenzátorból álló aluláteresztő szűrőt kell rákötni. Az igazán igényesek pedig egy követő műveleti erősítővel tehermentesítik az aluláteresztő szűrőt, és a műveleti erősítő kimenetét terhelik... (de elkalandozom).

Az ismétlési frekvenciát a belső időzítő (Timer) adja, amiből 3 darab van az Arduino Nano-ban. Az ismétlési frekvenciák alap esetben 976 Hz (Timer0) és 488 Hz (Timer1-2). Ezek állítására az alábbi lehetőségek vannak 16 MHz-es alap-órajelet feltételezve:

Érték Osztó Timer0 [Hz] Timer1 [Hz] Érték Osztó Timer2 [Hz]
0x01 1 62500,0000 31250,0000 0x01 1 31250,0000
0x02 8 7812,5000 3906,2500 0x02 8 3906,2500
0x03 64 976,5625 488,2812 0x03 32 976,5625
0x04 256 244,1406 122,0703 0x04 64 488,2812
0x05 1024 61,0351 30,5176 0x05 128 244,1406
0x06 256 122,0703
0x07 1024 30,5176

A frekvenciák beégetése pedig az alábbi Arduino kódsorokkal történik:

TCCR0B = TCCR0B & 0b11111000 | 0x01;    // Timer0   f=~62,5 kHz
TCCR1B = TCCR1B & 0b11111000 | 0x01;    // Timer1   f=~31kHz
TCCR2B = TCCR2B & 0b11111000 | 0x01;    // Timer1   f=~31kHz

Egy időzítőhöz két kimenet tartozik Arduino Nano esetén:

  • 3, 11 - Timer2
  • 5, 6 - Timer0 - a delay(), millis(), micros() függvények is ehhez az órajelhez kötődnek.
  • 9, 10 - Timer1

A leggyorsabb frekvenciára lesz szükség a projekt kapcsán, mert a ventillátor PWM vezérléséhez 21 kHz-es jel szükséges, a bipoláris tranzisztoros megoldásnál pedig a jel simítását így ússzuk meg.

Referencia:

Ventillátorok, DC motorok

Számítógép ventillátorok üzemfeszültség szerint három kategóriába sorolhatóak: +5 V, +12 V, és +24 V. A legelterjedtebbek a +12 V-ról üzemelő ventillátorok, asztali számítógépeket ilyenekkel szerelik, és olcsóak is. Ezek három csatlakozótípussal érhetőek el, a vezetékek színeit az Intel specifikáció szerint adtam meg:

Vezeték Funkció Szín 2-vezeték 3-vezeték 4-vezeték
1 GND fekete igen igen igen
2 +12 V sárga igen igen igen
3 RPM zöld igen igen
4 PWM kék igen

Ne lepődjünk meg, ha eltér nálunk a vezetékek színe, a funkciók a megfelelő sorrendben lesznek. A GND szerencsére mindig fekete.

A 2 és 3 vezetékes ventillátorok esetén az impulzushossz modulációt használjuk ki a fordulatszám vezérlésére. Impulzushossz modulációval előállítjuk a kitöltési időt. A tranzisztor kollektor oldalán sorba kötjük az a ventillátorral. A ventillátor +12 V vezetékét és a tranzisztor emitterét pedig rákötjük a tápegységre. Így visszük át a ventillátorra a PWM jelet. Alacsony fordulatszámokhoz kis kitöltési tényezős impulzusokat használunk, míg nagy fordulatszámokhoz nagy kitöltési tényezős impulzusokat. Ezzel a megoldással három gond van:

  1. A fordulatszám visszajelzést a három vezetékes ventillátorok esetén kiolvashatatlanná teszi. A megoldás erre az, hogy aluláteresztő szűrőt, követő műveleti erősítőt és tranzisztort használunk. Ez viszont tovább bonyolítaná a projektet.
  2. A motorokban lévő tekercs miatt a megszakításokkor ellentétes irányú áramok generálódnak. A megoldás itt egy dióda, amit a ventillátorral párhuzamosan kötünk, hogy az ilyen impulzusokat elvezesse.
  3. PWM zaj, vagyis ha alacsony frekvenciás impulzusokat használunk, akkor egy cicergő hangot fogunk hallani. A megoldás erre, hogy a PWM frekvenciát megnöveljük (ahogy a korábbi alfejezetben említettem), vagy választjuk az aluláteresztő szűrős, műveleti erősítős kapcsolást.

A 4 vezetékes ventillátoroknál egyszerűbb dolgunk van. Itt a fordulatszám vezérlését a PWM vezeték végzi. Tápegységre kell kötni a +12 V és GND vezetékeket, nekünk a PWM vezetékkel kell foglalkozni. Az intel specifikációja szerint az alábbi dolgoknak kell megfelelnünk:

  • Az ismétlési frekvencia 25 kHz, az elfogadott tartománya 21 kHz - 28 kHz. - Ennek eléréséhez a Timer1 és Timer2 használható, még ha felette is vagyunk.
  • A nulla szint maximum 0,8 V lehet.
  • A rövidzárási áram 5 mA lehet maximálisan. - Arduino Nano és a Raspberry Pi is ki tudja adni ez az áramot.
  • A maximális feszültség 5,25 V lehet. - Arduino Nano és a Raspberry Pi is belefér ebbe a tartományba. Az utóbbi esetén lehet szükség lesz még egy tranzisztorra.
  • A kitöltési tényező 0% - 100% között mozoghat. - Ez valójában 20% - 100%, a ventillátornak van egy minimum fordulatszáma.

Arduino Nano és Raspberry Pi esetén maximum 4 darab 4 vezetékes ventillátort tudunk vezérelni. Míg 3 és 2 vezetékes ventillátorból az Arduino Nano 6 csatornát tud kezelni, a Raspberry Pi pedig 4-et. Itt az a lehetőségünk is megvan, hogy egy csatornára több tranzisztort tegyünk és több ventillátort kössünk rájuk.

Fordulatszám mérés (RPM)

A ventillátorok 3. vezetéke jelez vissza, hogy mekkora a fordulatszám. Nekünk kell megtáplálni 3,3 V vagy 5 V feszültséggel, amit fordulatonként kétszer nullába visz a ventillátor. Az egyszerű megoldás, hogy megszámoljuk, hogy egy perc alatt hány impulzus volt, a haladóbb megoldás, hogy megmérjük két impulzus között eltelt időt. Mi az utóbbit tesszük majd.

Hivatkozott dokumentumok:

⚠️ **GitHub.com Fallback** ⚠️