Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2017:hart-sensor

WirelessHART sensor mote

Semestrální projekt do předmětu MPOA - Tomáš Řežucha.

Kompletní zdrojové kódy pro Keil uVision5 jsou ke stažení zde.
Device Family Package pro ADuCM4050 lze stáhnout zde.


Zadání

Navrhněte WirelessHART sensor mote a naprogramujte MCU Analog Devices ADuCM4050 na zpracovávaní vybraných HART příkazů z klasického HART FSK modemu a také pro komunikaci s bezdrátovým modulem založeném na SoC LTC5800.
Aplikace musí být schopna přeposílat HART zprávy mezi drátovým a bezdrátovým rozhraním a správně na ně odpovídat.

Úvod

WirelessHART je bezdrátová nadstavba průmyslového standardu HART, který je v současnosti nejrozšířenější standard pro senzory a aktuátory.

WirelessHART je senzorová síť typu mesh pracujíci v pásmu ISM 2,4GHz podle dopručení IEEE802.15.4; vyznačuje se vysokou latencí, nízkou rychlostí ale naopak vyniká svojí robustností a nízou energetickou náročností.

V tomto projektu je kladen důraz na firmware aplikačního MCU, který řídí celý senzorový přístupový bod. Blokové schema takovéhoto obvodu je na obrázku 1.


Obrázek 1: Blokové schema navrženého obvodu

Řešení

ADuCM4050 je mikrokontrolér založený na jádře ARM Cortex-M4F a je zaměřen na aplikace s extémně nízkou spotřebou. Z široké nabídky použitých perferií jsou použity tyto:

Použité periferie mikrokontroléru ADuCM4050:

Periferie Použití
UART1 Komunikace s HART modemem AD5700-1
UART2 Komunikace s rádiovým module LTP5901-WHM
I2C Komunikace s Coulomb počítadlem LTC3335 (v budoucnu)
2x SPI Připojení externích senzorů nebo ADC
Flexi RTC SensorStrobe - sběr dat z ADXL363
RTC Scheduler
FPU Operace s plovoucí desetinnou čárkou

K vybraném mikrokontroléru výrobce dodává sadu ovladačů ve formě Device Family Package pro Keil lze stáhnout zde.
Zdrojové kódy v adresáři ADI jsou upravené verze těchto ovladačů (periferie RTC a akceleromter ADXL363) aby lépe vyhovovali požadavkům této aplikace.
Nejsem autorem zdrojových kódů v adresáři ADI.

Analog Devices AD5700-1

AD5700-1 je jednoduchý FSK modulátor a demodulátor splňujíci specifikace HART pro drátové FSK rozhraní. Připojuje se k MCU ADuCM4050 pomocí UART s baudrate 1200 Baud. Kontrola toku se využíva pro přepínáním mezi modulátorem a demodulátorm - HART je poloduplexní protokol.

Linear Technology LPT5901-WHM

O rádiový přístup do sítě WirelessHART se na fyzické, linkové a síťové vrstvě stará bezdrátový modul od Linear Technolgy LTP5901-WHM s integrovanou čipovou anténou. Modul je založen na System on Chip LTC5800 který obsahuje rádiový front-end, paměť FLASH a ARM Cortex-M3 na kterém běží SmartMesh networking software pro správnou obsluhu linkové a síťové vrstvy. Pro uživatele je tento systém přístupný pomocí API rozhraní, které je zprostředkováno pomocí UART-u. Jedná se o asynchornní a potvrzovanou komuniaci s kontrolou toku a chyb.
Výrobce dodáva API ovladač v embedded C. Ten je téměř beze změn (oprava drobných chyb) uložen v adresáři DustNetworks.
Nejsem autorem zdrojových kódů v adresáři DustNetworks.
Vyobrazení rádiového modulu je na obrázku 2:


Obrázek 2: Rádiový modul LTP5901-WHM s čipovou anténou

Prototyp

Pro testování firmware-u byl sestaven hardware-ový prototyp s dostupných evaluačních desek. Z blokového diagramu na obrázku 1 chybí pokorčilá správa napájení z baterky. Pro evaluaci HART a WirelessHART konektivity je uvedený prototyp na obrázku 3 plně dostačující.

wh_photo.jpg
Obrázek 3: Fotka prototypu pro testování firmware-u
1 - AD5700-1 evaluační deska, HART modem
2 - ADuCM4050 vývojová deska. Obsahuje také akcelerometr ADXL363
3 - DC9003A-C WirelessHART vývojová deska pro Evropské pásmo
4 - J-Link debugger

Ukončování HART commandů

Specifkace HART ver. 7 rozšiřuje klasický HART o bezdrátovou nadstavbu WirelessHART a přináší velké množství commandů k řízení síťové vrstvy (Network Helth Report, Neighbour Report…). Všechny tyto příkazy ukončuje (tzn. vykonává nebo generuje odpověď) System on Chip LTC5800. Původní HART commandy, ke řízení aplikační vrstvy (kalibrace měření, nastavování Burstů…), ukončuje aplikační procesor ADuCM4050. Oba typy příkazů musí být akceptováný ze drátového i bezdrátového rozhraní, viz obrázek 4.



Obrázek 4: HART commandy ukončované v LTC5800 (nahoře) a v ADuCM4050 (dole)

Funkce hart_modem_rxSerialRequest() je volána po přijetí kompletní HART zprávy po drátovém rozhraní. Procesor na základě parametru cmdId rozhodne, zda-li
1) Dokáže sám vygenerovat odpověď pomocí hart_lib_cmdTerminatedByMCU() a odeslat ji pomocí hart_serial_txHartFrame().
2) Musí požadavek přeposlat do Mote-u (LTC5800). V tom případě přeformátuje zprávu do formátu srozumitelného pro LTC5800 API pomocí hart_lib_cmdTerminatedBymote() a zavolá vrstvu obsluhující požadavky na Mote hart_modem_vars.toMoteCb().

Zdrojové soubory hart_lib.c hart_serial.c a hart_xor.c v adresáři HART jsou předkompilovány do formátu *.lib.

//========== serialRX
 
void hart_modem_rxSerialRequest(uint16_t cmdId, uint8_t* payload, uint8_t len, hart_lib_master_t master)
{
    int16_t responseLen;
 
    // check if the cmd is terminated by OEM MCU or by mote
    if (
        ((cmdId > 767)   && (cmdId < 1024)) || //SmartMesh WirelessHART Users' Guide p115
        ((cmdId > 64511) && (cmdId < 64766))
    )
    {
        // cmd terminated by mote
        DEBUG_MSG("hart MOTE cmd %d received, length: %d\n", cmdId, len);
 
        // save paramtere, flag request
        hart_modem_vars.toMoteCmdId      = cmdId;
        hart_modem_vars.toMoteRequest    = true;
 
        // build reply
	responseLen = hart_lib_cmdTerminatedByMote(
			cmdId, 
			payload, 
			len, 
			hart_modem_vars.toMoteBuf, 
			hart_modem_vars.toMoteBufLen
			);
 
	// send reply only if hart_lib returned no error
        if(responseLen > HART_LIB_DO_NOT_ANSWER)
        {
		hart_modem_vars.toMoteCb();			
        }
    }
    else
    {
        // all other cmds are terminated by this MCU
        DEBUG_MSG("hart OEM cmd %d received, length: %d\n", cmdId, len);
 
        // build reply
        responseLen = hart_lib_cmdTerminatedByMCU(
				cmdId, 
				payload, 
				len, 
				hart_modem_vars.toModemBuf, 
				sizeof(hart_modem_vars.toModemBuf),
				master
				);
 
        // send reply only if hart_lib returned no error
        if(responseLen > HART_LIB_DO_NOT_ANSWER)
        {
            hart_serial_txHartFrame(
                cmdId,                         // cmd id
                hart_modem_vars.toModemBuf,    // RC|data
                responseLen                    // RC+data
                );
        }
    }
}

Non-volatile data

Specifikace WirelessHART definuje sadu proměnných a nastavení které musí zůstat uloženy i po resetu nebo strátě napájení, jsou tede non-volatile a musí být uloženy ve FLASH paměti. Část těchto proměnných (Network ID, Network Key, MAC adresa) jsou uloženy ve FLASH LTC5800 který je i sám spravuje. Ostatní aplikační proměnné (nastavení Burtů, Eventů, Configuration Changed Counter, Long Tag a další) musí být uložen ve FLASH ADuCM4050. Proměnné ve FLASH jsou seřazeny ve stuktuře typu hart_flash_memImage_t na předposlední stránce FLASH.

//==== structure of non-volatile data saved in flash at HART_FLASH_ADDR
 
typedef struct
{
    cfgCounter_t     cfgCounter;                // configuration changed counter settings
    burstSettings_t  burst[HART_BURST_NUM];     // bursts settings
    eventSettings_t  event[HART_EVENT_NUM];     // events settings
    uint8_t          longTag[32];
    uint8_t          shortTag[6];               // this 3 must be next to each other
    uint8_t          descriptor[12];            // this 3 must be next to each other
    uint8_t          date[3];                   // this 3 must be next to each other
    uint8_t          message[24];
    uint8_t          pollingAddr;
    uint32_t         finalAssemblyNum;          // this is only 24 bit wide!!!!
} hart_flash_memImage_t;

Fronta Finite State Machine

Další komunikace po API s LTC5800 může být zahájena až po ukončení (pomocí ACK) předchozí komunikace a uplynutí Inter packet delay. Požadavky však můžou vznikat asynchronně z různých zdrojů:
1) Asynchronní notifikace z Network Manageru
2) Požadavek z drátového rozhraní
3) Jiný požadavek mikrokontroléru

Pokud vznikne nový poždavek, počas průběhu jiného, je tento zaražen do fronty a bude vykonán po uvolnění komunikačních prostředků pomocí time_configureFsmEvent().

//=============================================================================
// Execution of event, called from time.c 
//=============================================================================
 
void fsm_event(void)
{
    fsm_event_t *thisEvent, *nextEvent;
 
    // init event pointer
    thisEvent            = &fsm_vars.eventQueue[fsm_vars.queueRdIdx++];
    fsm_vars.queueRdIdx %= FSM_QUEUE_LEN;                              // index rollover
    nextEvent            = &fsm_vars.eventQueue[fsm_vars.queueRdIdx];
 
    if (thisEvent->event != NULL)
    {    
        thisEvent->event();      // Issue Callback       
        thisEvent->event = NULL; // Callback is empty		
    }	
 
    // schedule next event in queue, if armed
    if (nextEvent->event != NULL)
    {
        time_configureFsmEvent(nextEvent->delay, fsm_event);
    }
}

Debugging zprávy

Protože všechny dostupné periferie UART jsou obsazené a Keil nepodporuje semihosting bylo využito možnosti posílat debuggovací zprávý zkrze programátor J-Link.
Na straně PC lze tyto zprávy číst pomocí programu J-Link RTT Viewer.
Nejsem autorem zdrojových kódů v adresáři RTT kromě souborů debug.c a debug.h.

Ukázka debuggovacích zpráv po startu mikrokontroléru je zobrazena na obrázku 5.

Ukázka


Obrázek 5: Datalog ze startu mikrokontroléru

Klíčové eventy v zobrazeném datalogu:
Uvítací zpráva - MCU se korektně zaplo
Reset a Event: BOOT - Rádiový modul byl vyresetován a zaslal BOOT notifikaci
FSM JOINING - Byly provedeny všechny potřebné startovací rutiny a je zapnut Autojoin
Join - LTC5800 dostal příkaz na pokusení se o připojení do sítě
Event: OPERATIONAL - Zařízení je připojeno do sítě a má vyhrazené základní rádiové prostředky


Obrázek 6: Přijetí WirelessHART packetu s příkazem číslo 0 - Get Unique Identifier a odeslání odpovědi.

Pro demonstraci funkčnosti bylo vytvořeno GUI, které dokáže generovat WirelessHART zprávy a odeslat je přes manager, dále také přijímá a zobrazuje jejich odpovědi.
Na následujíci videoukázce se ze seznamu připojených zařízení vybere to správné a odesílají se příkazy číslo 20 - Get Long Tag a číslo 72 - Squawk (audiovizuální identifikace, v tomto případě zapnutí/vypnutí LED).

Závěr

V rámci projektu byl sestaven prototypový hardware, který umožňoval evaluaci komunikačních rozhraní pro drátavé FSK i bezdrátové rozhraní podle protokolu HART.

Po úspěšném ověření funkce komunikačních rozhraní, byla vytvořena aplikační vrstva podle oficiálních HART specifikací, tak aby se výsledné zařízení úspěšně připojilo do bezdrátové sítě WirelessHART a správně zpracovalo vybrané příkazy pro zběr dat z akcelerometru ADXL363 připojeného pomocí rozhraní SPI.

Pro generaci HART signalizačních zpráv byl použit jednoduchý USB ↔ HART konvertor. Pro generaci WirelessHART zpráv a demonstraci klíčových funkcí byl vytvořen program pro obsluhu WirelessHART manageru v jazyce Python (není součástí tohoto projektu).

Použitá literatura

[1] Analog Devices Inc., ADuCM4050 Datasheet, 2017. Link: http://www.analog.com/media/en/technical-documentation/data-sheets/ADuCM4050.pdf
[2] Linear Technology, „SmartMesh WirelessHART Application Notes,“ 2017. Link: http://cds.linear.com/docs/en/application-note/SmartMesh_WirelessHART_Application_Notes.pdf
[3] Analog Devices Inc., AD5700/AD5700-1 Datasheet, 2016. Link: http://www.analog.com/media/en/technical-documentation/data-sheets/AD5700_5700-1.pdf
[4] Linear Technology, LTP5901-WHM/LTP5902-WHM Datasheet, 2014. Link: http://cds.linear.com/docs/en/datasheet/59012whmfa.pdf
[5] Analog Devices Inc., ADXL363 Datasheet, 2013. Link: http://www.analog.com/media/en/technical-documentation/data-sheets/ADXL363.pdf
[6] HART communication Foundation, „Network Management Specification,“ 2012.
[7] Analog Devices Inc., AN-1427 Application Note, 2017. Link: http://www.analog.com/media/en/technical-documentation/application-notes/AN-1427.pdf


2017/hart-sensor.txt · Poslední úprava: 2018/01/14 17:31 autor: Tomáš Řežucha