智能電磁流量計中各功能模塊的劃分和C語言實現
智能電磁流量計轉換器的工作過程,不僅要求CPU對來自傳感器的流量信號進行采集、處理、運算、顯示,完成流量、流速的檢測。同時還要控制產生低頻矩形波勵磁電流、輸出流量的積算總量值和輸出模擬電流、頻率、數字通訊信號以及分時檢測傳感器的空管信號等等,所以本系統智能電磁流量計的軟件部分設計是比較復雜的,根據上面提到的各個功能,主要功能可以劃分為阻6’7’“491: 1、單片機看門狗保護; 2、數據采集部分控制; 3、鍵盤管理;4、LCD顯示控制; 5、寄存器管理; 6、勵磁控制; 7、輸入信號數字預處理; 8、流量計算; 9、報警; 10、空管及正反向流量檢測; 11、網絡通信。在這里,要說明的是,這些任務的操作并不總是順序執行的,在很多時候需要并行地操作。如通信、鍵盤管理等在任何時候都有可能發生,流量計算可能消耗比較多的時間,數據采集需要定時進行等等。當然從指令層來看其程序仍是一條指令接一條指令順序執行,但從宏觀上來說,這些任務的處理是并行的。
4.3.1系統主程序
系統的主程序主要由主循環和初試化程序構成,其流程見圖4_3所示,裝置上電復位或手動、硬件復位后,微處理器80C196KC就要響應復位信號,然后程序從地址0x2080開始執行。程序入口的個模塊是程序初始化模塊,包括對相關硬件的初始化和相應參數的初始化。硬件初始化主要是完成開關量輸出初始化, 顯示芯片初始化,微控制器的中斷、串行口、定時器等硬件資源的初始化,主要是對特殊寄存器的復制賦值;相應參數的初始化包括對程序中各個變量的初始賦值,比如對鍵值的初始賦值等;而主程序框圖中的各個子程序的執行,指的是對一些功能模塊的初始設置,這里主要指LCD顯示模塊的初始工作設置,在系統開始上電或復位工作以后,應在LCD上顯示一些特殊意義的信息,如儀表型號、生產廠家名稱、商標等文字圖案信息。還有其他的子程序初始化包括數據采集初始化子程序在系統開始工作之前,應對采集所存儲的地址指針清零等工作。在程序的主循環中,我們采用了檢測標志位的方法,運用中斷服務程序產生各執行的標志位,通過對其標志為的判定,來執行相應的子程序。圖4-3主程序流程框圖其中,特殊寄存器的操作如下: void Sfrslni《void) { WSr=OxOf; timerl=45536; wsr=Ox00; iocO=Ox01; iocl=Ox04; baud rate=Ox67; baud rate=OxSO; int pend=Ox00; intmask=Ox91; 腚時器1定時20ms,其中65.536ms為周期的計時//O:hsi.0輸入使能。//5:選擇p2.0為喇,2:定時器1中斷使能, 3:定時器2中斷使能,hsi保持寄存器被加載//9600baud的設置: ,,中斷懸掛清零//7:外部中斷,4:hsi.0中斷,O:定時器1中斷,int_pendl=0x00; int_maskl=0x00;
4.3.2各中斷服務子程序
,,中斷懸掛清零“撾tx.rx中斷此智能流量計軟件設計部分主要涉及到的中斷有3個,分別是定時器1中斷服務程序,外部中斷服務程序,HIS.0中斷服務程序:
1、定時器1中斷[49-s3J:
定時器1的中斷服務程序主要是用來控制勵磁方式和生成AD轉換信號,在我們這里設計的系統中,采用三值低頻矩形波的勵磁方式,通過控制negative和positive來調節勵磁的變化及控制AD轉換采集信號,當程序初始化以后,一旦開啟中斷信號,此程序就一直在運行中,這里我們設定時器溢出時問是20ms,以8 個狀態作為一個周期,其流程如下圖4-4: 其相應的程序如下: void timerlmanage(void) { if(count==8) 圖4-4定時器中斷流程圖count=O; Switch(count) ‘:tse0: negative-1;count++;break; casel: adflag-捌;count++;bre出case2: negative---O;count++;break= case3: count-t+;break; case4: positive--1;count++;break; case5: adflag=Oxff;count++;break; casc6: positive---0,count+l-;break; case7: //設定ad采樣標志位adflag //設定ad采樣標志位adflag count++;break; 出fault; ’ 由此我們可以得到單片機控制的勵磁低頻三值波為: Negative:廠—]廠—] Positive:廠—] 勵磁方式:
2、外部中斷服務程序:
外部中斷服務程序的執行,主要用來控制對ADS7806轉換器的數據讀取,因為有對A/D轉換讀取的實時性,我們用外部中斷來完成這個功能,部分程序如下陋郴s】: #pragma interrupt(adbusy 2n { RC-=I; BYTE--O; ,·進入讀模式,選擇高字節+/ uh=*(unsigned char*)adcs; /.讀取轉換結果的高8位’, BYTE=l; /.選擇低字節·, ul=’(unsigned char*)adcs&OxfO; ,’讀取轉換結果的低4位’, u=uh’256+ul;if(u>--0x0800) II=u脅固00; ,.如果為負值,則符號擴展., Atray[i]=u; I++: ADflag=0xff; ,·數據讀取后的保存., ,.AD轉換標志位., )ADS7806u的具體轉換工作可以參考第三章第2節,在這里,我們設定了連續采集N個點的采集方式,當ADflag=0xff時,設定的ADS7806開始工作,進行模擬信號的采樣轉換工作,R/C為低電平,然后等待轉換的完成,BUSY產生高電平, 所以使得外部中斷服務程序的執行。麗對于主程序中對AD的管理程序見如下: while(adflag=--Ox田//ad轉換程序{ adflag--0x00; ,,設置轉換標志位uh=’(unsigned char‘)adcs;,,i筮中C8位,啟動AD采樣轉換R/C=0; while(!adflag) ,,等待中斷,完成AD的讀取{ ); if(i--N) /厥N個采集點{ i--1; adflag--0x00; } ’ 3、HIS.0中斷服務程序: q P ——卜—+一圖4-5按鍵過程中接觸電阻變化情況HIS。0中斷服務程序主要完成對鍵盤管理工作,對于鍵盤處理,包括硬件和軟件兩部分,硬件電路可以參考第三章第3節,而對于軟件的處理,主要包括識鍵; 譯鍵及可能的鍵義分析。因為按鍵是機械結構,在鍵閉合與彈開的時候,往往會產生抖動,若系統處理不好,一次按鍵會被誤認為是連續按了多次鍵。因此, 必須對按鍵的抖動作相應的處理。圖舡5是一個典型的按鍵過程中的觸點電阻變化情況。一般按鍵抖動時間大約10~20ms,因此,處理程序在按鍵穩定后再檢查鍵的信息。當然,克服按鍵抖動常用的方法有兩種:一種是用硬件,即在每個鍵上加RC濾波電路或用一個RS觸發器組成防抖動的電路,另一種方法是用軟件延時程序,待按鍵狀態穩定后(10--20ms)再去讀取信息,從而防止誤判斷。在本系統中,我們采取的是軟件消除鍵盤抖動的方式,當有按鍵下按時,就會有一個HIS.0的中斷,在中斷服務程序里,先有一定的延時,這里我們設為10ms, 然后再進行鍵值的讀取。HIS.0的中斷服務程序如下【““j“圳: 卻ragma interrupt(keymauage=4) { int_mask=intmask&Oxef; f}屏蔽HSIO; delay_lores; keyvalue=’key_cs; KeyShowld=0xff; int_pending=int pending&0xef;腑苛中斷懸掛寄存器HSIO位; int_mask=Ox91; ,,取消屏蔽的HSIO; }
4.3.3系統軟件其他功能模塊的開發
一、看門狗陋”,刪
WATCHDOG(俗稱“看門狗”)是單片機抗干擾的軟件措施,它具有的特點是本身能獨立工作,基本不依賴于CPU,CPU只在一個固定的時問問隔內與其打一次交道,表明整個系統“目前尚屬正常”;另一個一個特點是當CPU落入死循環后,能及時發現并使整個系統復位。我們這里采用的是W蛆℃HDOG硬件電路配合的措施,并不是純軟件的WATCHDOG系統。一般的。WATCHDOG硬件電路為一獨立于CPU之外的單穩部件,可用單穩電路構成,也可用自帶脈沖源的計數器構成。CPU正常工作時每隔一段時間就輸出一個脈沖,將單穩系統觸發到暫穩態。當CPU陷入死循環后,再也不去觸發單穩系統了,單穩系統就可順利返回穩態。利用它返回穩態時輸出的信號作為復位信號,就可以使CPU退出死循環。這其中對于“喂狗”時機的考慮,也就是指復位“看門狗”,一般安排在等待查詢的循環體內部、耗時很大的函數體內部或主程序任務隊列中,下面就是一個“喂狗”的程序: void ClrRst(void) { unsigned char temp; if(RelyConFlag—Oxm{ temp=ioportl; temp=temp&Oxef ioportl=lemp; } }
二、輸入處理及流量計算【枷拈】
由于流量儀表采集到的數據與實際流量值間只有線性的對應關系,它們的單位并不相同,流量儀表不能將采集到的數據直接作瞬時流量數據使用,必須對其進行必要的轉化。此模塊就是用來將采集到的數據轉化為流量數據,其程序流程如圖4-6所示。由于外界隨機干擾的影響,系統采集到的數據有時也會隨機偏離實際的流量值。為了得到準確的數據,我們在系統對數據進行處理前采用數字濾波來濾除干擾的影響。此外,為了消除測量信號與實際流量值間非線性誤差的影響, 我們對采集到的數據實施了非線性補償。[互口@ 圖4-6運算子程序框圖數字濾波實際上是一種程序濾波。它通過一定的計算程序,減少干擾在有用信號中的比重。與常規的硬件模擬濾波器相比,有以下幾個優點:
1)N為用程序濾波,無需硬件設備,且可多通道共享一個濾波器(共同調用同一個子程序);
2油于不用硬件設備,各回路間不存在阻抗匹配等問題,故可靠性高,穩定性好;
3)可以對頻率很低的信號濾波,克服了模擬信號濾波的缺陷.且可根據需要選擇不同的濾波方式,或改變濾波器的參數,方便、靈活。因此數字濾波得到了廣泛利用。
數字濾波主要有以下幾種方法:
1、程序判斷濾波
當采樣信號由于隨機干擾、誤檢測或變送器不穩定引起嚴重失真時,可采用程序判斷濾波。程序判斷濾波是根據生產經驗,確定出兩次連續采樣輸入信號可能出現的偏差,若超過此偏差值,認為是虛假的干擾信號應該去掉,否則保留該采樣值。基本程序是比較判斷,其中還可分為限幅和限速兩種方法。
2、中值濾波
中值濾波是對連續采樣輸入的三個信號進行比較后取中間值。設三次采樣輸入分別為yl,Y2,y3若Y。<y2<),3,則取),2為本次采樣有效信號。中值濾波對偶然因素引起的脈沖性干擾十分有效。對緩慢變化的過程參數采用此法有良好的效果,但不宜用于快速變化的過程參數。
3、算術平均值濾波
算術平均值濾波是尋找一個Y值,使該值與各采樣值間的誤差的平方和為最小,即“曲酬叫抄t川㈩由一元函數求極值的原理可求得y a搬叫㈤式中%為第k次采樣值;為采樣次數;Y為Ⅳ次采樣的算術平均值。顯然,N越大,結果越準確,但計算時間也越長。算術平均值濾波將Ⅳ次采樣值同等對待,這就削弱了當前采樣值在程序中的比重,有時為了提高濾波效果,將各次采樣值取不同的比例系數,然后再相加, 這種方法又常被稱為加權平均濾波,其運算表達式為Y一羅c。墨(4-3)式中q為比例系數,它應該滿足了q=1,一般情況下,采樣次數越靠后,Ci取的比例越大,這樣可提高新近采樣值在平均值中的比重。
4、一階慣性濾波程序
無源濾波器RC電路是模擬量輸入通道常用的濾波方法,但對于低頻干擾卻因為RC參數難以實現,往往不能取得良好的效果。而一階慣性濾波是一種以數字形式實現低通濾波的動態濾波法。在濾波時間常數要求較大的場合,這種方法尤為實用。己知RC低通濾波器的濾波常數為GG)-l,6)/xG)-V∞s+1) (4.4) 其中,L-RC為低通濾波器的時間常數。將上式離散后可得YI一(1一aJyI_l+O口ft(4-5) 這就是一階慣性濾波的數字表達式。兒,兒。分別為第k次及t-1次采樣濾波后濾波器輸出值,濾波系數口-1-e—r/r1,T為采樣周期,當r遠小于L時,口.r/L。在程序濾波時,可通過實驗選擇適當的L值,直到被檢測的信號不產生明顯的紋波為止. 通過對上面幾種數字濾波方法的分析、探討,我們發現平均值濾波方法適用于對流量信號的平滑處理。流量信號總是在某一數值范圍內上下波動,有一個平均值存在,采樣一點是不準確的,平滑程度取決于N,隨著N增大,平滑度提高, 但響應速度降低。為了進一步提高濾波效果,我們采用一種新的濾波方法,即將中值濾波法和平均值濾波法相結合,這種濾波方法稱為復合濾波。其設計思想是,連續采樣N 次,把采樣值按順序排隊,去掉值和最小值后,把N-2次采樣求平均值。這樣既可以去掉脈沖性干擾,又可以濾掉慢隨機起伏信號。
三、電磁流量計LCD顯示№。”·61J
顯示器對于儀表來說就像眼睛對于人來說一樣。良好的顯示界面是智能化儀表的發展趨勢。在本項目的設計中,我們采用了TRULY sEMIcoNDucToRS LTD的MsD-G12864點陣圖形示液晶顯示器來顯示數據信息,此液晶顯示的工作原理方面, 可以見第三章第五節LCD液晶顯示模塊部分,在軟件部分的設計中,主要討論液晶模塊的初始化、流體流速的顯示,流體累積流量的顯示和漢字的顯示等信息。按設計的要求,在正常運行和顯示狀態下,LCD能夠設置瞬時流量、累積流量及其單位,在查詢設置參數或參數設置狀態下,應能顯示相應的漢字提示、操作菜單和被顯示或修改的參數值。顯示功能模塊由鍵盤消息和運算子程序后產生驅動, 并根據狀態變量做出不同的反應。下面給出了液晶顯示清屏初始化部分的程序: void IxdInitCs(unsigned char CS.unsigned int WrCommandAddr,unsigned洫WrDataAddr)unsigned char x,y; unsigned char+led; led=(u∞igned char’)WrCommandAddr, *lcd=0x3£,/控制顯示開關,0011111x,O表示關,1表示開; *lcd;OxcO; ,,設置顯示的起始行。llxxxxxx for(xfOxbS;x<fOxbf;x++) ,,設置頁值1011 lxxx { . LcdWaitBusyC_,s(cs); led=(unsigned char+)WrConl】mandAddg ’led=x: for(yfOx40;y<=Ox7f;y++1 ,/設置列值01xx xxxx, { lxdWaitBusyCs(cs); led=(unsigned char’)WICommandAddr, ‘led2 y; lxaWCaimusyCs(cs); led=(unsigned char’)WrDataAddr, ’lcd=Ox00; ) ’
免責聲明
客服熱線: 13199863987
加盟熱線: 13199863987
媒體合作: 0571-87759945
投訴熱線: 0571-87759942
下載儀表站APP
Ybzhan手機版
Ybzhan公眾號
Ybzhan小程序