//Logo Image
作者:馬鴻祥(2005-03-01);推薦:吳昌暉、徐業良(2005-03-01)

PIC_SERVER教材(3)-近端感測器數據擷取與顯示

PIC_SERVER除了可實現動態WWW伺服器、網際網路遠端監控等雙向傳輸數據功能外,亦具備有基本的單晶片功能,如數位I/OA/D轉換、PWM輸出、脈波捕捉等。以MicrochipPIC18F4620單晶片為例,就包含有1310-bitA/D通道(channel),解析度達2-10,可擷取類比感測器輸出的類比電壓數據。本文暫不考慮PIC_SERVER的網路功能,先介紹以PIC_SERVER作近端感測器的數據擷取與顯示。

1.     近端感測器數據之擷取與顯示

本文所要達成的近端感測器數據之擷取與顯示功能,可用元件功能方塊圖(component and functional block diagram)表示如下:

1. 功能方塊圖

1中數位電壓輸出型的感測器,如極限開關、溫度開關等等,輸出信號為僅有高低電位兩種狀態的數位信號(digital signal);類比電壓輸出型的感測器,如類比位移感測器、類比溫度感測器等等,輸出信號則是與位移或溫度等物理量成正比關係的類比電壓信號(analog voltage signal)

PIC_SERVERPIC_PROTO電路板上有一個數位感測器(ICP按鍵),也有一個類比位移感測器(旋轉式的可變電阻)。本文將說明如何讀取這兩種感測器的資訊,以及如何將所得到的資訊呈現於LCDRS232 terminal兩種顯示裝置的方式。最後並以實例說明如何用簡單的熱敏電阻,配合板上的可變電阻製作溫度感測器,量測並顯示PIC_SERVER周圍的環境溫度。

2.     讀取數位與類比資訊

2PIC_SERVER部分layout圖,PIC_SERVER板的CN5排針母座上分別有常用之類比輸入腳位A0A1A2A3與數位輸入腳位A4B0B2B3,而其接點命名方式由A0開始,分別是CN5.1CN5.2CN5.3…以此類推。完整layout圖參見C:\YZ_PIC\Util\Schematics\PIC_SERVER_Circuit\PIC_SERVER Layout.pdf,可列印一份在手,方便隨時查詢腳位。

2. 部分layout

2A4接點除了連接A_4 LED燈外,同時與ICP按鈕接通,可利用ICP按鈕作數位輸入,使用input(PIN_A4)指令,即可讀取PIC_SERVER板上ICP按鍵的數位輸入資訊。單晶片PIC18F4620A4接腳的電氣特性是COMS準位,當電源電壓為5V時,若外界電壓高於4.0V就視為高電位(input(PIN_A4)回傳數值為1),若低於0.8V就視為低電位(input(PIN_A4)回傳數值為0),若在0.8~4.0V之間,則input(PIN_A4)回傳數值不確定。PIC_SERVER的電路設計是ICP按鍵被按下就接地,電壓為0,沒按下就是+5V,因此ICP按鍵被按下時input(PIN_A4)回傳數值為0,反之為1。同理,input(PIN_B0)input(PIN_B2)input(PIN_B3)分別依PIN_B0PIN_B2PIN_B3之高低電位傳回10數值。

read_analog(0)指令即可讀取PIC_SERVER板上類比輸入接點AN0(CN5.1)的電壓資訊,亦即接到單晶片的RA0/AN0接腳的電壓(詳閱電路圖與電路板配置圖)。同理,read_analog(x)指令讀取接腳ANx的電壓,x可為0~3類比輸入AN0接點同時接在可變電阻VR1端(如圖3),旋轉可變電阻便可從AN0接點讀取+5V分壓電路的電壓值。

3. 旋轉可變電阻可從AN0接點讀取+5V分壓電路的電壓值

利用read_analog(0)指令所讀取的AN0訊號並不是真正電壓值,而是儲存於記憶體數值範圍在0~1023內之數據(因為PIC18F4620單晶片的A/D channel10-bit),代表0~5V的電壓值,因此所讀取訊號需要經式(1)轉換成電壓值:

                                                                       (1)

3.     如何將資訊輸出到近端的顯示裝置

3.1 近端RS232終端機顯示

利用電腦RS232終端機(RS232 terminal)可將PIC_SERVER上的近端數據列印於電腦螢幕上,將擷取到的數據以文字檔形式存入電腦中,方便數據擷取後的資料處理。開啟終端機方法有二,除PIC_SERVER教材(2)中提及可直接點選ICP中的藍色電話圖示外,還可在Windows作業系統的「開始è程式集è附屬應用程式è通訊è超級終端機」來新增終端機,不過需要設定與PIC_SERVER相同的COM port,且鮑率(baud rate)必須設為115200,使用結束後可儲存終端機設定,方便下次使用。

使用標準C指令printf(“…”, variable)即可將資訊輸出到「標準輸出裝置(standard output device, stdout)」,在CCS編譯器所定義的標準輸出裝置就是RS232介面。例如PIC_SERVER列印資料單一變數於終端機的程式語法為

printf(“characters %3.2f”, variable)

列印資料多變數於終端機的程式語法為

printf(“characters variable1=%3.2f variable2=%4lu…”, variable1, variable2,… )

將要列印的文字寫於雙引號內,其後再附上要顯示的數據變數名稱。在雙引號內須設定資料輸出格式,以“%”符號宣告之。格式與變數必須符合,資料輸出的格式設定如表1所示,詳細使用方式可參考一些C語言書籍。

1. 輸出格式使用範例

Data Form

Output Form

char

%c

float

%3.1f

%3.2f

int

%d, %x, %o, %u, %X

long

%ld, %lx, %lX, %lo, %lu

double

%lf, %le, %lg

在雙引號內的文字後可附上“\r”\n符號,“\r”表示從終端機起始端列印起但不換行,“\n”表示換行列印但列印位置接續上一行結尾位置,兩個符號一起使用可得到如圖3整齊排列文字方式。列印在終端機的文字或資料可點選在如圖4「轉送è擷取文字」,將其儲存於設定的文字檔案中,其後可用Excel試算表、MatlabVisualBasic或其他軟體將其數據描繪成曲線圖等。

4. 選用擷取文字功能

3.2 近端LCD顯示

用標準的C指令printf(lcd_putc, “…”, variable)即可將輸出資訊從標準輸出裝置「轉向(redirect)」到字元函數lcd_putc()所指定的輸出裝置去,也就是LCD模組。PIC_SERVER列印資料於LCD的應用語法與列印於終端機相同,例如

printf(lcd_putc, “characters %3.2f, variable )

LCD顯示器是PIC_SERVER周遭擴充硬體之一,所需驅動程式已被寫在yz_lcd.c中,使用者只需使用如下幾個LCD相關函式即可:

(1) lcd_init():此函式為LCD的驅動程式,使用LCD就必須在主程式中呼叫此函式。

(2) lcd_gotoxy(x, y):此函式控制顯示起始字元的座標位置。如圖5所示,左上角第一行的第一區塊座標為(1, 1)、第二區塊為(2, 1),以此類推,第一行最後一個區塊座標為(20, 1);第二行起始座標則為(1, 2)、最後一個區塊是(20, 2)

5. LCD座標(20×2)

(3) lcd_putc(“characters”):此函式輸入使用者所要顯示的字元,在函式括弧內的顯示字元必須以雙引號包覆。

3.3 按鍵與電阻式位移感測器的資料擷取與顯示

這一節中用兩個範例程式說明如何讀取PIC_SERVER電路板ICP按鍵及旋轉式的可變電阻這兩種感測器的資訊,並顯示LCDRS232 terminal上。

6之範例程式功能為讀取與顯示按鈕(PIN_A4)電位高低。這個程式架構也是PIC_SERVERC程式標準架構。程式第一個部分(第1~4行)先對周遭硬體的定義作設定,如51行即設定了不要顯示第201203204號警告;第2行則是CCS編譯器針對18F4620單晶片所提供的的頭文件,應依據電路板上的晶片修改這行指令;第3行是針對電路板版本的設定。程式第2行與第4行中分別可以看到紅色字體“#include”的字串,在C程式中,一執行到有“include”的字串,C程式編譯器(C compiler)便到所設定的搜尋路徑去(打開CCS編譯器,點選OptionsèInclude Dirs即可看到)搜尋相關的程式片段與定義,而這兩行“include”的程式,代表了數千行的文字,不但避免重複撰寫同樣程式的累贅,也可降低程式撰寫人員檢查的困難。

程式第二個部分(第5~16行)為主程式main(),並包含一個while(1)迴圈。主程式中第78行指令將PIC_SERVERLCD初始化,接下來的while(1)迴圈中,第11行先激發PIN_A4為高電位,第12~14行則將PIN_A4狀態分別顯示在終端機和LCD上。程式第三個部分(17~23行)是一些不可省略的網路功能函式,此部分將於往後教材介紹。

燒錄完此範例程式後,可試試按下ICP鍵(或連接PIN_A4與地線),觀察終端機和LCD如何顯示。

6. 按鍵式位移感測器資料顯示範例程式

7中範例程式則是用來讀取與顯示PIC_SERVER上旋轉式可變電阻的類比電壓,與圖6範例程式相較,僅在while(1)迴圈中作了改變。燒錄完此範例程式,可試試旋轉可變電阻,AN0數值是否在0~1023的範圍內。

7. 電阻式位移感測器資料顯示範例程式

4.     應用實例-近端溫度感測器數據擷取與顯示

7範例程式中所讀出的AN0數值,即使經式(1)中轉換,也僅是感測端的電壓值,並非所量測之物理量,必須經過一番處理與轉換。

以負溫度係數的熱敏電阻為例,其特性是溫度越高電阻越低,但是感測端量測的是電壓,因此首先要將電阻值的變化轉換成電壓值的變化。這個步驟可以自製分壓電路,或直接利用PIC_SERVER板上的可變電阻VR1,方法很簡單,將熱敏電阻的兩端分別接在PIC_SERVER的接點CN7.1(+5V)CN5.1(RA0/AN0),和PIC_SERVER板上的可變電阻VR1組成並聯電路,如圖8所示。

8. 利用PIC_SERVER板上的可變電阻製作分壓電路

假設VR被分為xy兩段電組,x與熱敏電阻(R)並連,所得等效電阻為。因此RA0/AN0讀到的電壓值為

                                                   (2)

(2)中當溫度越高、熱敏電阻R值越低時,則輸出電壓越高(R趨近零時輸出為5VR很大時輸出趨近於)。使用溫度感測器前必須先以實驗方式求得不同溫度下之輸出電壓值,再以curve fitting方式求得電壓-溫度轉換方程式。

實際上的作法可以用直線來近似室溫(攝氏25度)附近之電壓-溫度轉換方程式。式(3)是一個直接將讀取之類比信號(0~1023)轉換成攝氏溫度的近似式,配合 PIC_SERVER電路板上500kW的可變電阻,就可以適用於很容易買到的10kW100kkW的熱敏電阻。校正方式也很簡單,調整可變電阻使該點電壓在攝氏25度時為1.5V即可(可以驗證一下,)。

                                                              (3)

最後圖9是以熱敏電阻作溫度感測器之數據擷取與顯示範例程式,在主程式的無窮迴圈while(1)內讀取A0腳位資料、以式(3)轉換成溫度後顯示在終端機與LCD上。

9. 溫度感測器數據擷取與顯示範例程式

【實驗】

依照本文所提步驟,利用熱敏電阻製作出可讀取即時環境溫度的溫度計,於下次上課展示功能。嘗試利用其他類比感測器量測不同物理量,如照度、濕度等,例如把熱敏電阻換成光敏電阻就可以量測照度、換成濕敏電阻就可以量測濕度,最後在PIC_SERVERLCD上顯示出合理的變化。