Jdi na obsah Jdi na menu
 


18. 1. 2017

Posouzení jednotky TC420

Jelikož nebylo zapotřebí jednotku vracet, rozhodl jsem se do ní podívat. Po otevření jsem zjistil, že jednotka je řízena pomocí MCU Nuvoton NUC120LE3AN. Na internetu jsem našel informaci, že se jedná o součástku s jádrem ARM Cortex M0. Bohužel, ARM jádra jsou v dnešní době součástí mnoha procesorů. Instrukční sada ARM Cortex M0 není nic převratného.

Předpokládal jsem, že MCU jednotky zastává následující funkce: generace pěti PWM, ovládání displeje, čtení tlačítek, komunikace s PC přes USB a udržování data a času. NUC120LE3AN je v pouzdře LQFP48, které má pouze čtyři kanály PWM. Pro pátý kanál je možno použít timer. Na ovládání displeje je třeba asi 10 pinů a na čtení stavu tlačítek je třeba 4 pinů. Pro udržení času, je možno použít modul RTC (real-time clock). Malý reproduktor mi připadá jako nadbytečnost.

Avšak tvůrce jednotky měl jiný názor. Když jsem jednotku analyzoval, nestačil jsem se divit. První záhada byla, jak se generují PWM. Našel jsem signál pouze čtvrtého kanálu (pin 25), který je generován pomocí PWM 3. Na výstupních pinech PWM 0, 1, 2 žádné PWM signály nebyly. Potom jsem našel signál pátého kanálu PWM (pin 48), který je generován pomocí timeru (TM0). Avšak na MOSFETech bylo všech 5 PWM signálů. Hledal jsem dále a zjistil jsem, že z pinu 9 (TXD1), který funguje jako sériový port s rychlostí 9600 baud, cyklicky posílá 6 bytů do nějakého čipu na desce. Tento čip má svůj vlastní krystal přibližně 11 MHz. Z těch 6 bytů je první vždy nula a pak následuje 5 PWM hodnot, které jednotka posílá čipu. Čip generuje 5 signálů PWM. Jinými slovy, místo toho, aby autor použil periferie NUC120LE3AN pro generaci 5 PWM, posílá přes sériovou komunikaci 5 bytů s hodnotou PWM jinému čipu, které generuje PWM.

tc420---pwm.png

Hodnoty jsou posílány do druhého čipu následně: 0 % koresponduje s 0, 100 % se posílá jako 250. Při této hodnotě můžeme na výstupu naměřit PWM asi 98 %. Takže 100 % není 100 %. Proč? Čip generující PWM je pravděpodobně naprogramován, aby generoval PWM 100 % při hodnotě 255 (max. hodnota 8bitového čísla). Důkaz: 250 / 255 x 100 = 98. Otázka je: Proč autor nepoužil 255 jako maximum? Pravděpodobně pouze použil hodnotu z tabulky, 1krát shift doleva a k tomu přičetl hodnotu z tabulky odshiftovanou jednou doprava. Tzn. vynásobil 2,5krát. V jazyku C by ten řádek vypadal následně:

u8PWM = (u8TableValue << 1) + (u8TableValue >> 1);

kde u8PWM je výsledná hodnota PWM (0 – 250, typu uint8_t) a u8TableValue je vstupní hodnota z tabulky (0 – 100, typu uint8_t).

Přitom by stačilo použít násobení 2,55krát způsobem, že číslo 2,55 se posune do horních 8 bitů uvnitř 16bitové proměnné. Vypadalo by to následně:

u8PWM = (uint8_t)(((uint16_t)u8TableValue * (uint16_t)655) >> 8);

Konstanta 655 vychází z maximálního 16bitového čísla (65535) poděleného 100 (maximum PWM). Jednoduše si to můžeme ověřit pro hodnotu 100: 100 x 655 = 65500. Toto číslo se posune 8krát doprava, tzn. děleno 256 (neboli 28): 65500 / 256 = 255. Je fakt, že dva shifty a sčítání je na některých procesorech mnohem rychlejší než násobení, ale to není případ Cortex M0. Zvláště pokud se PWM aktualizuje max. jednou za minutu. Cortex M0 použije pro násobní jednu instrukci MULS a pro shift ASRS. Kdežto v prvním případě budou dvě instrukce pro shift ASRS a jedna pro součet ADDS.

Nicméně, při současném řešení (za použití 8 bitů pro hodnotu PWM) by bylo možno dosáhnout rozlišení 0,5 %, nikoliv 1 %. Ale k tomu by bylo třeba upravit trochu aplikaci na straně PC.

Kdyby autor využil periferií NUC120LE3AN: PWM nebo timer, mohl by dosáhnout mnohem vyššího rozlišení PWM. K tomu je třeba znalosti frakční aritmetiky: PWM frekvence jednotky TC420 je 540 Hz. Pokud je vstupní frekvenci periferie 22,1184 MHz (jak uvádí NUC100/120 Technical Reference Manual), výsledná perioda PWM bude 22118400 / 540 = 40960 inkrementů. Periferie má 16bitový čítač, tzn. počítá do 65535. Tudíž, výsledná perioda je dosažitelná. Pokud podělíme základ 100 % touto periodou, dostaneme rozlišení PWM v procentech, tzn. 100 % / 40960 = 0,0024 %. Řekl bych, že je to hodně daleko od rozlišení 1 %, není?

Další věc, co mě překvapila, je existence součástky Maxim DS1302Z. Má za úkol udržet datum a čas. Jak jsem uvedl výše, NUC120LE3AN má modul RTC, který je pro datum a čas možno využít. Je možné také MCU uspat, aby se snížila spotřeba, a probudit jej pomocí RTC na okamžik, provést operaci a znovu uspat. Proč asi autor použil DS1302Z, které vyžaduje sériovou komunikaci s NUC120LE3AN? Navíc potřebuje další krystal.

 

tc420---deska.jpg

Změřil jsem komunikaci mezi MCU a DS1302Z. Musím se přiznat, že jsem nemohl uvěřit tomu, co jsem viděl. Autor chtěl nejspíš použít periferii I2C, protože MCU využívá právě piny periferie I2C pro komunikaci s DS1302Z. Jenže komunikace, kterou DS1302Z používá, jen I2C připomíná. Ve skutečnosti to I2C není. Autor mohl použít periferii SPI s vykrácenými piny MOSI (master out, slave in) a MISO (master in, slave out) . V případě čtení z DS1302Z by se pin MOSI přepnul do stavu vysoké impedance po odeslání 8 bitů (komand), aby pin MISO mohl přečíst informaci.

Autor však zvolit softwarové ovládání pinů pro clock a data ovládáním pinů přes GPIO (general purpose input output). Na obrázku je možné vidět vyšší frekvenci clock signálu a nějaké kolísání během prvních 8 bitů. V tomto místě šlo o komand 0x81 – přečtení sekund. Následuje úplně jiná frekvence clocku s kolísáním. V tomto okamžiku DS1302Z odpovídá a posílá sekundy v BCD soustavě. Autor nebyl schopen ani vytvořit smyčku s konstantní periodou pro tak primitivní komunikaci.

tc420---ds1302z.png

Výstupy PWM jsou připojeny na MOSFETy v pouzdru DPAK. Neviděl jsem na nich žádné filtry. Takže LED pásky mohou rušit. To jsem však netestoval. USB používá třídu HID (human interface device) pro komunikaci s PC, proto není nutno instalovat ovladač do Windows. HID je základní třída, která již v systému Windows existuje. Toto nejspíš okopíroval z nějakého příkladu použití USB HID device.

Jednotka by mohla být menší, levnější, s nižší spotřebou, a hlavně rozlišení PWM by bylo mnohonásobně větší. Jinými slovy, pokud by se rozlišení PWM rozšířilo, přechody mezi intensitami LED by byly mnohem jemnější. Pro vylepší jednotky by nestačilo pouhé přeprogramování, znamenalo by to i změny na desce. Myslím, že by autor měl zvážit spíše kariéru v politice.

 

Komentáře

Přidat komentář

Přehled komentářů

Re: Re: Re: Výroba lepšího?

Jarek, 2. 6. 2018 20:40

Ujíždění času bude nejspíš způsobeno nepřesným krystalem u obvodu, který drží čas. Je to made in China! Mně také ujíždí, ale je to kolem minuty za měsíc. Oprava je jednoduchá, stačí vyletovat krystal a koupit tam druhý.
Co se týče výroby jednotky, Tento týden mi došla vývojová deska s procesorem, tak ji zkouším rozjíždět. Nejedná se o napsání softwaru jen pro řízení LED, je tam těch problémů k řešení více a také je nutno vytvořit nějakou aplikaci do Windows, ze které se to bude programovat. Až mi vše pojede na vývojové desce, tak bude třeba navrhnout desku a osadit a vyzkoušet. To je oproti softwaru časově náročnější a nákladnější, protože při chybě se musí předesignovat deska a nechat znovu vyrobit.

Podobný programátor

Poly, 22. 2. 2018 23:34

Dobrý den,
super článek. Bohužel ale podobný přístroj na trhu neexistuje