PICAXE – jak na krátké pulzy a jejich série

Někdy je potřeba pro připojené zařízení vygenerovat mikrokontrolérem velmi krátký pulz nebo sekvenci pulzů. Jaký způsob zvolit a která cesta vede k opravdu krátkým pulzům, na to se pokusí odpovědět následující článek.

Možnosti jednotlivých řad PICAXE se liší, proto vezmeme jako příklad typy 20M2 a 20X2. Aby se ukázala nejen dostupná délka pulzů, ale také možnosti opakování pulzů respektive doby provádění příslušných instrukcí, byly ve všech případech pulzy generovány jednoduchou nekonečnou smyčkou (DO .. LOOP) a je uvedena délka kladného pulzu a také perioda opakování. Hodnoty jsou uváděny na dvě až tři platná místa, i když kvůli různým kmitočtům vnitřních hodin jednotlivých mikrokontrolérů se mohou lišit a také přesnost měření může mít vliv, nicméně pro základní porovnání není absolutní přesnost důležitá.

První nápad může být jednoduše vložit za sebe do programu instrukce (HIGH B.0   LOW B.0 ). Výsledek samozřejmě není nijak závratný, rozdíl mezi M2 a X2 je především v tom, že PICAXE 20X2 má jako základní frekvenci hodin 8MHz, 20M2 jen 4MHz. Takže to první, co logicky uděláme, je, že zvýšíme kmitočet hodin na dostupné maximum a pokus zopakujeme. Ve všech dalších pokusech už budeme pracovat výhradně s nejvyššími možnými hodinami.

PICAXE 20M2      418μs / 1630μs (4MHz)    52,4μs / 204μs  (32MHz)     
PICAXE 20X2      253μs /  794μs (8MHz)    33,2μs /  97μs  (64MHz)

Nebyl by povel pro generování pulzu (PULSOUT b.0,1 ) lepší?  Byl, a výrazně. Délku 1 ms má při standardní frekvenci hodin, při maximální se příslušně zkrátí. Stojí za to si všimnout změny střídy, pulzy pomocí PULSOUT jsou podstatně užší vzhledem k periodě, která je určena sledem instrukcí.

PICAXE 20M2      5,3μs / 177μs  (32MHz)    
PICAXE 20X2      2,7μs /  78μs  (64MHz)

Dá se udělat něco víc? Samozřejmě, že dá, ale už jen pro PICAXE řady X2 (nebo X1). Ty totiž podporují obsluhu rozhraní SPI, což ve své podstatě není nic jiného, než vysílání obsahu bytu do posuvného registru zařízení, které data přijímá. Nevýhodou je, že když nastavíme vysílání dat po SPI, budeme muset na další pin vysílat hodinový signál, v daném případě osmice pulzů pro každý vysílaný byt. Tento způsob nám tedy obsadí 2 piny, signál bereme z datového, hodin si nevšímáme.

Inicializace SPI není potřeba, jaká data ale vysílat? Pro nejkratší kladné pulzy takové číslo, které má v binárním zápise jednu jedničku a na nejméně významném místě nulu, třeba %00000010 nebo %10000000. Pro záporné pulzy budeme vysílat takové číslo, které má v binárním zápise jedinou nulu a na posledním místě jedničku. Dáme-li dvě jedničky (dvě nuly) vedle sebe,  dostaneme přesně 2x delší pulz, dáme-li tři, třikrát delší atd. Podobně může vytvořit k krátkou sérii (dvojice trojice) pulzů v rámci jednoho bytu, třeba data %10001010 vyšlou jeden pulz, pak delší mezeru a pak dva pulzy blízko u sebe. Na obrázku je tento případ a na dolní stopě ukázané odpovídající hodiny.

hantek417_1

Pulzy získané programovým SPI, nahoře data, dole hodiny

Vraťme se ale ke jednotlivým krátkým pulzům. Vyšleme byte %10000000 povelem SPIOUT B.7,B.0,1,(%10000000). Výsledek je žalostný, horší než příkazem PULSOUT:

PICAXE 20X2      21μs /  1560μs  (64MHz)

Takto jsme si nepomohli, přesto tato cesta vede k cíli. Musíme si uvědomit, že povel SPIOUT je v tomto případě prováděn programově, v podstatě jde o makro, a to dost dlouho trvá. Možná by ještě pomohlo vysvětlit mikrokontroléru, že nemá posílat celých 8 bitů, ale jen 2 bity, to lze povelem SPIOUT B.7,B.0,1,(%10000000/2). Výsledek? Délka pulzů zůstala stejná (což je pochopitelné), opakování se jen mírně zkrátilo na 1410μs, takto to tedy nepůjde, otevřeli jsme ale cestu k jiné věci, automatickému vyslání daného počtu pulzů.

Můžeme využít toho, že hodinových pulzů bude vysláno tolik, kolik bitů požadujeme poslat v parametru, příkaz bere jakékoli jednobytové číslo, takže tímto způsobem snadno vytvoříme série pulzů od 1do 255 bez cyklů nebo počítání programem, to se také může hodit. Kdy? Třeba když potřebujeme vyslat v krátkém sledu (lépe než přes pulsout) sérii pulzů pro modulaci IR LED nebo zvukových pulzů ultrazvuku a měnič je přímo ovládaný výstupem PICAXE.

Na obrázku je jeden dlouhý pulz dat (číslo 0) a k němu 19 pulzů hodin, i to jde, proč ne.

hantek417_2

Hodiny lze použít jako generátor daného počtu pulzů

Řešením co nejkratších pulzů je skutečně  SPI, ale s HW podporou, což PICAXE 20X2 umí také. Nebudeme moci použít libovolné piny mikrokontroléru, výstup dat je pevně na C.1, hodiny na B.7 a vstup dat na B.6, ale jinak je rozdíl obrovský. Přenos se nejprve musí inicializovat:

HSPISETUP 0, SPIFAST

a pak v programu použít:

HSPIOUT (%10000000)

V režimu SPIFAST dosáhneme délky pulzu na jeden bit 0,067μs, to je přibližně 40x méně, než se povedlo předchozími metodami. Na obrázku je nahoře pulz vyvolaný jedním jedničkovým bitem, dole hodiny pro jeden byt. Tyto délky pulzů se už pomalu blíží minimu, které zvládnou běžné univerzální logické integrované obvody.

PICAXE 20X2      0,065μs / 65μs  (64MHz)
hantek417_3

Nejrychlejší výsledek přes SPI – 67 ns na jeden hodinový pulz

Pokud by šlo o to pulzy prodloužit, použijeme opět více jedničkových bitů v čísle za sebou. Režim SPIFAST znamená, že jeden pulz (1 bit) bude trvat 4 takty hodin, v našem případě hodinám 64 MHZ odpovídá asi 15ns, takže 4*15,6=63ns, což zhruba odpovídá naměřené délce. Režim SPIMEDIUM dělí hodiny 16, vytvoří tedy pulzy 4x delší, režim SPISLOW dělí hodiny 64, dělá pulzy 16x delší.

Kombinací počtu bitů, režimu a hodinového kmitočtu docílíme širokého sortimentu délek pulzů, ty nejkratší v délce cca 65ns vytvořené přes vysílání SPI ale výrazně překonávají vše, čeho lze dosáhnout předchozími prostředky.

Lze udělat ještě kratší pulzy a vyšší frekvence? Lze, pokud je nebudeme generovat programově, ale jen nastavíme časovač mikrokontroléru PICAXE 20X2 respektive využijeme výstup hpwm. Program může vypadat nějak takto:

REM PICAXE 20X2
setfreq m64
hpwm 0,0,%1111,1,1
do pause 1000 loop

Poslední dva parametry příkazu hpwm nastavují periodu a střídu respektive šířku pulzu, hodnoty 1,1 jsou ty nejmenší, které lze použít. Na výstupu c.5 (pevně daný výstup hpwm kanál A) se opravdu pulzy objeví a budou mít frekvenci 8,00 MHz (periodu 125 ns) a šířku 18 ns, což je skoro 4x kratší doba, než jsme dokázali přes SPI. Má to ale nevýhodu, při této rychlosti už nestačí výstupy mikrokontroléru a pulzy neudrží standardní úrovně, mají jen něco kolem 1,6 V. Pokud to stačí, lze je použít.

hantek490_2

Pulzy generované HPWM – šířka 18 ns (!), ale jen 1,6 V

Potřebujeme-li standardní úrovně (4 V stačí), musíme zvětšit šířku pulzu na dvojnásobek, dostaneme 8,00 MHz a 35 ns šířku. Program bude vypadat nyní takto:

REM PICAXE 20X2
setfreq m64
hpwm 0,0,%1111,1,2
do pause 1000 loop
hantek490_1

Standardní pulzy generované HPWM – 35 ns / 125 ns

Jde-li nám o krátké pulzy s větší periodou, pak příkazem

hpwm 0,0,%1111,255,2

generujeme pulzy až 35 ns / 16000 ns. Signál generovaný hpwm má tu výhodu (i nevýhodu), že se tvoří nezávisle na běhu programu, je pravidelný neovlivňovaný programem, ale současně se téměř nedá zajistit, aby pulzů byl předem daný počet.