Před časem jsem byl požádán vyrobit zařízení, které bude měřit pohyb pásu. Na stroji byl válec o průměru v řádu centimetrů, následně připojené zařízení však bylo typu „prostý čítač“ a neumělo přepočítat impulsy z válců různých průměrů. Např. válec o průměru 6 cm má obvod přibližně 188,5 mm a při pohybu pásu o 1 m pošle snímač otáček 5 nebo 6 impulsů. Po 53 otáčkách válce urazí pás 9,99 m, což je 10 m, v daném případě s již akceptovatelnou chybou 0,1 %. Podobným způsobem lze přepočítat průměr kola a měřit ujetou vzdálenost. Proto vzniklo dále popsané zařízení (interface), které v uvedeném příkladu z 53 vstupních impulsů vyrobí na výstupu impulsů 10, rovnoměrně rozložených během sledovaného intervalu, takže dělicí poměr je 5,3. Dělit lze počet vstupních impulsů v poměru M/N, kde M je celé číslo v rozsahu 2 až 255 a N celé číslo v intervalu 1 až 127, přičemž M musí být nejméně 2x větší než N. Pro jakýkoli dělicí poměr v rozsahu 2 až 255 se dá najít takové M a N, že chyba dělení je jen zlomek procenta.
Obr. 1. Zapojení děliče impulsů s obvody pro připojení
snímače polohy
Fig. 1. Software divider circuit
Zapojení děliče je na obr. 1. Vlastní dělič je jen naprogramovaný mikrokontrolér IC1, taktovaný vnitřním RC oscilátorem 4 MHz a k dělení už nepotřebuje žádné další součástky. K čemu jsou tedy další součástky v zapojení? Ke konektoru K1 lze připojit indukční snímač, napájený napětím 24 V z nezávislého zdroje. Snímač lze nahradit kontaktem jazýčkového relé, zapojeným mezi svorky 1 a 2 svorkovnice K1. Na válci umístěný magnet pak sepne kontakt při každé otáčce. U indukčního spínače je místo magnetu použit kovový výstupek (šroub) na válci. Snímač otáček je od dalších obvodů galvanicky oddělen optočlenem, což je důležité zejména v průmyslovém prostředí s velkým rušením. Ukázalo se, že některé indukční snímače polohy mají oblast nestability, zastaví-li se válec v poloze rozhodovací úrovně čidla. Na výstupu čidla se pak objeví sled impulsů s poměrně vysokým kmitočtem, který pak zcela „rozhodí“ počítání celkové délky pásu. K potlačení tohoto jevu slouží filtr s R4, R5, D1 a C2. Rozkmitá-li se čidlo, obvod zajistí rychlé vybití a pomalé nabíjení kondenzátoru C2. Na kondenzátoru zůstane malé napětí a impulsy z čidla do děliče impulsů neprojdou. Kapacitu kondenzátoru C2 je nutné zvolit tak, aby se kondenzátor stihl nabít, než přijde další impuls i při maximální rychlosti válce. Rovněž odpor rezistoru R2 je vhodné zvolit tak, aby byla s rezervou zajištěna funkce optočlenu, ale přitom byl proud LED co nejmenší. Zbytečně velký proud LED zvyšuje pravděpodobnost poruchy optočlenu. Konektor JP1 slouží pro připojení externího programátoru při úpravě programu.
Program mikrokontroléru je napsán v asembleru, a je
poměrně krátký. Sestupná hrana impulsu na GP2 vyvolá
přerušení, ve kterém se podle výsledku výpočtu buď
změní, nebo nezmění stav vývodu GP4. V hlavní smyčce
programu nedělá kromě počáteční inicializace
mikrokontrolér nic. Nabízí se proto možnost rozšířit
program a využít ho pro další úkoly. K dispozici jsou 4
volné I/O piny a asi 80 % volné programové paměti. Do
programu je nutné zadat požadované konstanty dělení M a N.
To můžeme udělat dvěma způsoby:
1. Ve zdrojovém kódu najdeme skoro na konci řádky:
org 0x3f0
retlw .10 ; počet vstupních impulsů - M
retlw .3 ; počet výstupních impulsů - N
a vepíšeme požadovaná čísla. Program pak přeložíme ve
vývojovém prostředí (MPLAB IDE).
2. Druhou možností je použít již přeložený
hexadecimální soubor. Před vypálením programu do
mikrokontroléru najdeme v okně ovládacího programu
programátoru na adrese 3F0h a 3F1h instrukce RETLW,
reprezentované kódem „34xx“, kde xx je číslo
v hexadecimálním tvaru, které instrukce vrací. Konstanty M a
N tedy převedeme na hexadecimální čísla, která pak
zapíšeme do okna ovládacího programu, viz obr. 2.
Obr. 2. Nastavení konstant dělení v ovládacím programu
programátoru – zde je nastavena konstanta M = 10 (0Ah) a N = 3
(03h)
Fig. 2. Setting the constants M and N in
programmer
Obr. 3. Oscilogram při dělení 10/3
Fig. 3. 10/3 division on the oscilloscope
Popisovaný dělič byl ověřen na několika strojích s různým průměrem válců. Kmitočet vstupních impulsů byl maximálně desítky až stovky Hz. Dělič je však schopen pracovat až do kmitočtů v řádu jednotek kHz. Maximální kmitočet závisí i na konstantách M a N, protože doba výpočtu dělení je na nich závislá. Zdrojový kód programu děliče impulsů a přeložený hex soubor pro programátor si můžete stáhnout ZDE nebo na webu časopisu Praktická elektronika (www.aradio.cz).
Obr. 4. Deska nabíječky
Fig. 4. Charger PCB
Motiv
desky v souboru PDF / PCB layout in PDF file here
Obr. 5. Rozmístění součástek
Fig. 5. Components on PCB
Jaroslav Belza
Článek byl otištěn v časopise "Praktická
elektronika" 12/2015 na s. 24
This article was printes in magazine "Praktická
elektronika" 12/2015, page 24
Karel Beránek mi napsal:
Mám jen drobnou připomínku k tomu algoritmu. Pro převod
impulsů koeficientem N/M lzde použít Brensehamův algoritmus.
Ten se v počítačové grafice používá ke kreslení úseček
s danou směrnicí. Což v zásadě znamená, že při posunu o
jeden bod jedním směrem (např. doprava) rozhoduje, zda se
posune i druhým směrem (např. nahoru). Směrnice je dána jako
poměr N/M, kde M je >= N. Váš převod pulsů není ničím
jiným, také se jen rozhodujete, zda na příchozí puls
reagujete odesláním pulsu nebo ještě ne.
Samotný algoritmus je:
začátek:
A = 0
příchod pulsu:
A = A + N
if A >= M then
generuj puls
A = A - M
end if
konec:
Jak vidíte, vystačíte si s +, - a porovnáním. Není nutno dělit.
Je to rychlejší a není to závislé na konkrétních
hodnotách M a N. Také se tak dá dosáhnout poměr blízký 1,
například 9/10 (9 odchozích na 10 příchozích).
A pokud místo IF bude WHILE, tak to bude fungovat i pro zvyšování
počtu pulsů, například 10 odchozích na 9 příchozích:
začátek:
A = 0
příchod pulsu:
A = A + N
while A >= M then
generuj puls
A = A - M
end while
konec:
13. 10. 2016
upd. 23. 11. 2016