sobota 14. ledna 2017

ESP8266, rychlost GPIO a Lua

Občas vám přistane na stole hardware, který komunikuje s okolím dosti osobitě. To vám pak nezbývá nic jiného, než ten osobitý protokol implementovat ručně. A k tomu se hodí znát limity vašeho oblíbeného programovacího nástroje.

Ve svém starším článku (Brutální optimalizace...) jsem zjistil, že řízením GPIO portu procesoru PICAXE M2+ nedokážu vyrobit pulz kratší než 240 µs.

Čeho je schopen ESP8266 a Lua zjišťuji zde...

Měření

Měřil jsem logickým analyzátorem Saleae, stejně jako ve zmíněné Brutální optimalizaci. Zjišťoval jsem dění na GPIO1 spouštěné sestupnou hranou signálu, taktéž na GPIO1.

Zdrojové texty v Lua (bohajehojaxtoskloňuje) uvádím pro jednotlivé testy zvlášť.

Test 1 - gpio.write(...)


Shodíme, nahodíme, shodíme, nahodíme a tak pořád dokola. K tomu nám slouží příkaz gpio.write(...). Z obrázku vidíme, že se dostaneme na 320 µs, což je v porovnání s PICAXE Basicem dost bída.

function Test1()
    gpio.mode(1, gpio.OUTPUT, gpio.PULLUP);

    print("Test 1 start")

    for i=1, 100 do
        gpio.write(1, gpio.LOW)
        gpio.write(1, gpio.HIGH)
    end

    print("end")
end

Z grafu je patrné, že pod 320 µs se nedostaneme.


Test 2 - gpio.serout(...)

Naštěstí je v Lua implementován příkaz gpio.serout(...), kterému předhodíme pole s délkou pulzů udanou v mikrosekundách. Možnosti tohoto příkazu jsou ale bohatší, neváhejte mrknout do dokumentace.

Tady pošleme dva pulzy 20 µs, abychom se v datech analyzátoru lépe vyznali, pak postupně pošleme pulzy dlouhé 1 až 8 µs se střídající se polaritou.

function Test2()
    gpio.mode(1, gpio.OUTPUT, gpio.PULLUP);

    print("Test 2 start")

    gpio.serout(1,0,{20,20,1,2,3,4,5,6,7,8,20,20})

    print("end")
end

Nejkratší pulz je 2.833 µs
V tabulce naměřených hodnot vidíte odchylku oproti požadované hodnotě o velikosti cca 2 µs. Jestli je způsobena nějakou chybou ESP nebo měřením (ale nejspíš obojí) nedokážu posoudit, avšak nejkratší dosažený čas 2.833 µs je pro bastlířovy potřeby dostatečný.

Požadováno
[µs]  
Naměřeno
[µs]
Odchylka
[µs]
12.8331.833
23.9171.917
34.8331.833
46.0002.000
56.7501.750
68.0002.000
78.8331.833
89.9171.917
2021.7501.750

Další informace




Žádné komentáře:

Okomentovat