Pokračujeme ve studiu FPGA a jazyka VHDL. V tomto článku, zaměřeném na začátečníky, budeme studovat fenomén „kontaktního odrazu“ a zvážíme způsob, jak se ho zbavit.

Účel práce: Chcete-li studovat fenomén „odrazu kontaktu“, vytvořte projekt v Xilinx ISE Project Navigator: Když stisknete tlačítko, hodnota registru se zvýší o 1.

Část 1. Co je to „odskočení kontaktu“?

“Odskakování je jev, který se vyskytuje u elektrických a elektronických spínačů, ve kterých namísto nějakého stabilního signálu produkují na výstupu náhodné vysokofrekvenční oscilace.” (c) Wikipedie.
Jednoduše řečeno, když stisknete a uvolníte tlačítko, nepřejde okamžitě do požadovaného stavu. Po nějakou dobu mezi sebou kontakty tlačítka „chrastí“, což bude mikrokontrolér vnímat jako vícenásobné impulsy. Počet těchto impulsů může přesáhnout tisíce. Odskok lze jasně vidět na oscilogramu, který ukazuje okamžik uvolnění tlačítka:

Část 2. Vytvoření projektu.

Můj předchozí článek podrobně popsal, jak vytvořit nový projekt pro Spartan-3E Starter Kit v Xilinx ISE Project Navigator v12.3. Vytvořme projekt znovu, nazvěme jej například drebezg_habr a proveďte v něm nějaké změny:

1. Potřebujeme jedno tlačítko a osm LED diod. Přidejme k portům vstupní signál btn a 8 výstupních signálů LED:

entita drebezg_habr je
Port(clk:in STD_LOGIC;
btn: v STD_LOGIC;
led: out STD_LOGIC_VECTOR(7 až 0));
konec drebezg_habr;

NET „clk“ LOC = „C9“ ;
NET “led” LOC = “F12” ;
NET “led” LOC = “E12” ;
NET “led” LOC = “E11” ;
NET “led” LOC = “F11” ;
NET “led” LOC = “C11” ;
NET “led” LOC = “D11” ;
NET “led” LOC = “E9” ;
NET “led” LOC = “F9” ;
NET „btn“ LOC = „K17“ ;
NET “btn” PULLUP ;

Noha K17 odpovídá spodnímu dostupnému tlačítku:

Slovo PULLUP spojuje tlačítko podle následujícího obvodu (přímo uvnitř FPGA):

Část 3. Programování.

Přejděte do souboru drebezg_habr.vhd. Vytvořme 8bitový registr čítače, který se pokusíme přidat po jednom při jednom stisknutí tlačítka: mezi architekturu a začátek zapíšeme

Nyní je naším úkolem přidat jedničku do počítadla count_led po stisknutí tlačítka. Rozhodnutí se okamžitě navrhne vytvořit proměnnou, která by uložila předchozí stav tlačítka a porovnala jej s jeho aktuálním stavem. Pojďme to udělat:

architektura Chování drebezg_habr je

signal count_led: std_logic_vector(7 downto 0);
signal old_btn : std_logic ;

READ
Jak odlišit čínský klid od originálu?

proces (clk)
začít
if rise_edge ( clk ) then
old_btn, pokud old_btn = ‘ 0 ‘ a btn = ‘ 1 ‘, pak
count_led end if ;
konec if ;
ukončit proces;

Vysíláme, šijeme, testujeme. Jsem si jistý, že výsledek vám nebude vůbec vyhovovat, protože diody budou prostě blikat zcela náhodně. To je způsobeno tím, že při stisknutí a uvolnění tlačítka dochází k mnoha událostem if old_btn = ‘0’ a btn = ‘1’, právě kvůli odskoku kontaktu. Abychom se tohoto jevu zbavili, musíme počkat na jasně stanovenou hodnotu logické jednotky. K tomu vytvoříme počítadlo, které se zvýší o 1, zatímco tlačítko má logickou hodnotu jedna. Čítač se vynuluje, pokud tlačítko nabývá hodnoty logické nuly. Bez ohledu na to, kolik impulzů je při stisknutí tlačítka kvůli odskoku, přijde okamžik, kdy je hodnota btn jasně nastavena na logickou jedničku, čítač dosáhne určité hodnoty a můžeme soudit, že tlačítko bylo skutečně lisované. Nyní nepotřebujeme proměnnou old_btn.

architektura Chování drebezg_habr je

signal count_led: std_logic_vector(7 downto 0);
konstanta clk_freq : integer := 50 _000_000 ; – křemenná frekvence
konstanta btn_wait : integer := clk_freq/ 4 ; — počkáme 0.25 sekundy, než se jednotka nastaví
počet signálů : rozsah celého čísla 0 až btn_wait := 0 ;

proces (clk)
začít
if rise_edge ( clk ) then
jestliže btn = ‘ 1 ‘ pak
count if count = btn_wait then
count_led count end if ;
jiný
počítat konec if ;
konec if ;
ukončit proces;

Hodnota btn_wait byla zvolena na 0.25 sekundy, aby se zajistilo, že se hodnota count_led nebude příliš často zvyšovat, když je tlačítko stisknuto.
Další možností proti bounce (ještě spolehlivější) je sčítání počtu o 1, když je btn logická jednotka, a odečítání 1 od počtu, když je btn nula. Navíc, pokud hodnota načítání klesne na 0, znamená to, že tlačítko nebylo stisknuto nebo došlo k chvění. No, pokud počet dosáhl ceněného btn_wait, pak došlo ke kliknutí =)
Jako domácí úkol vám mohu poradit dokončit projekt: po stisknutí a uvolnění tlačítka přidejte count_led.

Seznámili jsme se tedy s fenoménem „contact bounce“ v praxi a naučili jsme se, jak se ho zbavit. Tento jev lze pozorovat nejen u tlačítek, přepínačů a dalších podobných věcí, ale dokonce někdy i v různých protokolech, například RS-232.
Zdroje projektu jsou zde. Přeji vám všem úspěch při zvládnutí FPGA!

READ
Jak správně používat Poxipol?

Navzdory širokému přijetí polovodičových spínačů se mechanické spínače stále používají v řadě aplikací. Bez ohledu na to, jak se jejich technologie zlepšuje, odskoky kontaktu nelze eliminovat. Tento článek se zabývá způsoby, jak tyto problémy minimalizovat pomocí externích součástí.

Würth Elektronik nabízí široký sortiment mechanických spínačů (viz obr. 1). Tyto produkty se používají v mnoha aplikacích k otevírání a zavírání elektronických obvodů.

Rýže. 1. Část sortimentu mechanických spínačů WE

Spínací funkce je primárně mechanická, ale mnoho spínačů funguje jako analogově-digitální rozhraní v moderních elektronických obvodech s jasně definovanými úrovněmi napětí pro logickou nulu a logickou jedničku. Každý vývojář aplikace, která používá tlačítka taktu nebo detektoru s rychlými elektronickými obvody, se může divit, proč nefunguje správně. Důvodem může být tzv. odskok (vibrace) kontaktů. Tento článek popisuje schéma řešení tohoto běžného problému.

Odskok kontaktu

Spínací mechanismus

Obecně je kontakt ve spínači považován za spolehlivý a funguje okamžitě (viz obrázek 2).

Rýže. 2. Idealizovaný graf spínacího signálu

V praxi je však vše poněkud jinak (viz obr. 3). V každé poloze spínače je kontakt mezi sekcemi s proudem navázán nebo přerušen pomocí pohyblivých mechanických prvků (viz obr. 4).

Rýže. 3. Idealizovaný graf „skutečného“ spínaného signálu

Rýže. 4. Konstrukce taktového spínače

Typicky se pružinové komponenty používají jako prostředek pro přenos kontaktu z jednoho stavu do druhého, a to buď ve formě kovové desky nebo vinuté pružiny, která má určitou hmotnost a tedy moment setrvačnosti. Ve chvíli, kdy se tyto malé součástky uvedou do pohybu, zrychlí se do požadované polohy. Po spuštění dochází po určitou dobu k vícenásobnému nekontrolovanému sepnutí a rozepnutí kontaktů v důsledku pružnosti pružiny a částí kontaktního systému; v tomto případě se elektrický obvod otevírá a zavírá, dokud se pohyb zcela nezastaví.

Stůl. Spínací a anti-bounce komponenty

Komponenty Doba odskoku
Taktový spínač 10 ms
tlačítkový spínač
Detektor
Mechanický kodér

Protože koeficient tlumení je velký a moment setrvačnosti malý, doba trvání tohoto efektu je obvykle jen několik mikrosekund. Netrpí jím výkonové obvody, což se o digitálním vstupu říci nedá. při změně stavu má elektronický signál nestabilní nebo přesněji nejistý stav, zatímco logický IC vyžaduje jasný signál určité úrovně. Mikrokontrolér může zmeškat změněný stav portu, pokud čte data v nesprávnou dobu. Je tedy nutné zajistit, aby byl spínací výstup generován jasně. Pro vyřešení tohoto problému se podíváme na obvod, který vám umožní eliminovat jeho chrastění.

READ
Jak správně nainstalovat vstupní dveře pro požární bezpečnost?

Použité komponenty

Doba proti odskoku je uvedena v technickém listu produktu. Würth Elektronik definuje tento parametr jako dobu mezi mechanickým sepnutím součásti a úplným elektrickým sepnutím. V tabulce jsou uvedeny komponenty používané pro přepínání a odskok.

Obvod pro odstranění debounce

Přidáme některé komponenty pro vytvoření dolní propusti (LPF) pro vyhodnocení jeho vlivu na výstupní signál.

Přidání filtru

Obvod základního spínače bez kompenzace odskoku je znázorněn na obrázku 5. Typické hodnoty odporu R: G 10 kOhm; PROTICC = 5 V.

Rýže. 5. Spínací obvod bez ochrany proti odskoku

Po stisknutí spínače se objeví signál, který umožňuje sledovat účinek odskoku kontaktu (viz obr. 6).

Rýže. 6. Výstupní signál v nepřítomnosti obvodu proti odskoku při přechodu z vysoké na nízkou úroveň

Pro eliminaci odskoků výstupního signálu je navržen jeden z nejlevnějších a nejsnáze realizovatelných elektronických obvodů, který využívá RC filtr (viz obr. 7). Když je spínač otevřený, kondenzátor se nabíjí přes obvod R1 + R2, který zpomaluje nárůst napětí. Když je spínač sepnutý, kondenzátor se vybíjí přes R2 řízenou rychlostí.

Rýže. 7. Spínač se základním obvodem proti odskoku

Pokud byly komponenty vybrány správně, vibrace spínače jsou během nabíjení nebo vybíjení absorbovány, což má za následek hladký přechod z jednoho stavu do druhého. Pro výpočet hodnoty kondenzátoru a rezistorů se používá vzorec (1), který umožňuje určit časovou konstantu obvodu:

kde T je časová konstanta, s; R – hodnota odporu, Ohm; C – hodnota kapacity, F.

Časová konstanta je zvolena jako kompromisní hodnota pro eliminaci odskoků spínače a zajištění požadované doby odezvy obvodu. V jedné časové konstantě napětí stoupne na 63 % své konečné hodnoty nebo klesne na 37 % této hodnoty. V obou případech stoupá nebo klesá o 99 % po pěti časových konstantách.

Příklad výpočtu

– doba odrazu ve specifikacích: 10 ms;

– typická hodnota odporu R1 pro omezení proudu: 1 kOhm;

– R2: jsou vybrány dvě standardní hodnoty pro eliminaci odrazu: 10 a 47 com;

– napájecí napětí: 5 V DC.

Výpočet tedy dává dvě hodnoty kapacity:

Pro toto schéma jsou nabízeny dva rozsahy hodnot:

READ
Jak se jmenuje otoman na chodbě?

– řešení 1: R1 = 1 kOhm; R2 = 10 kOhm; S1 = 1 uF;

– řešení 2: R1 = 1 kOhm; R2 = 47 kOhm; S1 = 220 nF.

Všimněte si, že hodnoty odporu a kapacity se mohou lišit v závislosti na konstrukci obvodu zákazníka.

Pro obě schémata získáme charakteristiku znázorněnou na obrázku 8.

Rýže. 8. Výstupní signál při použití odskokového obvodu a přechodu z nízké na vysokou úroveň

Hodnota UOUT v závislosti na čase se určuje podle následujícího vzorce:

Z ní plyne, že při t = t je hodnota výstupního napětí UOUT je asi 63 % příkonu UIN. V našem příkladu hodnota UOUT = 63 % (3,15 V) jeho konečné hodnoty (5,0 V) po 10 ms.

Přidání diody

Pro samostatné řízení doby nabíjení a vybíjení je do výše uvedeného obvodu přidána dioda (viz obr. 9). V důsledku toho se zkracuje spínací doba pro nabíjení kondenzátoru R1 a D.1a doba vybíjení se změní, když se použije pouze R2, protože v tomto případě je dioda zablokována.

Rýže. 9. Přidání diody do obvodu

Přidání vyrovnávací paměti

Jak víte, nula v digitální logice je určena úrovní pod určitým napětím (například 0,8 V) a jednička je určena úrovní vyšší (například 2,5 V). Významy mezi nimi nejsou definovány. Pokud aplikace není schopna podporovat nedefinované hodnoty, může být vyžadován Schmidtův spouštěcí buffer s hysterezí. Obvod s různými časy zapnutí a vypnutí a přídavnou hysterezí je znázorněn na obrázku 10. Doba odezvy obvodu může být přizpůsobena době vzorkování mikrokontroléru.

Rýže. 10. Schmidt spoušť poskytuje stabilní a definované hodnoty napětí

Přechodná ochrana

Pokud je spínač umístěn daleko nebo na konci dlouhého vodiče, bude pravděpodobně vyžadována ochrana proti přepětí, ESD nebo jiným přechodovým jevům. Jako ochranné prvky se používá feritová kulička a TVS dioda instalovaná před vstupním obvodem (viz obr. 11).

Rýže. 11. Přidání feritové kuličky a TVS diody pro přepěťovou ochranu

Při použití mechanických signálních spínačů dochází k odrazovému efektu, který se vyznačuje krátkými periodami nestabilního signálu v elektronickém obvodu. Doba odskoku spínačů Würth Elektronik dosahuje 10 ms, což je nutné vzít v úvahu při návrhu. Navržený RC filtr nám umožňuje tento jev omezit. Filtr lze upgradovat instalací dalších komponent pro přesnější úpravu signálu a přepěťovou ochranu.