logo_elektromys.eu

/ STM8 GPIO V.|

/ Úvod |

V posledním dílu věnovaném GPIO lehce nahlédneme k mírně pokročilejšímu tématu (z pohledu naprostých začátečníků) a naznačíme si k čemu slouží výstup typu Open-Drain.

/ Open-Drain |

Open-Drain nebo také "otevřený kolektor" je typ výstupu který umí "spínat jen proti GND". Když je v úrovni Low, chová se stejně jako výstup typu Push-Pull - tedy jako (měkký) zdroj "0V". Je schopen odebírat z pinu proud (a třeba rozsvítit LEDku připojenou proti kladnému napětí). Když je v úrovni High chová se jako "vysoká impedance" - nedodává do obvodu žádný proud a chová se stejně jako vstup. Pokud má takový výstup signalizovat naše známé logické úrovně, potřebuje aby k němu byl připojen pull-up rezistor. Nejčastěji se používá v situacích kdy potřebujeme spojit několik výstupů dohromady. To s výstupy typu push-pull, které už známe, nelze. Hrozí totiž zkrat. Nastává když jeden výstup udržuje úroveň High a druhý Low. Výstupy typu Open-Drain se spojovat smí a tvoří takzvaný "wired AND". Tedy kdykoli je alespoň jeden ze spojených výstupů v úrovni Low, je na lince úroveň Low. Pokud jsou všechny spojené výstupy v úrovni High, je na lince úroveň High (když si vzpomenete jak se chová hradlo AND pochopíte proč se tomuto spojení říká "wired AND"). Tento způsob komunikace používají některé sběrnice (jako třeba I2C nebo 1-Wire), ale to je pro nás zatím velmi pokročilá problematika. My si Open-Drain vyzkoušíme v jiném, docela užitečném, zapojení.

Inicializaci pinu jako výstup typu Open-Drain provádíme klasicky pomocí funkce GPIO_Init s argumentem buď GPIO_MODE_OUT_OD_LOW_SLOW (výstup bude po konfiguraci v úrovni Low) a nebo GPIO_MODE_OUT_OD_HIZ_SLOW (výstup bude po konfiguraci v úrovni High). Všimněte si že se v názvech místo úrovní Low a High vyskytují Low a HiZ. To koresponduje s tím co jsme řekli, že výstup typu open-drain v úrovni High se chová jako "Vysoká impedance" (High Z). Přepínání výstupních úrovní děláme jako vždy pomocí funkcí GPIO_WriteLow a GPIO_WriteHigh (případně funkcí GPIO_Write, kterou se budeme zabývat v některém z příštích dílů).

Cv.1 Vytvořte program, který pin PG4 nastaví jako výstup typu Open-drain. Tento výstup připojte vnějším pullup rezistorem (např. 10k) k napětí 3.3V, které máte vyvedeno na vývojovém kitu (viz schema). Nechte program aby při stisku modrého tlačítka (PE4) nastavil na výstup PG4 úroveň High a při uvolnění tlačítka úroveň Low. Připojte mezi výstup PG4 a GND voltmetr a změřte jaká jsou výstupní napětí pro obě úrovně (High i Low).



Opět si vystačíme s jednoduchým programem, který neustále sleduje stav tlačítka a nastavuje podle něj výstup PG4.

#include "stm8s.h"

void main(void){

 GPIO_Init(GPIOG,GPIO_PIN_4,GPIO_MODE_OUT_OD_HIZ_SLOW); // PG4 nastavuji jako výstup typu Open-Drain s výchozí úrovní High (HiZ)
 GPIO_Init(GPIOE,GPIO_PIN_4,GPIO_MODE_IN_FL_NO_IT); // PE4 je vstup z modrého tlačítka na kitu 

 while (1){ 
  // podle stavu tlačítka nastavuji výstup PG4
  if(GPIO_ReadInputPin(GPIOE,GPIO_PIN_4)==RESET){ // pokud je tlačítko stisknuté
   GPIO_WriteHigh(GPIOG,GPIO_PIN_4); // nastavím na výstup úroveň High
  }
  else{ // pokud je tlačítko uvolněné 
   GPIO_WriteLow(GPIOG,GPIO_PIN_4); // nastavím na výstup úroveň Low
  }
 }
}

Pokud jste pracovali správně, měli by jste v úrovni High (při stisknutém tlačítku) naměřit napětí okolo 3.3V a při uvolněném tlačítku (úroveň Low) napětí okolo 0V.

Takto zapojený výstup typu open-drain provádí změnu napěťové úrovně ("level shifting"). Někdy se vám může stát, že budete mít mikrokontrolér napájený 5V a budete chtít "posílat" data do modulu nebo integrovaného obvodu, který používá 3.3V logické úrovně. Přivedením 5V na některý z jeho vstupů by jste obvod mohli zničit a budete tedy potřebovat nějak 5V napětí snížit na 3.3V. Toho lze dosáhnout mnoha způsoby a využití výstupu open-drain s pullup rezistorem je jeden z nejjednodušších.

/ Detaily pro "zvídavé" |

Použití výstupu typu open-drain s pullup rezistorem není bez omezení. Takový výstup je typicky "pomalý". Přesněji řečeno trvá mu delší dobu než přejde z úrovně Low do úrovně High. Přes pullup rezistor se totiž musí nabít parazitní kapacita kabelu, kterým signál vedete. Nabíjení probíhá jako přechodový děj RC článku, takže rychlost závisí na volbě pullup rezistoru. Menší pullup rezistor nabije parazitní kapacity rychleji a výstup je rychlejší, ale zase má větší klidovou spotřebu v úrovni Low (kdy malým pullup rezistorem teče větší proud). Pullup rezistory se v takovém zapojení volí typicky v rozsahu 2-20kOhm, podle aplikace.

/ K zapamatování |

| Odkazy /

Home
| V1.00 29.4.2020 /
| By Michal Dudka (m.dudka@seznam.cz) /