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

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