www.belza.cz - homepage

SW dělič necelým číslem
M/N software divider

Dělič umožňuje měřit vzdálenost válcem (kolem) se snímačem, jehož obvod není podíl 1 metru vyjádřený celým číslem.
Divider to measure distances cylinder (wheel) sensor, whose circumference is not the proportion of 1 meter expressed as an integer.

Popis funkce

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

Popis zapojení

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