Jste zde

Jednoduchý teploměr v LabVIEW

labview_vi1.png

V jednom ze svých předchozích článků jsem uvedl možnosti jak komunikovat univerzální měřící kartou LabJack s prostředím LabVIEW. Mnohdy ale chceme v LabVIEW využít vlastního zařízení. Dnes bych uvedl možná tu nejjednodušší variantu a to je propojení LabVIEW s externím zařízením prostřednictvím sériové linky, případně lépe, prostřednictvím virtuálního sériového portu některého z převodníků USB/UART.

Úvod

Při vytváření tohoto článku jsem hledal praktický příklad využití takového propojení a nejjednodušším případem by bylo logování teplot naměřených v externím zařízení. Jako platformu jsem zvolil vývojovou desku PSoC MINI TOOL, její konstrukci jsem již na tomto serveru uvedl. Pokud zrovna PSoC nepatří mezi vaše oblíbence, pak jistě vyhoví jakýkoliv jiný mikrokontrolér vybavený sériovou linkou. Pro měření teploty je k desce připojen teploměr DS18S20. Tato velmi často propíraná součástka komunikuje po jednodrátové sběrnici, což může někomu činit potíže, ale opět ani její není využití nijak závažné a lze použít téměř jakýkoliv jiný obvod pro měření teploty. O využitý HW tu vlastně prakticky nejde. Přesto SW pro vývojovou desku a DS18S20 uvádím na konci článku ke stažení.

Hlavní náplní článku je grafický skript pro prostředí LabVIEW. Ten obstarává odesílání požadavků na konverzi teploty a následné zpracování naměřené hodnoty. Komunikace probíhá podle jednoduchého protokolu, kdy požadavek na konverzi je zaslán prostřednictvím příkazu „RD_TEMP“. Naměřená hodnota je pak zaslána v řetězci „TT“, tedy například „28“, pro 28°C.

SW část

Při vytváření grafického skriptu pro LabVIEW budeme vycházet z ukázkového příkladu Basic Serial Read and Write (k nalezení Help-> Find Examples… -> Hardware Input and Output -> Seriál -> Basic Serial Read and Write. Příklad již sám o sobě umožňuje jednorázově zaslat předem definovaný řetězec, dále počká na odpověď čas určený uživatelem (standardně 500 ms) a poté vyzvedne z bufferu sériové linky řetězec (je-li tam). Tento příklad upravíme a použijeme pro naše účely. Nejprve upravíme ovládací panel a to do této podoby:

Obrázek 1: Upravený ovládací panel
Obrázek 1: Upravený ovládací panel

Se změnou ovládacího panelu se z funkčního schéma vymaže několik vstupních a výstupních prvků, ty je nutné nahradit jinými. Opět přikládám hotové řešení uvedené na následujícím obrázku. Na konci článku je samozřejmě celý projekt ke stažení. Mimo změn v oblasti vstupních a výstupních prvků je funkční schéma doplněno o blok cyklu „while“. Ten zajišťuje cyklické zasílání žádosti na konverzi teploty a zpracování odpovědi. V této chvíli předpokládám alespoň částečné znalosti prostředí LabVIEW. Jeho výklad by zabral více než tento článek. Pokud vám takové znalosti chybí, doporučuji se poohlédnout u nakladatelství BEN – technická literatura, které minulý rok vydalo knihu s touto tématikou.

Obrázek 2: Blokové schéma
Obrázek 2: Blokové schéma

Jak to celé funguje

V prvním kroku se provede inicializace sériové linky dle parametrů nastavených v zadávacích polích. V LabVIEW 8.2 ji lze nalézt v Instrument IO -> Serial -> VISA configure serial port. Parametry jsou název portu, baudová rychlost, databity, parita a další. Následuje blok pro odeslání dat prostřednictvím sériového kanálu, k tomu je využita komponenta VISA write, k nalezení je na stejném místě. Je jí předáván COM port, na kterém má vysílat a buffer, ve kterém se nacházejí data (také řetězec) k odeslání.

Po odeslání řetězce je vhodné chvíli počkat, až příjemce zprávu zpracuje a zašle odpověď. Pak už nezbývá nic jiného než vyzvednout data z bufferu pro UART a zobrazit je v zobrazovacím poli „Teplota“ a přidat do grafu. Roztřídění jednotlivých kroků do struktur typu CASE jistě není nezbytné, ale při úpravě výchozího VI by jejich odstraňování přineslo jen zbytečnou práci. Jejich ponechání žádné nevýhody nepřinese.

Zdrojový kód pro PSoC

Jak už jsem uvedl, níže uvedený program byl vyvinut na vývojové desce PSoC MINI TOOL s procesorem CY8C29666. Teplotní čidlo DS18S20 je k němu připojno v režimu "parasite power", tedy je napájeno přes datový pin a napájení je spojeno se zemí. Není to však podmínkou. Datový spoj je připojen na port P1.3

#include  #include "PSoCAPI.h" #include "stdlib.h" #include "string.h"  extern BYTE Port_1_Data_SHADE;  void main() { 	char * strPtr;						// ukazatel na misto v pameti kam se ukladaj prijaty prikazy 	char strOut[5];						// ukazatel na 5 znaku konverze INT2STR (DEC) 	 	// globlani povoleni preruseni 	M8C_EnableGInt;				 	// start a povoleni 16bit citace (neni vlastne potreba, ale je tam :-) ) 	Counter16_Start(); 	Counter16_EnableInt(); 	// start BD generatoru 	Counter8_Start(); 	// start a povoleni preruseni pro prijimac UARTU 	RX8_Start(RX8_PARITY_NONE ); 	RX8_EnableInt();  	RX8_CmdReset(); 	// start vysilace UARTU 	TX8_Start(TX8_PARITY_NONE ); 	// zapnuti napajeni termostatu 	NAPAJENI_Start(); NAPAJENI_On(); 	// start modulu 1-wire 	OneWireSW_Start();	 	while(1) 	{	// pokud prijde nejaky prikaz 		if(RX8_bCmdCheck()) 		{ 			// prevezme prvni slovo 			if(strPtr = RX8_szGetParam()) 			{ 				// parsuje..				 				  				if (!cstrcmp("RD_TEMP",strPtr)) 				{ 					// pokud prijde pozadavek na precteni teploty 					// odesle pozadavek na konverzi 					// pocka az bude teplota zkonvertovana 					// a potom ji vycte a preposle pres seriovou linku       				OneWireSW_Reset();             // Reset the 1-Wire device       				OneWireSW_WriteByte(0xCC);     // Skip ROM command       				OneWireSW_WriteByte(0x44);     // Convert Temperature command       				OneWireSW_Delay10mTimes(75);   // Wait 750 ms for the temperature conversion       				OneWireSW_Reset();             // Reset the 1-Wire device       				OneWireSW_WriteByte(0xCC);     // Skip ROM command       				OneWireSW_WriteByte(0xBE);     // Read Scratch Pad command 					utoa(strOut,OneWireSW_ReadByte()/2,10);					 					TX8_PutString(strOut);					 				}				 			} 		RX8_CmdReset(); 	 		} 	} }

DOWNLOAD & Odkazy

Hodnocení článku: 

Komentáře

Zdravím,
chtěl bych se zeptat zda je možné přepsat soubor VI tak, aby byl použitelný pro čidlo DS18S20 a převodník DS9097E? Prosím