|
摘要:針對BS2微功耗單片機應用系統(tǒng)硬件結構與指令系統(tǒng)的特點,以系統(tǒng)監(jiān)控程序為例,著重分析系統(tǒng)程序設計方法與技巧;結合谷物流量在線測量系統(tǒng),闡述BS2在實際工程中的應用。
關鍵詞:外圍芯片 編程 數(shù)據(jù)采集 沖量傳感器
在閱讀了本刊2001年第10期《一種新穎的器件型嵌入式單片機系統(tǒng)》后,讀者對BS2系統(tǒng)的硬件資源配置、指令系統(tǒng)與開發(fā)方式已經(jīng)有了基本的認識,本文將從系統(tǒng)編程與應用的角度進一步給予詳述。
一、BS2系統(tǒng)的變量類型與定義
BS2系統(tǒng)的PBASIC支持的變量類型有很特色,除了通常的字節(jié)(Byte)、字(Word)外,還有二進制位(bit)、半字節(jié)(nib),這顯然既靈活又節(jié)省內(nèi)存這間。比如,在使用BCD碼時,用nib變量比Byte變量能節(jié)省一半內(nèi)存。nib變量可以說明為數(shù)據(jù),例如:number var nib(10)占用5個字節(jié),可存放10個BCD碼數(shù)據(jù)。PBASIC支持將端口地址定義為常量(con),再用指令對數(shù)量操作來實現(xiàn)端口激活、復位與數(shù)據(jù)輸入/輸出。與直接的I/O地址讀/寫相比,這種方式使程序的可讀性大大改善。
通常在應用程序中首先定義系統(tǒng)變量。BS2系統(tǒng)中常用的系統(tǒng)端口變量定義如下:
CKL con 15 ''所有SPI串行外圍設備共
''享的時鐘線
DATA_ con 14 ''所有SPI串行外圍設備共
''享的數(shù)據(jù)線
EE_CS1 con 13 ''EEPROM1(U3)片選線
EE_CS0 con 12 ''EEPROM0(U2)片選線
NJU_CE con 11 ''時鐘日歷(NJU6355)允許
NJU_IO con 10 ''時鐘日歷(NJU6355)讀/寫
PwrOn con $31 ''外圍可控電源啟動
Shtdwn con 9 ''外圍可控電源關閉
b96 con $54 ''傳輸速率9600bps。
二、BS2系統(tǒng)程序設計實例解析
1.系統(tǒng)初始化
程序啟動運行時,通常需要執(zhí)行以下初始化命令:
OUTH=PwrOn ''打開外圍設備電源
DIRH=$FF ''設置端口高8位為輸出
DIRL=$FF ''設置端口低8位為輸出
2.時鐘/日歷芯片NJU6355的訪問與數(shù)據(jù)讀取
NJU6355ED時鐘/日歷芯片包含13個BCD碼存儲器,分別用于存儲當前的年、月、日、周、時、分、秒等信息,時間采取24小時制。時鐘子程序?qū)⑦@13個變量轉換為1個nib數(shù)組,定義為日期-時間數(shù)組DTG(13)。每個單元存放1個BCD碼,其取值范圍為0~9。BS2系統(tǒng)支持給數(shù)組下標命名,訪問數(shù)組變量時可以通過下標名訪問。例如:“Y10s”定義為常量1,通過DTG(Y10s)可以獲得存放在DTG數(shù)組第一單元數(shù)據(jù)。日期-時間數(shù)組及下標變量定義如下:
Yls con 0 ''存放“年份”個位
Y10s con 1 ''存放“年份”十位
Mols con 2 ''存放“月份”個位
Mo10s con 3 ''存放“月份”十位
D1s con 4 ''存放“日”個位
D10s con 5 ''數(shù)組下標,存放“日”的
''十位數(shù)信息
Day con 6 ''數(shù)組下標,存放“星期幾”對應信息
H1s con 7 ''數(shù)組下標,存放“小時”對應的個位數(shù)信息
H10s con 8 ''數(shù)組下標,存放“小時”對應的十位數(shù)信息
M1s con 9 ''數(shù)組下標,存放“分”對應的個位數(shù)信息
M10s con 10 ''數(shù)組下標,存放“分”對應的十位數(shù)信息
S1s con 11 ''數(shù)組下標,存放“秒”對應的個位數(shù)信息
S10s con 12 ''數(shù)組下標,存放“秒”對應的十位數(shù)信息
Digit var nib ''變量,4bitBCD碼
DTG var nib(13)'' 日期-時間數(shù)組
Temp var word ''臨時變量
(1)set_clock子程序
功能:以人機對話方式讀取用戶輸入的日期、時間數(shù)據(jù),存放到DTG()數(shù)組中,作為計時初值。
set_clock:
serout 16, b96,[CR,“Year(YY):"]:
gosub get2BCD ''取年值
DTG(Y10s)=temp.tighnib存儲年份的十位到DTG ''(Y10s)
DTG(Y1s)=temp.lownib ''存儲年份的個位到DTG ''(Y1s)
:
:
用與取年值相同的方法可取得月份、日期、時、分、星期幾等數(shù)據(jù),并分別存放到DTG(Mo10s)、DTG(Mo1s)、DTG(D10s)、DTG(D1s)、DTG(H10s)、DTG(Hls)、DTG(M10s)、DTG(M1s)、DTG(day)中。
(2)write_clock子程序
功能:將DTG()數(shù)組中的數(shù)據(jù)寫入時鐘芯片,秒的起始值為0。
write_clock:
high NJU_IO ''置位時鐘/日歷芯片為允許寫
high NJU_CE ''選擇時鐘/日歷芯片
for digit=0 to 10''寫11個數(shù)據(jù)到DTG(0)~DTG(10)
shiftout DATA_,CLK,lsbfirst,[DTG(digit)4] ''串行輸出4位到時鐘
next
low NJU_CE ''禁止時鐘/日歷芯片
return
(3)read_clock子程序
功能:用于實時讀取當前時鐘/日歷到DTG()數(shù)組。
Read_clock:
low NJU_IO ''置位時鐘/日歷芯片為允許讀
high NJU_CE ''選擇時鐘/日歷芯片
for digit=0 to 12 ''從DTG(0)~DTG(12)取13個實時數(shù)據(jù)
shiftin DATA_,CLK,lsbpre,[DTG(digit)4] ''串行輸入4位
next
low NJU_CE''Deselect the chip. ''禁止時鐘/日歷芯片
return
(4)get2BCD子程序
功能:以2位十六進制數(shù)形式取兩個BCD碼,每個BCD碼表示數(shù)值0~9。用戶設置時鐘參數(shù)時需調(diào)用此子程序。
get2BCD:
serin16,b96,[HEX2 temp]
return
3.A/D采樣子程序
 以下程序是對用戶系統(tǒng)中外圍芯片LTC1298編程。LTC1298是12位A/D轉換器,輸入量程序0~5V,以外圍電源的5V輸出為參考電壓。LTC1298有兩種輸入模式:兩路單端輸入或1路差分輸入。模式=1為單端,通道號為0~1;模式=0為差分,通道號為0。
A/D轉換程序中變量定義如下:
ADC_CS con 8 ''A/D轉換器LTC1298片選線
ADcnfg var nib ''存儲ADC配置位
ADstb var Adcnfg.bit0 ''與ADC(always 1)
ADmode var Adcnfg.bit1 ''A/D輸入模式
ADch var Adcnfg.bit2 ''通道號
Admsbf var Adcnfg.bit3 ''輸出0(無意義)
以下Adread子程序觸發(fā)A/D轉換,將采集轉換的結果存放到Adres中。
Adread:
Adcnfg=Adcnfg l%1001 ''設置配置參數(shù)
Low ADC_CS ''激活A/D轉換
Shiftout DATA_,CLK,lsbfirst,[Adcnfg4] ''傳送4位配置位
Shiftin DATA_,CLK,msbpost,[Adres12] ''取采樣結果,保存到Adres的低12位中
High ADC_CS ''禁止A/D
Return ''返回調(diào)用程序
若用戶選擇了不同的A/D轉換器,本程序不能完全照搬使用,應根據(jù)所選芯片的可編程信息改寫程序;而前面的時鐘讀寫程序和EEPROM程序用戶可直接使用。
三、BS2系統(tǒng)應用實例
筆者在科研工作中使用配備了LTC1298 A/D轉換器的BS2系統(tǒng),利用廠家提供的免費軟件與PC電腦經(jīng)過串行總線連接,構成了通用實時數(shù)據(jù)采集、控制器,完成了對溫度、多相流測量等多種試驗。使用后感覺最大優(yōu)點之一是微功耗:一節(jié)普通的9V疊層電池可以連續(xù)工作兩個月以上。尤其適用于外出攜帶的野外工作,需長時間連續(xù)監(jiān)測的場合。另外它開發(fā)成本低,不像一般的單片機需要另外花費購置專用開發(fā)系統(tǒng)。本實例介紹的是筆者在谷物產(chǎn)量實時監(jiān)測系統(tǒng)中用BS2為主控制器組成的實時數(shù)據(jù)采集系統(tǒng)。圖1所示為谷物產(chǎn)品實時監(jiān)測系統(tǒng)的示意圖。
由被測物料重量與流量的基本關系知,物料累積重量W、瞬時單位長度質(zhì)量mi、流速vi與瞬時質(zhì)量流利Q之間存在著關系:

式(1)中:Δt為定時采樣時間間隔;mi(t)為在t時刻、傳送帶上任意處單位長度上的谷物質(zhì)量;vi(t)為谷物t時刻的瞬時運動速度。如果在谷物脫離收割機傳送帶后的運行軌跡某處插入一個攔截板,并安裝沖量傳感器,處于運行狀態(tài)的谷物在與攔截板碰撞后谷物的動量將發(fā)生變化,傳感器輸出隨之變化。則由物理學沖量的定義知沖量:
Ii(t)=mi(t)vi(t) (2)
因此,由式(1)與(2)知,利用連續(xù)測量谷物撞擊攔截板后其動量的變化進而實現(xiàn)谷物累積重量的實時測量,從理論上說是可行的。由試(2)可見,沖量數(shù)值的大小既與谷物的重量有關,也與谷物的流速有關。對不同谷物的收割機來說,收獲過程中不同谷物(例如玉米、小麥、水稻和黃豆)的收獲過程對應著不同的運送速度;而對于確定的谷物對象,物料輸送裝置的運行速度基本上是不變的。
實驗得知,在物料輸送裝置的運行速度不變情況下,在單位時間內(nèi)運送某谷物Xkg,與傳感器輸出值D成正比,用公式X=KD表示。通過標定方式為不同種類谷物計算出不同的K。用BS2系統(tǒng)測量計算谷物總量的程序中,使用了前節(jié)所列的部分系統(tǒng)定義變量,在此程序中增加了幾個本程序必要的變量定義。
源程序代碼如下:
Wgt VAR WORD ''谷物累計重量
Seconds VAR WORD ''累計秒數(shù)
Temp1 VAR BYTE ''臨時變量
Temp2 VAR BYTE ''臨時變量
Temp3 VAR BYTE ''臨時變量
K VAR BYTE ''標定系數(shù)
主程序:
Admode=0 ''差分輸入模式
Adch=0 ''通道號為0
Wgt=0 ''測量前谷物重量為0
Seconds=0 ''初始秒值為0
Temp2=0
Temp3=0
Gosubread_clock ''讀當前時鐘
Temp1=DTG(Sls) ''取時鐘的秒值
K=0.2 ''谷物標定系數(shù)
Mcycle:
Gosub Adread ''調(diào)用采樣子程序
IF Adres<8 Then Goto Mcycel ''采樣值<8,視為無谷物輸入, ''采樣無效
Temp3=Temp3+1 ''1s內(nèi)采樣次數(shù)累加
Advalue=Advalue+Adres ''1s采樣值累加
Temp2=DTG(Sls)
IF Temp2=Temp1 Then Mcycle ''1s內(nèi)重復采樣
Second=Second+1 ''秒值增加1
Temp1=Temp2
Wgt=Wgt+K*Advalue/Temp3 ''重量按每秒平均值增加
Advalue=0 ''每秒采樣值清0
Temp3=0 ''每秒采樣次數(shù)清0
Debug "當前谷物重量為:",dec5 Wgt,cr
IF Seconds=3600 Then End ''測1h(小時)結束。
Goto MCycle
End
在上述程序中,BS2每秒多次采樣后輸出一個平均值進行重量累加。因為收獲機械不可避免地存在著振動,即使沒有容 物通過沖量傳感器,仍然會有一定幅度的噪聲電平。為了降低噪聲的影響,提高測量精確定,根據(jù)實驗情況,程序設計引入了噪聲門限閥。若采樣值<8,則認為無容物輸入,采樣值作放棄處理。
以上僅是筆者在自己科研中的應用實例與經(jīng)驗。從網(wǎng)上看Parallax公司組織過幾次專門的應用大賽,獲獎作品有可辨識障礙與聲音的微型機器人,微型灌溉控制器,河流水質(zhì)變化監(jiān)測系統(tǒng),氣象站風力、風速、空氣濕度監(jiān)測系統(tǒng)等等。美國一家航天公司,甚至同時使用6套BS2系統(tǒng),分別用于控制火箭發(fā)射角度、傳送GPS信息、電子攝像等等。有興趣的讀者從那里能得到更多信息?傊,在美、歐、澳洲等國家,BS2系統(tǒng)的應用成果已經(jīng)是遍地開花。 |