Podívali jsme se na jednoduché řízení vstupu a výstupu a zjistili jsme, že jsme poněkud omezeni proudem, který můžeme spínat.

Nyní, když jsme se podívali na některé jednoduché I/O, stojí za to věnovat trochu času elektronice výstupu a vstupu. Než se podíváme na to, jak software zpracovává vstup, potřebujeme pochopit některé problémy, se kterými se software musí vypořádat. Nejdříve základní elektronika – jak lze tranzistory použít jako spínače. Přístup je velmi jednoduchý, stačí pro jednoduché obvody, které digitální elektronika využívá. Nestačí pro návrh vysoce kvalitního zvukového zesilovače nebo podobných analogových zařízení, ale může to být vše, co potřebujeme. Základem veškeré elektroniky je Ohmův zákon, \(U = I\cdot R\), to znamená pochopit vztahy mezi napětím, proudem a odporem.

Základy elektrického řízení

Pokud nejste obeznámeni s elektronikou, je důležité vědět, při jakém napětí se pracuje a kolik proudu může protékat. Nejdůležitější je vědět, že Pico pracuje se dvěma napěťovými úrovněmi – 0V (vypnuto, low, off) a 3.3V (zapnuto, high, on). Čip RP2040 může pracovat v rozsahu napětí od 1.8V až 3.3V, ale Pico má v sobě zdroj, který převede jakékoliv napájecí napětí na 3.3V – výsledkem je, že Pico je 3.3V logické zařízení.

Pokud jste pracovali s jinými logickými zařízeními, možná budete znát více, 0V a 5V jako nízké a vysoké úrovně (Arduino má 5V logiku). Pico používá nižší úroveň napětí, aby se snížila jeho spotřeba energie, což je dobré, ale musíme mít na paměti, že možná budeme muset použít nějakou elektroniku, abyste změnili 3.3V na jiné hodnoty. Totéž platí pro vstupy, které nesmí překročit 3.3V, neboť to znamená riziko poškození Pica.

Důležitou otázkou je, jaký proud GPIO linky zvládnou aniž by došlo k poškození čipu. To není jednoduchá otázka a v době psaní dokumentace není v této věci jasno. Podle dokumentace lze každou linku GPIO nastavit na „drive“ 12 mA. Nicméně, toto neznamená úplně to, co si myslíte. Toto není horní hranice dodávaného proudu, ale konfigurace, která je potřebná pro zajištění výstupu napětí linky GPIO jsou v rámci specifikace, zatímco pracuje na 12 mA – více informací viz kapitola 18. To znamená, že designéři zamýšleli, že linka GPIO bude použita při 12 mA, ale to není horní limit napájecího proudu.

Jediný citovaný horní limit je, že celkový proud pro všechny GPIO linky by měl být menší než 50 mA. Vzhledem k tomu, že existuje 30 GPIO linek, to dává průměr 1,6 mA na linku GPIO. V praxi s největší pravděpodobností budete v bezpečí při maximálním proudu 12 mA pro malý počet linek. V praxi, pokud plánujete použít více než 1,6 mA z více GPIO linek, zvažte použití tranzistoru. Pokud vaše obvody odebírají více než 50 mA z napájecí lišty 3.3V zvažte samostatný napájecí zdroj.

Všimněte si, že limit 12 mA znamená, že nemůžete bezpečně řídit standardní 20mA červenou LED bez omezení proudu pod 12mA. Lepším řešením je použití nízkopříkonové 2mA LED nebo použít tranzistorový zesilovač.

Řízení svítivé diody (LED) pomocí GPIO

Nejdůležitější věcí, kterou potřebujeme vědět je, jak spočítat hodnotu rezistoru, který omezuje proud svítivou diodou.

Jestliže bychom zapojili svítivou diodu přímo na GPIO pin a zem, potom při vysokém stavu na GPIO bude na LED diodě 3.3V a to nemusí dioda vydržet.

LED je nelineární elektronická součástka a chová se tak, že napětí na ní je téměř konstatní nezávisle na protékajícím proudu.

Tabulka 1. Voltampérová charakteristika a schematická značka

VA charakteristika LED

zapojeni LED 2

Z voltampérové charakteristiky je vidět, že svítivou diodu musíme napájet ze zdrojem proudu a ne ze zdroje napětí. GPIO pin se chová (s přihmouřením oka) jako zdroj napětí. Není to ideální zdroj napětí, ale omezení proudu bude klidně na 50mA.

Zdroj proudu uděláme ze zdroje napětí pomocí vložení odporu do obvodu (zjednodušeně).

Úbytek napětí \(U_f\) na svítivé diodě můžeme snadno změřit, buď multimetrem anebo speciálním měřičem součástek.

Tabulka 2. Naměřená napětí \(U_f\) na různých LED
barva \(U_{f}\)

červená

1.93 V

zelená

1.97 V

žlutá

1.98 V

modrá

2.75 V

bílá

2.77 V

Měření \(U_f\) měřičem součástek T3

IMG 20240907 022157

Výpočet omezovacího rezistoru

Napětí v obvodu

LED rezistor1

Podle Kirchhofova zákona je součet napětí na diodě a na odporu roven napětí na GPIO, t.j. 3.3 V. \(U_{GPIO} = U_f + U_R\). Zvolíme si proud diodou a z Ohmova zákona můžeme spočítat omezovací rezistor.

Např. pro zvolený proud \(I=3 mA\) bude omezovací rezistor \(R = \frac{U_R}{I} = \frac{1.37 V}{0.003 A} = 457 \Omega\). Zvolíme nejbližší vyráběný odpor z řady E12 470R, což je \(470 \Omega\). Pro tento odpor spočítáme skutečný proud diodou \(I = \frac{U}{R}= \frac{1.37}{470} = 2.9 mA\), což je malinko vedle od našeho zvoleného proudu, ale nehraje to nijakou roli protože rezistory v řadě E12 se vyrábějí v toleranci 10% (můžeme koupit rezistor, který bude ve skutečnosti od \(446.5 \Omega\) do \(493.5 \Omega\) a skutečný proud diodou bude v rozsahu od \(I=\frac{1.37}{446.5}=3.06 mA\) do \(I=\frac{1.37}{493.5}=2.77 mA\)).

Řízení svítivé diody bipolárním tranzistorem

Často potřebujeme omezit proud, který teče GPIO pinem. Bipolární křemíkový tranzistor je poměrně stará technologie, chová se jako zesilovač proudu, je levný a snadno se používá.

Bipolární tranzistor je třívývodová součástka, má nožičky pojmenované báze, emitor a kolektor. Malým proudem do báze řídíme mnohem větší proud, který teče skrze kolektor do emitoru.

NPN bipolární tranzistor

tranzistor npn1

Pouzdro TO-92 pro nízkovýkonové tranzistory, zde PN2222A (1 — emitor, 2 — báze, 3 — kolektor)

pouzdro TO 92

Zapojení nožiček jiných typů tranzistoru ve stejném pouzdře T0-92 může být jiné, je potřeba se vždy podívat do datového listu příslušného tranzistoru.

Obrázek zobrazuje NPN tranzistor, který se používá velmi často. Musíme doplnit jenom dvě věci.

  1. Napětí báze emitor \(U_{BE}\) je konstantní a přibližně 0.6V nezávisle na tom jak velký proud bází teče.

  2. Proud kolektor emitor je násobkem proudu báze a tento násobek se nazývá zesílení tranzistoru \(I_{ce} = \beta \cdot I_b\). Zesílení se označuje \(\beta\) nebo \(h_{fe}\).

Pokud se podíváte do datového listu tranzistoru, tak uvidíte, že zesílení \(h_{fe}\) bývá v rozsahu 100 až 200. Při proudu báze 1 mA a zesílení tranzistoru 100 bude proud kolektor emitor 100 mA.

Jestliže chceme, aby byl proud kolektor emitor nulový, do báze nesmí téct proud. Zcela jistě to bude, pokud připojíme bázi k zemi, což se stane právě tehdy, když GPIO pin bude ve stavu 0 (low). Naopak, pokud chceme, aby proud kolektor emitor byl maximální, tak GPIO pin musí být ve stavu 1 (high). To je typické pro NPN transistor.

Schéma zapojení můžeme doplnit o rezistory a připojíme svítivou diodu.

tranzistor npn led

Zapojení je jednoduché a potřebujeme jenom dva rezistory omezující proud. Pokud bychom nezapojili rezistor R2, tak proud bází by byl neomezen a je to to samé, jako bychom GPIO pin zapojili na zem. Rezistor R2 omezuje proud báze \(I_b\) v sepnutém stavu na přibližně 0.4 mA, což je velmi málo a pokud bude mít tranzistor zesílení \(h_{fe}\) aspoň 50, tak nám do dává až 20 mA proudu kolektor emitor.

Výpočet velikosti rezistoru R2 se dělá takto: Napětí které potřebujeme srazit na rezistoru je \(U_{R2} = U_{GPIO} - U_{BE} = 3.3V - 0.6V = 2.7 V\). Zvolíme-li si proud do báze \(I_b = 0.4 mA\) potom velikost rezistoru R2 je z Ohmova zákona \(R = \frac{U_{R}}{I_{b}} = \frac{2.7}{0.0004} = 6750 \Omega\). Vybereme nejbližší hodnotu z řady E12 a ta je 6k8.

Bez rezistoru R1 by svítívá dioda rychle shořela. Předpokládejme červenou LED s poklesem napětí \(U_{KA} = 1.93 V\), potom rezistor \(R1 = \frac{3.3V - 1.93V}{0.02A}= 68.5 \Omega\). Výběr rezistoru 68R je na hraně, proto zvolíme nejbližší vyšší hodnotu 82R, klidně můžeme dát 100R, protože při proudu okolo 20 mA bude dioda svítit jako blázen.

Výpočet hodnoty rezistoru R1 předpokládá, že napětí mezi kolektorem a emitorem při sepnutém tranzistoru je 0V, což není úplně pravda. Podíváme-li se do datasheetu tranzistoru P2N2222A a v sekci ON CHARAKTERISTIC (sepnutý stav) najdeme hodnotu Collector-Emitter Saturation Voltage (napětí kolektor emitor v saturaci — sepnutém stavu) a uvidíme, že to je přibližně 0.3V při proudu kolektorem \(I_c = 150 mA\). Takže při našem proudu kolektorem 20 mA to bude odhadem okolo 0.2 V.

Z celého výpočtu je vidět, že se nám nikdy nepodaří výpočet udělat zcela přesně, což však není zas tak důležité, je ale potřeba, abychom se vešli do přijatelných a bezpečných hodnot. Nikdy se nám nesmí stát, že překročíme nějakou maximální hodnotu udávanou výrobcem v datovém listu součástky.

Nikdy se nedimenzuje součástka na 100% (to dělají někteří Čínani a potom elektronika hoří), ale maximálně na 80% povolených hodnot, lépe na 50%. Pokud třeba víme, že svítivá dioda nesnese vyšší proud než 20 mA, budeme počítat tak, aby proud diodou nepřekročil 10 mA (50% maximální hodnoty) a naše zařízení bude fungovat spolehlivě a dlouho. Při výpočtu můžeme klidně uvažovat, že úbytek na svítivé diodě je 1.6V (nemusíme nic měřit) a vždy budeme v bezpečné oblasti, protože rezistorem budeme srážet vetší napětí než je potřeba a tím pádem proud tekoucí diodou bude ve vždy skutečnosti menší.

PNP bipolární tranzistor

tranzistor pnp1

PNP tranzistor pracuje zrcadlově. Napětí 0.6V je mezi bází a kolektorem a proud teče ven z báze. V tomto případě zapneme tranzistor tak, že bázi připojíme k zemi. To znamená že GPIO při sepnutém tranzistoru ve stavu 0 (low). Při vypnutém tranzistoru bude GPIO linka ve stavu 1 (high). Je vidět, že PNP tranzistor vlastně neguje stav GPIO linky.

Toto komplementární chování NPN a PNP bipolárních tranzistorů je užitečné a znamená, že můžeme používat tranzistory v páru.

Schéma zapojení je zjednodušené, chybí zde omezující rezistory produ báze i proudu kolektoru.

Mnemotechnická pomůcka jak si zapamatovat kreslení šipky u NPN a PNP tranzistoru.
NPN šipka ven.

Příklad s bipolárním tranzistorem a relé

Můžete navrhnout něco, co vyžaduje spínání vyššího napětí.

Spínaní vyšších proudů a napětí pomocí relé

gpio rele1

Například spínání 5V DIP relé, které potřebuje spínací proud do cívky 10 mA a spíná mnohem vyšší napětí a proudy. Tranzistor tady nepoutřebujeme ke zvýšení spínacího proudu, 10mA nám klidně sepne GPIO. Tranzistor je zde kvůli tomu, že relé má spínací napětí 5V, potřebujeme změnit 3.3V na 5V. Podobné zapojení bude fungovat i s relé, které má vyšší spínací napětí cívky, třeba 24V. Jenom nesmíme překročit maximální napětí kolektor emitor \(U_{CE}\). (Pro 24V bude tranzistor P2N2222A stačit)

Hodnotu rezistoru R1 spočítáme stejně jako v předchozím zapojení. \(U_{R1} = U_{GPIO} - U_{BE} = 3.3V - 0.6V = 2.7V\). Pokud je spínací proud cívky relé 10 mA a zesílení tranzistoru \(h_{FE}=75\), tak proud báze \(I_b = \frac{I_c}{h_{FE}} = \frac{10 mA}{75} = 0.13 mA\). Velikost rezistoru \(R_1 = \frac{2.7 V}{0.00013 A}=20769 \Omega\). Zvolíme rezistor 15k, proud báze bude sice o něco větší, ale máme zaručeno, že tranzistor spolehlivě sepne i při menším zesílení, než 75. Proud báze při omezovacím rezistoru 15k bude \(I_b = \frac{2.7 V}{15000 \Omega} = 0.18 mA\).

Omezení proudu kolektorem máme vyřešeno tak, že sama cívka relé má odpor okolo \(167 \Omega\), což při 5V napájení znamená, že maximální dosažitelný proud kolektorem je \(I_{cMAX} = \frac{5 V}{167 \Omega} = 30 mA\) a takový proud tranzistor vydrží bezpečně. Podle datového listu P2N2222A je maximální hodnota proudu kolektoru 600 mA.

V tomto zapojení je důležité si všimnou ještě takzvané zhášecí diody antiparalelně zapojené k cívce relé mezi kontakty 2 a 6. Tato dioda normálně nevede proud, katoda je připojena k plusu, ale slouží k potlačení špiček vysokého napětí obrácené polarity, které vzniknou při vypínání relé. Je to přechodový jev, který vzniká při libovolném přerušení proudu, který teče indukčností. Některá relé tuto diodu nemají a je potřeba ji doplnit. Cívka relé bez zhášecí diody spolehlivě odstřelí při vypnutí tranzistor, protože velmi krátká vypínací špička může dosahovat stovek voltů.

Podrobněji se o vypínání indukčnosti dozvíte třeba zde.

Řízení MOSFETem

Mnozí považují MOSFET (Metal Oxide Semiconducor Field Effect Transistor) za perfektní zesilovací zařízení a měli bychom ignorovat bipolární tranzistory. Jsou jednodušší na pochopení funkce, ale bývá někdy složitější najít správný tranzistor, který bude v našem zapojení fungovat.

Schematická značka N-kanálový MOSFET

N channel MOSFET

Stejně jako bipolárná tranzistory mají MOSFET tranzistory tři vývody, které se značí gate (hradlo), drain a source. To je analogické bázi, kolektoru a emitoru u bipolárního tranzistoru, rozdíl je v tom, že napětí na hradlu řídí proud protékající mezi source a drain (české ekvivaletní názvy pro source a drain nejsou).

Gate je v podstatě vstup s vysokou impedancí a teče jím velmi malý proud. To je ideální pro připojení GPIO linky a nějakého zařízení, které vyžaduje větší proud než je schopen GPIO dodat a nebo vyšší napětí. Je li napětí na gate nízké, proud tekoucí přes source a drain je velmi malý. Když napětí na gate dosáhne hodnoty zapínacího napětí \(V_{GS(th)}\) (Gate Threshold Voltage), která je různá u různých MOSFET tranzistorů, proud tekoucí přes source a drain roste exponenciálně. V podstatě je-li na gate 0V nebo hodnota napětí menší než \(V_{GS(th)}\), MOSFET je vypnutý a jakmile napětí na gate překročí hodnotu \(V_{GS(th)}\), tranzistor se začne zapínat. Nepovažujte napětí \(V_{GS(th)}\) na hradlu za napětí, při kterém je MOSFET zapnutý, ale za napětí, pod nímž je vypnutý.

Například u N-MOSFET tranzistoru 2N7000 je rozsah hodnot \(V_{GS(th)}\) udávaný výrobcem od minimálně 0.8V do maximálně 3V, typicky 2.1V.

Problém spočívá v tom že typické napětí na gate kdy je tranzistor plně zapnutý je okolo 10V. Speciální logické MOSFETy potřebují napětí na gate 5V k plnému zapnutí a to dělá Picu s 3.3V logikou problémy. V datovém listu je spíše uváděn parametr \(R_{DS(on)}\), což je rezistance mezi drain a source zapnutého tranzistoru a při tom se uvádí, při jakém napětí \(V_{GS(th)}\) je toho dosaženo. Parametr se jmenuje: Drain-Source On-State Resistance. V digitální technice je to důležitější parametr, než zapínací napětí \(V_{GS(th)}\)

Můžeme vyřešit tento problém dvěma způsoby — budeme ho ignorovat nebo najdeme MOSFET s dost nízkým zapínacím napětím \(V_{GS(th)}\). V praxi se dá MOSFET s nízkým hraničním zapínacím napětím najít těžko a když ho najdete, tak bude jenom pro povrchovou montáž. Při ignorování problému to někdy bude fungovat, pokud budeme tolerovat, že MOSFET není úplně zapnutý. Je-li proud drainem nízký, tak přesože má MOSFET odpor \(R_{DS}\) několik ohmů, ztáty na něm a pokles napětí mohou být přijatelné.

N-MOSFET s nízkým \(V_{GS(th)}\) (min. 0.8V, typ 1.1V, max. 1.5V) je například Nexperia NX138AK v pouzdru TO-236AB (SOT23) nebo VBsemi SI2312CDS-T1-GE3 N-MOSFET, 20V 6A, SOT23 s \(V_{GS(th)} = 0.45V - 1 V\) a \(R_{DS(on)} = 0.042 \Omega\) při \(V_{GS} = 2.5 V a I_D = 4.7 A\), datasheet.

Které MOSFETy jsou vhodné pro připojení zařízení s vyšším ovládácím napětím k GPIO lince se dozvíte později.

Dosud jsme se bavili o N-kanálovém MOSFETU (N-channel MOSFET). P-kanálové MOSFETy fungují stejně, jenom je polarita obrácená. Tranzistor je vypnutý pokud je na gate kladné napětí a zapnutý pokud je gate přizemněn (0V). V tomto ohledu se chovají stejně jako bipolární NPN a PNP tranzistory.

Řízení LED MOSFETem

K řízení LED je lepší použít bipolární tranzistor. Jenom jako příklad, že to jde, můžeme použít zapojení s MOSFETem 2N7000 (nebo 2N7002 a NDS7002A). V datovém listu se tvrdí, že \(V_{GS(on)}\) je typicky 2 V, ale může být minimálně 0.8 V a maximálně 3 V. Protože Pico nám dá na GPIO v sepnutém stavu 3.3 V, tak budeme mít tranzistor taktak zapnutý. Mohli bychom to udělat i tak, že nakoupíme pytlík tranzistorů 2N7000 a změříme je a vybereme tranzistor s nízkým \(V_{GS(on)}\).

Předpokládejme, že máme tranzistor s \(V_{GS(th)} = 2 V\) a proud, který poteče přes svítivou diodu bude 20 mA. Podle datového listu bude při napětí na gate 3V odpor tranzistoru mezi source a drain \(6 \Omega\), takže výkonová ztráta na zaplnutém tranzistoru bude \(P_{on} = U_{DS} \cdot I_D = R_{DS} \cdot I_D \cdot I_D = R_{DS} \cdot I_D^2 = 6*0.02^2 = 0.0024 W = 24 mW\). U řízení LED je to zanedbatelné, protože přes tranzistor teče malinkatý proud. Zkuste si spočítat, co se stane, když bychom takto řídili nějakou větší zátěž, třeba výkonovou LED s proudem 150 mA, tranzistor bude topit. (Ztrátový výkon \(P_{(on)} = 6 \Omega \cdot 0.15^2 = 0.14 W\)) Z toho je vidět, že parametr \(R_{DS(on)}\) je mnohem důležitější, než \(V_{GS(th)}\).

V zásadě pro malé LED bude zapojení fungovat.

mosfet 2n7000 led driver

Výpočet rezistoru R1 omezující prod diodou je analogický jako u zapojení s bipolárním tranzistorem.

Pro proud skrze LED \(I = 20 mA\) a úbytek napětí na LED \(U_f = 1.6 V\) bude rezistor \(R_1 = \frac{3.3 V - 1.6 V}{0.02 A} = \frac{1.7}{0.02} = 85 \Omega\). Vybereme vyšší v řadě 100R.

Poznamenejme, že nepotřebujeme omezovací rezistor mezi GPIO a gate, protože gate má vysokou impedanci a nežere téměř proud. Ale to platí jenom při relativně pomalém spínání. V praxi je dobré zařadit rezistor mezi GPIO a gate, pokud plánujete spínat hodně rychle. Problém spočívá v tom, že gate se chová jako kapacita a rychlé změny napětí na GPIO mohou vytvářet velký proud. Dále poznamenejme, že pravděpodobně nenajdeme tranzistor označený 2N7000, který by nepracoval kvůli vysokému \(V_{GS(on)}\), ale může se to v řídkých případech stát.

MOSFET tranzistor pro logické obvody IRLZ44 má rezistanci \(R_{DS(on) = 0.028 \Omega}\) při napětí 5V ve srovnání s 2N2222 a jeho 6 Ohmy. Je také zaručeno, že \(V_{GS(th)}\) je mezi 1V a 2V. Což jsou lepší parametry pro tento obvod.

Způsob řízení výstupu

GPIO výstup může být nastaven několika způsoby, nejdůležitější jsou pull—​up a pull—​down. Než začněme programovat, vysvětlíme režimy push-pull, pull—​up a pull—​down.

Režim Push—​Pull

V řežimu push—​pull potřebujeme dva tranzistory, jeden NPN a druhý PNP.

push pull

Obvod vlevo se chová jako jeho ekvivalent se spínači vpravo. V každém okamžiku je jenom jeden tranzistor "zapnut". (Je jasné, že spínače SW1 a SW2 nemohou být současně zapnuty, protože by to vedlo ke zkratu.) Je-li vstup na vysoké úrovni, potom T1 je v oblasti saturace (zapnut) a výstup je připojen k zemi (nízká úroveň). Je to stejné, jako když by spínač SW1 byl zapnut a SW2 vypnut.

Naopak, pokud vstup bude na nízké úrovni, potom je v saturaci tranzistor T2 a výstup je připojen na 3.3V. Je to stejné, jako by spínač SW2 byl zapnut a SW1 vypnut.

Toto je standardní konfigurace pro GPIO výstup.

Režim Pull—​Up

V režimu pull—​up je jeden z tranzistorů nahrazen rezistorem. To je ekvivaletní s tím, že máme jenom jeden spínač.

pull up

Když je spínač SW1 sepnut, je výstup je připojen na zem (0V) a tudíž je na nízké úrovni. Když je spínač SW1 rozepnut, je výstup přitažen k 3.3V a tudíž je na vysoké úrovni. Odtud i název pull—​up = táhnout nahoru. Jak můžeme vidět, tak síla přitažení dolů je větší než síla přitažení nahoru, protože proud je omezen rezistorem.

Výhoda tohoto režimu je v tom, že můžeme snadno realizovat logickou funkci AND na sdílené sběrnici. Je-li více GPIO linek připojeno ke stejnému výstupu, potom jestliže jedna linka spadne na 0 tak to znamená, že výstup je stažen také na 0. Jenom v případě, že všechny GPIO linky jsou nahoře, potom rezistory mohou přitáhnout nahoru i výstup. To se používá například u konfigurace sérivých sběrnic, jako je \(I^2C\).

Režim Pull—​Down

Nakonec se podíváme na režim pull—​down, který se nejlepší k řízení všeobecných zátěží: motorů, LED apod. Funguje podobněně jako pull-up režim, s tím rozdílem, že rezistor je použit k tomu, aby linku tahal dolu (k zemi, na 0V).

pull down

Linku přidržuje na vysoké úrovni tranzistor a je stahována dolů pouze rezistorem. Jestliže je libovolný spínač sepnut u více linek, je výstup na vysoké úrovni. Na nízké úrovni je výstup pouze, pokud jsou všechny spínače rozepnuty.

To je OR varianta společné sběrnice.

Nastavení výstupního režimu GPIO

K nastavení režimu GPIO pinu máme k dispozici tři funkce:

gpio_pull_down(uint gpio)
gpio_pull_up(uint gpio)
gpio_set_pulls(uint gpio, bool up, bool down)

Implicitně ja každá GPIO linka konfigurována tak, že je k ní připojen pull—​down rezistor v rozmezí \(50 k\Omega\) až \( 80 k\Omega\). Pull—​up rezistor je podobně v rozmezí od \(50 k\Omega\) do \(80 k\Omega\). Funkce gpio_set_pulls() umožňuje nastavit up i down na true, což má za následek že i pull-up i pull-down rezistory jsou nastaveny. Jestliže chcete čistý režim push—​pull, vypnete rezistory voláním funkce:

gpio_disable_pulls(uint gpio)

Nakonec, pokud chcete zjistit jak jsou nastaveny GPIO linky, zda jsou v režimu pull—​up nebo pull—​down zavolejte funkce:

static bool gpio_is_pulled_up(uint gpio)
static bool gpio_is_pulled_down(uint gpio)

Základní vstupní obvod — spínač

Je čas přesunout naši pozornost na elektrické charakteristiky GPIO linek, které jsou nastaveny jako vstupní. Nejčastější vstupní obvody jsou obyčejné spínače nebo tlačítka.

Mnoho začátečníků dělá chybu a připojuje spínač k GPIO lince takto:

grip input switch

Pokud je spínač sepnut, je všechno v pořádku, GPIO linka je připojena na zem a při čtení dostaneme úroveň 0. Problém je, když je spínač rozepnut. Otázkou je jakou hodnotu na GPIO přečteme. GPIO linka nastavená jako vstup bez pull—​up nebo pull—​down rezistorů má velmi vysokou impedanci. Není-li připojena ke konkrétnímu napětí, tak napětí na ní může být jakékoliv, kvůli externímu rušení. V elektronickém žargonu se to nazývá, že vstup "plave". Při rozepnutém přepínači můžeme na lince přečíst 0 i 1, závisí to na tom, do jakého okamžiku šumu se trefíme.

Správný způsob zapojení vstupu je přitáhnout ho buď k vysoké úrovni 3.3V nebo k zemi (0V), když je spínač rozpojen. Jestliže spínač sepneme, tak poteče rezistorem malý proud okolo 0.3 mA.

Pull—​up bude vypdat takto:

pullup vstup

Hodnota rezistoru R1 není nijak kritická. Jednoduše přitáhne linku k vysoké úrovni (3.3V), pokud je spínač rozpojen. Zdá-li se nám, že proud tekoucí rezistorem R1 příliš velký, můžeme hodnotu rezistoru zvětšit třeba na \(100 k\Omega\), ale musíme k tomu dodat, že čím větší hodnota rezistoru R1, tím více bude vstup chytat různé radiové interference (šum).

Naopak pull—​down zapojení bude mít obrácenou logiku:

pulldown vstup

Jsou prohozeny mezi sebou spínač a rezistor. Je-li nyní spínač zapnut, linka je splehlivě na vysoké úrovni a naopak při rozpojení spínače je přitahována rezistorem k zemi

Dobrá zpráva zní tak, že Pico při impliticní konfiguraci GPIO pinu má nastaven pull—​down rezistor \(50 k\Omega\), takže můžeme připojit přepínač nebo tlačítko jedním koncem k pinu a druhým k 3.3V a bude-li spínač zapnut, vstup přečte hodnotu 1, bude-li vypnut, vstup bude ukazovat 0.

Implicitní pull—​down vstup

interni pulldown vstup

Záchvěvy spínače

Spínač je nejjednoduší zařízení, ale je docela těžké, aby pracoval správně. Když uživatel stiskne tlačítko, není to čisté, tlačítko nebo spínač tzv. poskakuje nebo se chvěje. To znamená, že GPIO jde na 1 pak na 0, pak zase na 1, pak zase na 0 až se hodnota ustálí na 1.

Poskakování spínače

poskakovani switche

Existují elektronické postupy, jak "poskakování" spínače zabránit, ale software udělá práci lépe. Musíme udělat jenom to, že pokud detekujeme sepnutí spínače na 1, uděláme pauzu (třeba 1 ms) a přečteme stav GPIO ještě jednou. Dostaneme-li opět 1, víme, že je spínač zapnut.

Při vypnutí spínače ho opět přečteme dvakrát s malou pauzou mezi čteními.

Sofistikovanější algoritmus je založen na myšlence integrace, abychom se zbavili poskakování. Provedeme několik čtení několik milisekund a budeme udržovat průběžný součet. Řekněme 10 čtení po dvacet milisekund. Pokud bude součet 6 až 10, budeme považovat, že vstup je na vysoké úrovni. Pokud bude součet menší, vstup je na nízké úrovni.

Dělič napětí

Pokud je na vstupu napětí mimo rozsah 0 V až 3.3 V, musíme ho snížit, třeba pomocí odporového děliče.

Dělič napětí s rezistory

delic

\(V_{out} = V \cdot \frac{R2}{R1+R2}\)

Pro převod z 5V na 3.3V můžeme navrhnout třeba takový dělič:

\(3.3 V = 5 V \cdot \frac{R2}{R1+R2}\)

\(\frac{3.3 V}{5 V} = \frac{R2}{R1+R2}\), zvolím R2 = 33k potom R1 bude \(50k - 33k = 17k\), 17k složíme z 16k a 1k a je to.

Nebo ne úplně přesně R2 bude 33k a R1 bude 18k což jsou hodnoty z řady E12.

Nebo můžeme oddělit úroveň pomocí tranzistoru.

Oddělovač vstupní úrovně s MOSFETem

delic mosfet

Oddělovač úrovně s MOSFET tranzistorem je invertující, tzn. pokud je na gate vysoká úroveň 5V, bude GPIO na zemi (nízko). A obráceně. To nepředstavuje velký problém, prostě softwarově znegujeme hodnotu na GPIO a máme původní význam. Rezistor R1 zajištuje to, že MOSFET je zavřen pokud není přítomno 5V a R2 jenom omezuje proud tekoucí přes tranzistor (v našem případě asi 0.3 mA).

Ve většině případů si vystačíte s prostým odporovým děličem, když to nebude chtít fungovat, tak použijete aktivní oddělovač s tranzistorem.

Tyto základy elektroniky jsou zatím dostatečné, abychom mohli vyřešit spoustu problémů. Jakmile bude spínací rychlost hodně vysoká, budeme muset řešit další problémy, které se hlavně týkají toho, aby naše obvody nezpomalovali věci. Spínací elektrotechnika je poměrně složitá záležitost.

Tabulky tranzistorů

Pro pokusy s tranzistory existuje pěkná sada nízkovýkonových tranzistorů v pouzdře TO-92 LaskaKit sada tranzistorů TO-92 300ks za 248 Kč

Tabulka 3. Přehled tranzistorů v pouzdře TO-92 v sadě Laskakit (maximální povolené hodnoty)
označení typ \(V_{CBO}\) \(V_{CEO}\) \(V_{EBO}\) \(I_C\) datasheet poznámka

S9012

PNP epitaxní křemíkový

-40 V

-20 V

-5 V

-500 mA

Fairchild SS9012

komplementární s S9013

S9013

NPN epitaxní křemíkový

40 V

20 V

5 V

500 mA

ON-Semi SS9013

komplementární s S9012

S9014

NPN epitaxní křemíkový

50 V

45 V

5 V

100 mA

ON-Semi SS9014

komplementární s SS9015

S8050

NPN epitaxní křemíkový

40 V

25 V

6 V

1.5 A

Fairchild SS8050

komplementární s SS8550

S8550

PNP epitaxní křemíkový

-40 V

-25 V

-6 V

-1.5 A

Fairchild SS8550

komplementární s SS8050

2N3904

NPN křemíkový

60 V

40 V

6 V

200 mA

onsemi 2N3903

pro všeobecné použití 2N3904 má vyšší zesílení než 2N3903

2N3906

PNP křemíkový

-40 V

-40 V

-5V

200 mA

On-Semi 2N3906

pro všeobecné použití

BC327

PNP epitaxní křemíkový

-45 V

-50 V

-5 V

-800 mA

onsemi BC327

pro spínací účely, komplementární s BC337/BC338

BC337

NPN epitaxní křemíkový

45 V

45 V

5 V

800 mA

Fairchild BC337-BC338

pro spínací účely, komplementární s BC327/BC328

MPA42

NPN křemíkový

300 V

300 V

6 V

500 mA

On-Semi MPSA42

tranzistor pro vyšší napětí

MPA92

PNP křemíkový

-300 V

-300 V

-5 V

500 mA

Fairchild MPSA92

tranzistor pro vyšší napětí

A1015

PNP epitaxní křemíkový

-50 V

-50 V

-5 V

-150 mA

onsemi KSA1015

pro nizkofrekvenční zesilovače, komplementární s KSC1815

C1815

NPN epitaxní křemíkový

60 V

50 V

5 V

150 mA

On-Semi KSC1815

pro nízkofrakvenční zesilovače, koplementární s KSA105

Tl431

napěťová reference

TL431

toto není tranzistor, ale nastavitelná napěťová reference 2.495V

Tabulka 4. Přehled tranzistorů v pouzdře TO-92 v sadě Botland (maximální povolené hodnoty)
označení typ \(V_{CBO}\) \(V_{CEO}\) \(V_{EBO}\) \(I_C\) datasheet poznámka

2N2222

NPN křemíkový

75 V

40 V

6 V

600 mA

On Semi P2N2222A

spínací tranzistor

Tabulka 5. MOSFET tranzistory
označení typ \(V_{DSS}\) \(V_{GSS}\) \(I_{D}\) \(V_{GS(th)}\) \(R_{DS(on)}\) datasheet poznámka

2N7000, 2N7002, NDS7002A

N-kanálový MOSFET

60 V

\(\pm 20 V\)

200 mA, 115 mA, 280 mA

0.8 V, 2.1V, 3V

typ \(1.7 \Omega\) při \(V_{GS}=5V\) a \(I_{D}=50 mA\)

On Semi NDS7002A

TO-92

SI2312CDS-T1-GE3

N-kanálový MOSFET

20 V

\(\pm 12 V\)

6 A

0.45 — 1 V

\(0.028 \Omega\) při \(V_{GS}=4.5V a I_{D}=6A\)

SI2312CDS-T1-GE3

SOT23 LaskaKit

NX138AK

N-kanálový Tench MOSFET

60 V

\(\pm 20 V\)

190 mA

0.8 V, 1.1V, 1.5V

\(5 \Omega\) při \(V_{GS}=2.5V\)

Nexperia NX138AK

SOT23

IRFZ44NPPbF

HEXFET výkonový MOSFET

50 V

\(\pm 20 V\)

49 A

2.0 V — 4.0 V

\(17.5 m\Omega\)

IRFZ44NPbF

TO-220AB

Zdroje a odkazy