專利名稱:壓電陶瓷換能器導(dǎo)納圓圖示儀的制作方法
技術(shù)領(lǐng)域:
本發(fā)明是一種涉及物理學(xué)中聲學(xué)領(lǐng)域的、有關(guān)壓電陶瓷換能器導(dǎo)納測(cè)量的裝置。
壓電陶瓷換能器是聲學(xué)領(lǐng)域用于產(chǎn)生和接收聲的一類晶體物質(zhì)。在使用壓電陶瓷換能器之前需要知道其主要參數(shù)才可以實(shí)施應(yīng)用,其參數(shù)主要包括共振點(diǎn)頻率、靜電容(C0)、動(dòng)態(tài)阻抗(R1、C1、L1)、機(jī)電耦合系數(shù)、等效頻寬、機(jī)械品質(zhì)因素Q、溫度穩(wěn)定性等。如果能夠測(cè)出壓電陶瓷換能器的在共振點(diǎn)附近的一段頻率范圍內(nèi)的導(dǎo)納值,就可以分析提取出以上所需的參數(shù)。由于在這一段頻率范圍內(nèi)的導(dǎo)納值在導(dǎo)納復(fù)數(shù)坐標(biāo)上形成一個(gè)近似的圓,故稱之為導(dǎo)納圓。
壓電陶瓷換能器導(dǎo)納圓圖示儀是用于對(duì)壓電陶瓷換能器的導(dǎo)納特性進(jìn)行分析,從而獲取其主要的參數(shù)的儀器。它主要用于指導(dǎo)壓電陶瓷換能器的檢測(cè)和使用,是對(duì)壓電陶瓷換能器進(jìn)行有效的測(cè)量、分析或合格/不合格測(cè)試的綜合性解決方案。
目前關(guān)于壓電陶瓷換能器的導(dǎo)納圓檢測(cè)一般由兩種方法,一是采用從美國進(jìn)口的、通用的阻抗分析儀來做壓電陶瓷換能器的導(dǎo)納圓檢測(cè)。例如Agilent4192A(原為HP4192A),但是其價(jià)格非常昂貴,大約在2-3萬美元左右,國內(nèi)擁有此儀器的不多。而且它沒有和PC機(jī)相連接,需要自己開發(fā)和計(jì)算機(jī)的接口和以及專門用于壓電陶瓷換能器的程序,用于對(duì)換能器的參數(shù)進(jìn)行分析、提取、打印輸出。Agilent4192A的應(yīng)用面較廣(做壓電陶瓷換能器的導(dǎo)納檢測(cè)只是其一部分功能),所以其性能指標(biāo)也很高,導(dǎo)致檢測(cè)裝置復(fù)雜,成本很高,而且做壓電陶瓷換能器的參數(shù)分析提取也不方便。
另外一種方法是采用通用的波形發(fā)生器進(jìn)行逐點(diǎn)掃描,并用示波器記錄讀數(shù),將其導(dǎo)納圓描繪出來,然后得到壓電陶瓷換能器的參數(shù),此方法不僅費(fèi)時(shí)費(fèi)力,而且精度不高。
微電子技術(shù)的發(fā)展,使得獲得頻率可精確控制的信號(hào)源成為可能。隨著個(gè)人電腦的普及應(yīng)用,在PC上開發(fā)應(yīng)用程序,將硬件和軟件結(jié)合起來,開發(fā)一種成本相對(duì)較低的、專門用于壓電陶瓷換能器導(dǎo)納圓測(cè)定的儀器,便可以解決以上矛盾。
由于電流值不容易檢測(cè)到,解決方法是在支路中串聯(lián)一個(gè)電阻,由于電阻上的電壓值和電流值成正比,所以檢測(cè)到電阻上的電壓值就能得到支路電流值。由于針對(duì)不同用途的換能器,其動(dòng)態(tài)阻抗R1的范圍很寬,從幾歐姆到幾千歐姆,因此為了保證檢測(cè)的精度,所串聯(lián)的電阻值需要可調(diào)節(jié),以避免電阻上的電壓太大或太小,以致于難以檢測(cè)。其原理電路如圖2所示,其中Us為正弦激勵(lì)信號(hào)、R為電源內(nèi)阻、RM為支路串聯(lián)電阻、L為壓電陶瓷換能器。由圖2可知換能器的阻抗Z為Z=uA-uBuB/RM=RM|uAuB-1|]]>(uA為支路兩端電壓、uB為電阻RM兩端電壓)設(shè)uA=KAejwt,uB=KBej(ωt+)可得UAMUBM=KAKB]]>(UAM為uA的峰值、UBM為uB的峰值)則 式中 (R為阻抗的實(shí)部) 1) (X為阻抗的虛部) 2)換能器的導(dǎo)納Y為Y=1Z=RR2+X2+jXR2+X2=G+jB]]>(G為導(dǎo)納的實(shí)部、B為導(dǎo)納的虛部)由式1)與2)可知,換能器的導(dǎo)納是復(fù)數(shù),只要測(cè)出不同頻率下的UAM、UBM、Cos的數(shù)值,然后知道RM大小,就可以得到換能器的導(dǎo)納特征。
2.硬件設(shè)計(jì)硬件部分通過普通的九針串行口與計(jì)算機(jī)通信。硬件分為三部分1)信號(hào)發(fā)生電路在實(shí)際應(yīng)用中需要產(chǎn)生分辨率為1Hz的正弦信號(hào),頻率的穩(wěn)定度在1Hz以內(nèi),頻帶范圍為1Hz~0.5MHz。采用模擬方式難以滿足要求,因此采用直接數(shù)字合成(DDS)的方式得到正弦信號(hào)。其特點(diǎn)是頻率精度高、容易精確控制。向DDS芯片發(fā)送頻率控制字,就可以輸出相應(yīng)頻率的正弦波信號(hào)。美國Analog Device公司推出的DDS系列芯片如AD7008、AD9850均可以實(shí)現(xiàn)直接數(shù)字合成頻率的功能。
下面簡單介紹AD7008的結(jié)構(gòu)和性能AD7008是Analog Device公司采用先進(jìn)的直接數(shù)字合成(DDS)技術(shù),推出的高集成度頻率合成器。它內(nèi)部包括32位相位累加器、余弦/正弦表、高性能10位DAC、與微機(jī)的串行和并行接口以及控制電路等,能實(shí)現(xiàn)全數(shù)字編程控制式的頻率合成。接上精密時(shí)鐘源,AD7008即可產(chǎn)生一個(gè)頻率和相位都可編程控制的正弦波。AD7008在20MHz的晶振下工作時(shí),其輸出頻率分辨率可達(dá)0.047Hz,最大輸出頻率可達(dá)5MHz。
AD7008接口控制比較簡單,可以用8位或16位并行口或單行口直接輸入頻率、相位、以及調(diào)幅幅度等控制數(shù)據(jù)。這里采用串行的SPI口和AT89C51連接,指需要將AD7008的SDATA、SCLK、LOAD接到單片機(jī)的輸出口上便可以實(shí)現(xiàn)對(duì)AD7008輸出頻率的編程控制。AT89C51只要以串行方式輸入32位的相位累加器值ΔPhase就可以改變頻率,相位累加器值和頻率的關(guān)系如下f=ΔPhase×fCLOCK232(0≤ΔPhase≤232).]]>其中fCLOCK為晶振頻率。AD7008輸出的正弦信號(hào)需通過運(yùn)放進(jìn)行放大,主要目的是為了提高其帶負(fù)載的能力。在用于測(cè)量較高阻抗的換能器的時(shí)候,用普通的運(yùn)放就可以了,比如NE5534、NE5532、AD818都可以。如果涉及測(cè)量較低阻抗的換能器,就需要使用功率較大的運(yùn)放,即可以輸出較大電流的運(yùn)放,如National Semiconductor公司的LM3875、LM3886等等。在使用LM3875、LM3886的時(shí)候,其閉環(huán)放大倍數(shù)必須大于10,系統(tǒng)才能夠穩(wěn)定。
這里只能通過增強(qiáng)運(yùn)放的帶負(fù)載能力、而不能通過增大支路串聯(lián)電阻的方法來避免運(yùn)放過載,其原理如下如果將串聯(lián)電阻加大,可以避免運(yùn)放過載,但是在很多情況下,會(huì)導(dǎo)致測(cè)量的誤差非常大,甚至出現(xiàn)無法檢測(cè)出頻率變化時(shí)的導(dǎo)納變化情況。
2)運(yùn)算和數(shù)據(jù)采集電路由于壓電陶瓷換能器的等效電路中含有電容和電感,因此在不同正弦信號(hào)的激勵(lì)下,會(huì)呈現(xiàn)出不同的導(dǎo)納特性。為了能夠檢測(cè)到其導(dǎo)納特性,需要將電路中體現(xiàn)出其導(dǎo)納特性的因素通過運(yùn)算電路轉(zhuǎn)換成可檢測(cè)到的電壓量,然后通過A/D變換電路采集獲得。運(yùn)算電路分為兩部分峰值檢測(cè)電路和相位檢測(cè)電路。峰值檢測(cè)電路用于檢測(cè)動(dòng)態(tài)變化的正弦信號(hào)的峰值電壓。相位檢測(cè)電路用于檢測(cè)兩路正弦波的相位差值,相位差在-90°~+90°的范圍內(nèi)變化,需要將其轉(zhuǎn)化為0~5V的電壓量。轉(zhuǎn)換成電壓量之后,就可以通過12位的A/D變換器采集獲得。運(yùn)算電路請(qǐng)參考圖3。
ux與uy的相位差用高精度模擬乘法器檢測(cè)。模擬乘法器的輸出為 用低通濾波器將上式中的二倍頻項(xiàng)濾去,即可得 于是可以得到 ,由于ux、uy的峰值UXM、UYM可用峰值檢波器求得(峰值檢波電路請(qǐng)參考圖4),據(jù)上式就可以得到相位差的余弦。
在實(shí)際電路設(shè)計(jì)中,采用美國Analog Device公司的集成四象限模擬乘法器AD633、AD534、AD734或者Texas Instrument公司的MPY634均可以實(shí)現(xiàn)求相位差的功能。
峰值檢波電路如圖4所示,電路中需要用到兩個(gè)運(yùn)放,第一個(gè)運(yùn)放IC1必須是高速運(yùn)放,要求增益帶寬積大于50M、電壓擺率大于500V/μs。AnalogDevice公司的AD818或者National Semiconductor公司的LM6171、LM6161均可以滿足要求。運(yùn)放IC2采用低速運(yùn)放即可,普通的National Semiconductor公司的LF411就可以滿足要求。D1、D2為快恢復(fù)二極管,可以選用1N4148或者肖特基二極管。C2和R2確定峰值電壓的保持時(shí)間,C1可以取0.1μF,R2可以取10MΩ。R1可以取2KΩ,C1和R3用于調(diào)整精度,可根據(jù)實(shí)際電路調(diào)節(jié)其大小。
A/D變換器可以選擇Texas Instrument公司的TLC2543,或者M(jìn)axim公司的MAX147。它們通過SPI總線和處理器連接,能較好地滿足本系統(tǒng)中的數(shù)據(jù)采集工作。TLC2543可以用MAXIM的REF02作為電壓基準(zhǔn)源,REF02其輸出為+5V,穩(wěn)定穩(wěn)定性為3ppm/℃。
3)通信電路電路中由單片機(jī)(下位機(jī))負(fù)責(zé)與PC(上位機(jī))的通信。通過計(jì)算機(jī)軟件向下位機(jī)發(fā)送指令,單片機(jī)執(zhí)行指令后,將采集到的電壓量發(fā)送給上位機(jī)。在工作的過程中,上位機(jī)發(fā)送頻率命令給下位機(jī),下位機(jī)控制產(chǎn)生相應(yīng)的頻率信號(hào),同時(shí)將這個(gè)頻率下的、用來表征壓電陶瓷換能器導(dǎo)納特性的三路電壓量采集并反饋給上位機(jī)。系統(tǒng)采用美國ATMEL公司的AT89C51作為下位機(jī),通過AT89C51的串行口和上位機(jī)通信。由于計(jì)算機(jī)串行口用的是RS232電平,而AT89C51則是CMOS電平,中間需要用美國MAXIM公司的MAX232實(shí)現(xiàn)其電平轉(zhuǎn)換功能。MAX232只需要+5V單電源工作,使用方便。
下位機(jī)和上位機(jī)的波特率必須一致才能夠通信,由于數(shù)據(jù)量不大,因此采用典型傳輸速率9600bps就可以。AT89C51的波特率通過其內(nèi)部的定時(shí)器設(shè)定,其外部晶振頻率使用11.0592MHz(9600的整數(shù)倍),設(shè)置寄存器TH1=0xFD就可以設(shè)置波特率為9600bps。
3.軟件設(shè)計(jì)本發(fā)明的軟件部分由Microsoft Visual C++6.0編寫。在window2000或更高的版本上運(yùn)行。軟件按功能可以分為三部分1)數(shù)據(jù)通信功能將操作者的命令發(fā)送給下位機(jī),同時(shí)從下位機(jī)接受反饋回來的數(shù)據(jù)。命令通過計(jì)算機(jī)的串行口(COM1、COM2、COM3、COM4)發(fā)送給下位機(jī)。在Visual C++中,通過Windows API函數(shù)完成與下位機(jī)的通信。其主要所用的函數(shù)介紹如下CreateFile打開串行口 SetCommState設(shè)置串口波特率PurgeComm清空串行口的緩沖區(qū) WriteFile 向下位機(jī)發(fā)送數(shù)據(jù)ReadFile從下位機(jī)接收數(shù)據(jù)。
上位機(jī)和下位機(jī)以主從方式工作,上位機(jī)發(fā)送命令,下位機(jī)反饋數(shù)據(jù)。上位機(jī)發(fā)送頻率命令,命令的結(jié)尾以“H”為標(biāo)志,當(dāng)下位機(jī)接收到“H”后,執(zhí)行命令,即輸出相應(yīng)頻率正弦信號(hào),然后等待0.5秒后,采集A/D變換的結(jié)果并發(fā)送給上位機(jī),其結(jié)果為12個(gè)字符的字符串,分別代表著三個(gè)電壓值(每四個(gè)字符代表一個(gè)電壓值)。所有的數(shù)據(jù)均以ASCII碼的形式傳輸,即把頻率和電壓均按位轉(zhuǎn)換成ASCII碼之后才發(fā)送出去。因此在上位機(jī)和下位機(jī)上,都有ASCII碼與二進(jìn)制碼之間進(jìn)行互相轉(zhuǎn)換的子程序。
2)用戶界面用戶可以在軟件上選擇支路串聯(lián)電阻的大小,以及掃描的起始頻率,掃描的終止頻率,掃描時(shí)的頻率步進(jìn)等等。用戶界面還包括圖形顯示窗口,數(shù)據(jù)保存和圖形打印輸出的人機(jī)操作接口,以及測(cè)量結(jié)果的顯示等等。用戶界面請(qǐng)參考圖5。
用戶首先選擇與設(shè)備相連接的計(jì)算機(jī)串行口號(hào),點(diǎn)擊 然后從鍵盤輸入輸出頻率掃描的起始頻率、終止頻率、頻率步進(jìn), 再點(diǎn)擊 系統(tǒng)即開始進(jìn)行掃描,并以每點(diǎn)0.6秒的速度,在左邊的G-B坐標(biāo)上,從原點(diǎn)開始,按順時(shí)針方向繪出所測(cè)量壓電陶瓷換能器的導(dǎo)納圓。同時(shí)在右邊的坐標(biāo)上作出G-F圖和B-F圖。(G導(dǎo)納實(shí)部,單位為ms;B導(dǎo)納虛部,單位為ms;F頻率,單位為Hz)。掃描過程中可以點(diǎn)擊“停止”來終止掃描。掃描過程中的頻率值、相位差、導(dǎo)納實(shí)部、導(dǎo)納虛部這些數(shù)據(jù)均在屏幕上實(shí)時(shí)顯示出來,并同時(shí)保存在一個(gè)類成員變量中。
掃描完畢后,用戶可以點(diǎn)擊屏幕坐標(biāo)系上的任一點(diǎn),程序自動(dòng)讀出并顯示所點(diǎn)擊處的坐標(biāo)值。
程序分析得出的參數(shù)結(jié)果顯示在屏幕的右上角。
3)數(shù)據(jù)處理功能包括作圖、數(shù)據(jù)分析、參數(shù)提取、打印輸出、數(shù)據(jù)保存等等功能。在檢測(cè)的過程中,實(shí)時(shí)地將數(shù)據(jù)在G-B坐標(biāo)和G-F、B-F坐標(biāo)上顯示出來,由于坐標(biāo)大小不能改變,因此程序會(huì)對(duì)所測(cè)數(shù)據(jù)作歸一化處理,即根據(jù)實(shí)測(cè)到的導(dǎo)納值自動(dòng)選取坐標(biāo)刻度。
當(dāng)所有的數(shù)據(jù)檢測(cè)完畢后,通過尋優(yōu)算法將所獲得的圖形擬合成一個(gè)規(guī)則的圓,然后就可以分析出壓電陶瓷換能器的參數(shù)。作圖完畢之后,軟件會(huì)根據(jù)有關(guān)壓電陶瓷換能器導(dǎo)納圓的理論,計(jì)算出換能器的各項(xiàng)參數(shù),例如共振點(diǎn)頻率、靜電容(C0)、動(dòng)態(tài)阻抗(R1、C1、L1)、機(jī)電耦合系數(shù)、等效頻寬、機(jī)械品質(zhì)因素Q等等。
本發(fā)明所述的技術(shù)方案針對(duì)壓電陶瓷換能器導(dǎo)納圓的檢測(cè)有很多優(yōu)勢(shì)精度高、針對(duì)性強(qiáng),使用簡單、快捷;而且連接上筆記本式電腦就可以可以直接應(yīng)用于工業(yè)現(xiàn)場(chǎng)的檢測(cè);更重要的是和進(jìn)口儀器相比其成本非常低廉,具有很大的價(jià)格優(yōu)勢(shì)。
圖1(a)是壓電陶瓷換能器的符號(hào),圖1(b)是壓電陶瓷換能器共振頻率附近集總等效電路。C0為靜態(tài)電容,L1為動(dòng)態(tài)電感,C1為動(dòng)態(tài)電容,R1為動(dòng)態(tài)電阻。
圖2是檢測(cè)電路的基本原理示意圖。R為電源內(nèi)阻,uA為正弦信號(hào)源電壓,uB為支路串聯(lián)電阻電壓,RM為支路串聯(lián)電阻,L為壓電陶瓷換能器換能器,Us為正弦信號(hào)源。
圖3是信號(hào)運(yùn)算電路原理示意圖。其中uA為激勵(lì)電源電壓,uB為支路串聯(lián)電阻電壓,RM為支路串聯(lián)電阻;UAM為uA的峰值,UBM為uB的峰值,Uxm為uX的峰值,Uym為uy的峰值;Ka、Kb、Km、Ko為比例系數(shù);Uo為uxy放大Ko倍之后低通濾波后的電壓值。
圖4是正弦信號(hào)峰值檢波電路,用于檢測(cè)出正弦信號(hào)的正峰值電壓。其中IC1、IC2為運(yùn)算放大器。
圖5是程序的用戶界面,界面上面部分的左邊是用戶操作部分;界面上面部分的右邊是參數(shù)顯示部分;界面的下邊是圖形顯示部分。
圖6是電路的原理圖,有關(guān)電路技術(shù)方案的具體細(xì)節(jié)都體現(xiàn)在圖中。
圖7是電路的PCB圖(印刷電路圖),圖上的元件符號(hào)與圖6的原理圖一致。
圖8是根據(jù)本技術(shù)方案設(shè)計(jì)的樣機(jī)對(duì)一個(gè)壓電陶瓷換能器的導(dǎo)納圓測(cè)量結(jié)果。
圖9是進(jìn)口儀器HP4192A對(duì)圖8中所測(cè)的換能器的測(cè)量結(jié)果。
方案的實(shí)施分為四個(gè)部分電路原理圖、電路PCB(印刷電路板)圖、單片機(jī)(下位機(jī))程序、PC機(jī)(上位機(jī))程序。
1.電路原理圖
原理圖請(qǐng)參考圖6,IC1為單片機(jī)AT89C51,IC2為AD7008AP20。AT89C51通過P0.0、P0.1、P0.2三個(gè)口控制AD7008 AP20。AD7008AP20為工業(yè)級(jí),外接晶振最大為20MHz,由于晶振直接影響到其輸出頻率的精度,因此要使用精度比較高的晶振,最好是恒溫晶振。
AD7008輸出的正弦信號(hào)的幅度由R1、R2、R3三個(gè)電阻決定,其滿幅度輸出電流的計(jì)算公式如下IOUTFULL-SCALE=6233×VREFR3]]>其中VREF=1.27V(內(nèi)部參考電壓)當(dāng)取RSET=390Ω、R1=R2=39.9Ω時(shí),其輸出信號(hào)的幅值約為1V。其輸出電壓經(jīng)過運(yùn)放差分(IC10/NE5534)放大之后,其輸出電壓幅值為5V。由于NE5534的內(nèi)阻較大,不能用于功率較大的輸出,如果需要較大功率,需要使用功率運(yùn)放,例如LM3886等。
IC17(NE5534)、IC12(LM6171)、IC13(LF411)用于測(cè)量uA的峰值;IC18(NE5534)、IC14(LM6171)、IC15(LF411)用于測(cè)量uB(uA、uB的定義請(qǐng)參考圖2或圖3)的峰值。R9、R34、R35和開關(guān)SW1、SW2用于調(diào)節(jié)換能器支路串聯(lián)電阻的大小。IC17、IC18為正向放大電路,其中IC17放大倍數(shù)Ka=1.5,IC18放大倍數(shù)Kb=2(Ka、Kb的定義請(qǐng)參考圖3)。
IC3為四象限模擬乘法器AD633,其輸出對(duì)輸入的運(yùn)算公式為W=(X1-X2)(Y1-Y2)10V+Z]]>這里X2=Y(jié)2=Z=0,Km=1/10。IC16(NE5534)為正向放大電路,其放大倍數(shù)Ko=5(Km、Ko的定義請(qǐng)參考圖3)。放大后的電壓經(jīng)過低通濾波后得到直流分量,采用RC濾波方式,時(shí)間常數(shù)取0.01秒(R=100Ω、C=100μF)。
根據(jù)圖3,Uxm,Uym,Uo三部分電壓經(jīng)過A/D變換器TLC2543采集進(jìn)來,換能器的阻抗或?qū)Ъ{的計(jì)算公式如下(其中R10=3K、R11=2K)UAMUBM=UxmUym·KbKa·R10+R11R11=UxmUym·103]]> 將上式 和Cos代入到下面兩式中,就可以得到換能器在當(dāng)前頻率下阻抗的實(shí)部和虛部 (RM為換能器支路串聯(lián)電阻值,對(duì)應(yīng)圖6中R9、R34、R35) 將R值和X值代入到下式中,就可得到換能器在當(dāng)前頻率下導(dǎo)納的實(shí)部G和虛部BY=1Z=RR2+X2+jXR2+X2=G+jB]]>串行通信中用MAX232作RS-232電平與CMOS電平之間的轉(zhuǎn)換,串行通信只需要三條線和PC的九針串口連接就可以進(jìn)行全雙工通信,分別是TXD、RXD、GND。
電路板的電源由變壓器提供,因?yàn)樾枰袃陕冯娫?,分別提供正電壓和負(fù)電壓,因此選用帶中間抽頭的雙15V變壓器,變壓器的輸出端經(jīng)過1A600V的整流橋堆后變成直流,然后用1000μF/50V的電容濾波,出來的電壓再經(jīng)過三端穩(wěn)壓器7815、7915、7805之后就可以給芯片供電。
系統(tǒng)中涉及到模擬放大電路的,其相關(guān)電阻都需要使用精密電阻,才可以保證放大的倍數(shù)是準(zhǔn)確的。系統(tǒng)中需要用0.1%精度的電阻有R5、R6、R7、R8、R9、R10、R11、R13、R14、R16、R17、R31、R32、R34、R35;系統(tǒng)中需要用0.5%精度的精密電阻有R1、R2、R3。
2.電路印刷電路圖(PCB圖)PCB圖請(qǐng)參考圖7,其中深色的線條為頂層走線(TopLayer),淺色的線條為底層走線(BottomLayer)。除了AD7008外所有的芯片均采用雙列直插式封裝。AD7008為PLCC44封裝,為了便于調(diào)試,采用了PLCC插座。
PCB圖分為三個(gè)部分,最上面為電源部分,包括三個(gè)三端穩(wěn)壓器和一個(gè)整流橋堆及相關(guān)的濾波電容,所有的三端穩(wěn)壓器都需要加散熱片。電源部分下面的左邊是數(shù)字電路部分,右邊是模擬電路部分,PCB圖設(shè)計(jì)采用了數(shù)字模擬分區(qū)布線的方式,其中AD7008和TLC2543既涉及到模擬電路,又涉及到數(shù)字電路,因此將它們放置在模擬部分和數(shù)字部分的交界處,這樣做可以盡可能地減少干擾。由于電路中既有模擬電路,也有數(shù)字電路,為提高抗干擾能力,需要避免數(shù)字回路和模擬回路的疊加。
3.單片機(jī)程序AT89C51使用8051內(nèi)核,并在此基礎(chǔ)上擴(kuò)展了FLASH程序存貯器。程序用Franklin C51編譯,其主程序如下,注釋請(qǐng)參考程序右邊
<pre listing-type="program-listing">#include″reg51.h″/*編譯器提供的寄存器定義頭文件*/unsigned char recieve;unsigned char buffer[8];unsigned char buffer_pointer=0;char send_buffer[12];unsigned char send_buf_pointer=0;unsigned long ad7008_reg;#include″delay.h″#include″ad70082.h″ /*和AD7008操作相關(guān)的頭文件*/#include″ad.h″ /*和TLC2543操作相關(guān)的頭文件*/#include″math.h″bit flag1=0;unsigned long freq=0;unsigned int ad_channel1;unsigned int ad_channel2;unsigned int ad_channel3;sbit red_led=P0^5;void delay_time(unsigned int n); /*延時(shí)子程序*/void convert_char_to_freq();/*將表示頻率的ASCII碼轉(zhuǎn)換成二進(jìn)制數(shù)的子程序*/void convert_ad_result_to_char(); /*將AD變換的二進(jìn)制結(jié)果轉(zhuǎn)換成ASCII碼的子程序*/void main() /*主程序*/{int s;red_led=0;SCON=0x50; /*方式1,允許接受*/TMOD=0x20;/*定時(shí)器1定時(shí)方式,方式2(具有自動(dòng)再裝入的8位定時(shí)器*/TH1=0xFD;ET1=0; /*定時(shí)器1溢出中斷禁止*/TR1=1;/*啟動(dòng)定時(shí)器*/ES=1;/*串行口中斷允許*/EA=1; /*總允許中斷*/AD_CS=1;while(1){if(flag1){ flag1=0; convert_char_to_freq(); /*將接收的的頻率字符串轉(zhuǎn)換成二進(jìn)制數(shù)*/ output_ad7008(freq); /*輸出頻率*/ delay_time(50); /*延時(shí)0.5秒*/ ad_channel1=0; tlc2543(); for(s=0;s<3;s++){ /*采集第一路電壓量*/ delay_time(3); ad_out_byte=0; tlc2543(); ad_channel1+=ad_result;}<dp n="d10"/>ad_channel1/=3; /*變換三次求平均值*/ad_channel2=0;ad_out_byte=0x10;tlc2543();for(s=0;s<3;s++){ /*采集第二路電壓量*/ delay_time(3); ad_out_byte=0x10; tlc2543(); ad_channel2+=ad_result; } ad_channel2/=3; /*變換三次求平均值*/ ad_channel3=0; ad_out_byte=0x20; tlc2543(); for(s=0;s<3;s++){ /*采集第三路電壓量*/ delay_time(3); ad_out_byte=0x20; tlc2543(); ad_channel3+=ad_result; } ad_channel3/=3; /*變換三次求平均值*/ convert_ad_result_to_char();/*將AD變化后的二進(jìn)制數(shù)轉(zhuǎn)換成ASCII碼字符串*/ SBUF=send_buffer[send_buf_pointer++];/*向上位機(jī)發(fā)送AD變換后的數(shù)據(jù)*/ } }}void serial(void)interrupt 4 /*串行口接收與發(fā)送數(shù)據(jù)子程序*/{ if(TI){TI=0;if(send_buf_pointer<12)SBUF=send_buffer[send_buf_pointer++];/*發(fā)送12位字符串?dāng)?shù)據(jù)*/return; } if(RI){ RI=0; recieve=SBUF; /*接受頻率控制字*/ if(recieve?。健銱′)buffer[buffer_pointer++]=recieve;/*字符串以‘H’結(jié)束*/ elseflag1=l; return;}}void delay_time(unsigned int n) /*延時(shí)子程序,延時(shí)0.01×n秒*/{unsigned int i;unsigned int s=711*n;for(i=0;i<s;i++){}<dp n="d11"/>}void convert_char_to_freq()/*將表示頻率的ASC碼轉(zhuǎn)換成二進(jìn)制數(shù)的子程序*/{inti;freq=0;for(i=buffer_pointer-1;i>=0;i--){ freq+=((buffer[i]-48)*pow(10,buffer_pointer-1-i));}buffer_pointer=0;}void convert_ad_result_to_char() /*將AD變換的二進(jìn)制結(jié)果轉(zhuǎn)換成ASCII碼的子程序*/{send_buf_pointer=0;send_buffer
=ad_channel1/1000+48;/*第一路電壓量轉(zhuǎn)換*/send_buffer[1]=(ad_channel1%1000)/100+48;send_buffer[2]=(ad_channel1%100)/10+48;send_buffer[3]=ad_channel1%10+48;send_buffer[4]=ad_channel2/1000+48;/*第二路電壓量轉(zhuǎn)換*/send_buffer[5]=(ad_channel2%1000)/100+48;send_buffer[6]=(ad_channel2%100)/10+48; send_buffer[7]=ad_channel2%10+48;send buffer[8]=ad_channel3/1000+48;/*第三路電壓量轉(zhuǎn)換*/send_buffer[9]=(ad_channel3%1000)/100+48;send_buffer[10]=(ad_channel3%100)/10+48;send_buffer[11]=ad_channel3%10+48;}</pre>4.上位機(jī)程序系統(tǒng)上位機(jī)程序編譯環(huán)境為Microsoft Visual C++6.0。程序在MFC的Dialog結(jié)構(gòu)框架下編寫。由于MFC自動(dòng)生成的文件比較多,因此只介紹程序的核心部分,程序注釋請(qǐng)參考程序右邊“/* */”內(nèi)文字。
打開串口的程序如下(串口設(shè)置為9600bps、8位數(shù)據(jù)、1位停止位、無校驗(yàn)位)<pre listing-type="program-listing">void CSerialDlg∷OnOpenSerialPort(){//TODOAdd your control notification handler code hereCSerialDlg∷UpdateData(1);switch(m_port_com_select){/*串口打開程序*/case 0hCom=CreateFile(″COM1″,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,F(xiàn)ILE_ATTRIBUTE_NORMAL,NULL);if(hCom=INVALID_HANDLE_VALUE)MessageBox(″串口1打開錯(cuò)誤!″);else m_is_serial_port_open=1;break;case1hCom=CreateFile(″COM2″,GENERIC_READ|GENERIC_WRITE, 0,NULL,OPEN_EXISTING,F(xiàn)ILE_ATTRIBUTE_NORMAL,NULL);<dp n="d12"/>if(hCom=INVALID_HANDLE_VALUE)MessageBox(″串口2打開錯(cuò)誤!″);else m_is_serial_port_open=1;break;case2hCom=CreateFile(″COM3″,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,F(xiàn)ILE_ATTRIBUTE_NORMAL,NULL);if(hCom=INVALID_HANDLE_VALUE)MessageBox(″串口3打開錯(cuò)誤!″);else m_is_serial_port_open=1;break;case 3hCom=CreateFile(″COM4″,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTINGFILE_ATTRIBUTE_NORMAL,NULL);if(hCom=INVALID_HANDLE_VALUE)MessageBox(″串口4打開錯(cuò)誤!″);else m_is_serial_port_open=1;break;}DCB dcb; /*以下均為串口設(shè)置程序*/BOOL m_error;m_error=GetCommState(hCom,&amp;dcb);if(!m_error)MessageBox(″Get Comm State Error!″);dcb.BaudRate=CBR_9600;dcb.ByteSize=8;dcb.Parit=NOPARITY;dcb.StopBits=ONESTOPBIT;m_error=SetCommState(hCom,&amp;dcb);if(!m_error)MessageBox(″Set Comm State Error!″);m_error=SetCommMask(hCom,EV_RXCHAR|EV_TXEMPTY);if(!m_error)MessageBox(″Set Comm Mask Error!″);m_error=SetupComm(hCom,0,0);if(!m_error)MessageBox(″Setup Comm Error!″);m_error=PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);if(!m_error)MessageBox(″Purge Comm Error!″);COMMTIMEOUTS m_com_time;m_com_time.ReadIntervalTimeout=1000;m_com_time.ReadTotalTimeoutConstant=0;m_com_time.ReadTotalTimeoutMultiplier=0;m_com_time.WriteTotalTimeoutConstant=2;m_com_time.WriteTotalTimeoutMultiplier=25;m_error=SetCommTimeouts(hCom,&amp;m_com_time);if(!m_error)MessageBox(″Set Comm Timeouts Error!″);}</pre> 按鈕的工作程序如下<pre listing-type="program-listing">void CSerialDlg∷OnStartWork(){//TODOAdd your control notification handler code hereCSerialDlg∷UpdateData(1);/*從人機(jī)界面獲取輸入值*/<dp n="d13"/>if(m_is_serial_port_open=0){MessageBox(″目前沒有可用的串口,請(qǐng)打開一個(gè)串口!″);return;}if(m_ceramic_select?。?&amp;&amp;m_ceramic_select?。?){MessageBox(″請(qǐng)選擇測(cè)量儀器檔位!″);return;}if(m_frequency_start=″″){MessageBox(″請(qǐng)?jiān)O(shè)定起始頻率!″);return;}if(m_frequency_end==″″){MessageBox(″請(qǐng)?jiān)O(shè)定終止頻率!″);return;}if(m_frequency_grads=0){MessageBox(″請(qǐng)選擇頻率步距!″);return;}if(m_ceramic_select=0){/*確定坐標(biāo)系刻度*/switch(m_coordinate_scale){case 0m_gain_value=100; break;case 1m_gain_value=50;break;case 2m_gain_value=20;break;}}if(m_ceramic_select=1){switch(m_coordinate_scale){case 0m_gain_value=10;break;case 1m_gain_value=5; break;case 2m_gain_value=2; break;}}m_output_frequency=m_frequency_start;int length;int i;length=m_frequency_start.GetLength();m_output_freq_low_long=0;for(i=0;i<length;i++){ /*將頻率的ASCII碼轉(zhuǎn)換成二進(jìn)制數(shù)*/m_output_freq_low_long+=(m_frequency_start[i]-48)*pow(10,length-1-i);}m_frequency_start_long=m_output_freq_low_long;length=m_frequency_end.GetLength();m_output_freq_high_long=0;for(i=0;i<length;i++){m_output_freq_high_long+=(m_frequency_end[i]-48) *pow(10,length-1-i);}m_last_cos_fi=0; /*一些量的初始化*/m_cos_fi=0;m_flag1=1; /*標(biāo)識(shí)導(dǎo)納虛部的符號(hào)變化*/m_max_cos_fi=0;m_data_pointer=0;m_frequency_add_times=0;CSerialDlg∷OnClearScreen();pain_pic();CDC*pdc;pdc=GetDlgItem(IDC_GRAPH)->GetDC();<dp n="d14"/>pdc->TextOut(302,134,m_frequency_start);/*在坐標(biāo)上顯示頻率起始和終止值*/pdc->TextOut(660,134,m_frequency_end);float ss=(m_output_freq_high_long-m_output_freq_low_long) /m_ frequency_grads;m_x_axis_nterval=400/ss;SetTimer(ID_CLOCK_TIMER,600,NULL);/*設(shè)定程序開始掃描的定時(shí)器*/}</pre>程序進(jìn)行頻率掃描繪圖的工作程序如下(程序掃描的時(shí)間間隔由定時(shí)器產(chǎn)生)<pre listing-type="program-listing">void CSerialDlg∷OnTimer(UINT nIDEvent){//TODOAdd your message handler code here and/or call defaultif(nIDEvent=ID_INIT_TIMER){/*有關(guān)程序啟動(dòng)畫面的,與掃描無關(guān)*/ KillTimer(ID_INIT_TIMER); m_init_dlg.EndDialog(1); return;}char lpBuffer[20];int i;DWORD lpNumberOfBytesRead;DWORD dwbyteswritten;for(i=0;i<10;i++)lpBuffer[i]=0;unsigned int m_number;CString send=m_output_frequency;m_frequency_now=m_output_frequency;CString end(″H″);int length=m_output_frequency.GetLength();PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);/*清空串口緩沖區(qū)*/WriteFile(hCom,send,length,&amp;dwbyteswritten,NULL);/*向串口發(fā)送頻率控制字*/WriteFile(hCom,end,1,&amp;dwbyteswritten,NULL);/*向串口發(fā)送頻率控制字結(jié)束字符*/ReadFile(hCom,&amp;lpBuffer,12,&amp;lpNumberOfBytesRead,NULL);/*讀取串口數(shù)據(jù)*/PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);/*清空串口緩沖區(qū)*/m_number=(lpBuffer
-48)*1000+(lpBuffer[1]-48)*100+ /*計(jì)算三路電壓值*/(lpBuffer[2]-48)*10+(lpBuffer[3]-48);m_voltage1=((float)m_number/4095)*5.003;m_number=(lpBuffer[4]-48)*1000+(lpBuffer[5]-48)*100+(lpBuffer[6]-48)*10+(lpBuffer[7]-48);m_voltage2=((float)m_number/4095)*5.003;m_number=(lpBuffer[8]-48)*1000+(lpBuffer[9]-48)*100+(lpBuffer[10]-48)*10+(lpBuffer[11]-48);m_voltage3=((float)m_number/4095)*5.003;if(m_ceramic_select=0){ /*計(jì)算100歐姆支路電阻的阻抗值和導(dǎo)納值*/m_last_cos_fi=m_cos_fi;m_cos_fi=4*m_voltage1/(m_voltage2*m_voltage3);m_uam_ubm=(m_voltage3*10)/(3*m_voltage2);if(m_cos_fi>1)m_cos_fi=1;m_R=100*(m_uam_ubm*m_cos_fi-1);m_X=100*m_uam_ubm*sqrt(1-(m_cos_fi*m_cos_fi));<dp n="d15"/>m_G=1000*m R/(m_R*m_R+m_X*m_X);m_B=1000*m_X/(m_R*m_R+m_X*m_X);} else{m_last_cos_fi=m_cos_fi;/*計(jì)算150歐姆支路電阻的阻抗值和導(dǎo)納值*/m_cos_fi=4*m_voltage1/(m_voltage2*m_voltage3);m_uam_ubm=(m_voltage3*10)/(9*m_voltage2);/*計(jì)算公式與100歐姆有些區(qū)別*/if(m_cos_fi>1)m_cos_fi=1;m_R=150*(m_uam_ubm*m_cos_fi-1);m_X=150*m_uam_ubm*sqrt(1-(m_cos_fi*m_cos_fi));m_G=1000*m_R/(m_R*m_R+m_X*m_X);m_B=1000*m_X/(m_R*m_R+m_X*m_X);}if(m_cos_fi>m_max_cos_fi){m_max_cos_fi=m_cos_fi;m_syntonic_b=m_B;m_syntonic_g=m_G;m_syntonic_r=m_R;m_syntonic_x=m_X;m_syntonic_freq=m_frequency_now;}if(m_flag1){ /*確定導(dǎo)納虛部的符號(hào)*/if(m_cos_fi<m_last_cos_fi&amp;&amp;m_cos_fi>=0.9){m_B=-m_B;m_flag1=0;}}else m_B=-m_B;m_data[m_data_pointer].m_frequency=m_utput_frequency; /*將數(shù)據(jù)存到數(shù)據(jù)類成員變量中*/m_data[m_data_pointer].m_voltage1=m_voltage1;m_data[m_data_pointer].m_voltage2=m_voltage2;m_data[m_data_pointer].m_voltage3=m_voltage3;m_data[m_data_pointer].m_cos_fi=m_cos_fi;m_data[m_data_pointer].m_uam_ubm=m_uam_ubm;m_data[m_data_pointer].m_R=m_R;m_data[m_data_pointer].m_X=m_X;m_data[m_data_pointer].m_G=m_G;m_data[m_data_pointer].m_B=m_B;m_data_pointer++;CDC*pdc;pdc=GetDlgItem(IDC_GRAPH)->GetDC();/*以下均為繪圖程序*/if(m_ceramic_select==0){pdc->SetPixel((int)(m_gain_value*m_G+10)-1,(int)(130-m_gain_value*m_B)+1,RGB(255,0,255));pdc->SetPixel((int)(m_gain_value*m_G+10)-1,(int)(130-m_gain_value*m_B),RGB(255,0,255));pdc->SetPixel((int)(m_gain_value*m_G+10)-1,(int)(130-m_gain_value*m_B)-1,RGB(255,0,255));pdc->SetPixel((int)(m_gain_value*m_G+10),(int)(130-m_gain_value*m_B)+1,RGB(255,0,255));pdc->SetPixel((int)(m_gain_value*m_G+10),(int)(130-m_gain_value*m_B),RGB(255,0,255));pdc->SetPixel((int)(m_gain_value*m_G+10),(int)(130-m_gain_value*m_B)-1,RGB(255,0,255));pdc->SetPixel((int)(m_gain_value*m_G+10)+1,(int)(130-m_gain_value*m_B)+1,RGB(255,0,255));<dp n="d16"/>pdc->SetPixel((int)(m_gain_value*m_G+10)+1,(int)(130-m_gain_value*m_B),RGB(255,0,25<br/>5));pdc->SetPixel((int)(m_gain_value*m_G+10)+1,(int)(130-m_gain_value* m_B)-1,RGB(255,0,2<br/>55));pdc->SetPixel((int)(300+m_x_axis_interval*m_frequency_add_times)-1,(int)(130-m_gain_value*m_G/2)-1,RGB(255,0,0));pdc->SetPixel((int)(300+m_x_axis_interval*m_frequency_add_times)-1,(int)(130-m_gain_va1ue*m_G/2),RGB(255,0,0));pdc->SetPixel((int)(300+m_x_axis_interval*m_frequency_add_times)-l,(int)(130-m_gain_value*m_G/2)+1,RGB(255,0,0));pdc->SetPixel((int)(300+m_x_axis_interval*m_frequency_add_times),(int)(130-m_gain_value*m_G/2)-1,RGB(255,0,0));pdc->SetPixel((int)(300+m_x_axis_interval*m_frequency_add_times),(int)(130-m_gain_value*m_G/2),RGB(255,0,0));pdc->SetPixel((int)(300+m_x_axis_interval*m_frequency_add_times),(int)(130-m_gain_value*m_G/2)+1,RGB(255,0,0));pdc->SetPixel((int)(300+m_x_axis_interval*m_frequency_add_times)+1,(int)(130-m_gain_value*m_G/2)-1,RGB(255,0,0));pdc->SetPixel((int)(300+m_x_axis_interval*m_frequency_add_times)+l,(int)(130-m_gain_value*m_G/2),RGB(255,0,0));pdc->SetPixel((int)(300+m_x_axis_interval*m_frequency_add_times)+1,(int)(130-m_gain_value*m_G/2)+1,RGB(255,0,0));pdc->SetPixel((int)(300+m_x_axis_interval*m_frequency_add_times)-1,(int)(130-m_gain_value*m_B/2)-1,RGB(0,0,255));pdc->SetPixel((int)(300+m_x_axis_interval*m_frequency_add_times)-1,(int)(130-m_gain_value*m_B/2),RGB(0,0,255));pdc->SetPixel((int)(300+m_x_axis_interval*m_frequency_add_times)-1,(int)(130-m_gain_value*m_B/2)+1,RGB(0,0,255));pdc->SetPixel((int)(300+m_x_axis_interval*m_frequency_add_times),(int)(130-m_gain_value*m_B/2)-1,RGB(0,0,255));pdc->SetPixel((int)(300+m_x_axis_interval*m_frequency_add_times),(int)(130-m_gain_value*m_B/2),RGB(0,0,255));pdc->SetPixel((int)(300+m_x_axis_interval*m_frequency_add_times),(int)(130-m_gain_value*m_B/2)+1,RGB(0,0,255));pdc->SetPixel((int)(300+m_x_axis_interval*m_frequency_add_times)+1,(int)(130-m_gain_value*m_B/2)-1,RGB(0,0,255));pdc->SetPixel((int)(300+m_x_axis_interval*m_frequency_add_times)+1,(int)(130-m_gain_value*m_B/2),RGB(0,0,255));pdc->SetPixel((int)(300+m_x_axis_interval*m_frequency_add_times)+1,(int)(130-m_gain_value*m_B/2)+1,RGB(0,0,255));}else{pdc->SetPixel((int)(m_gain_value*m_G+10)-1,(int)(130-m_gain_value*m_B)+1,RGB(255,0,255));pdc->SetPixel((int)(m_gain_value*m_G+10)-1,(int)(130-m_gain_value*m_B),RGB(255,0,255));pdc->SetPixel((int)(m_gain_value*m_G+10)-1,(int)(130-m_gain_value*m_B)-1,RGB(255,0,255));pdc->SetPixel((int)(m_gain_value*m_G+10),(int)(130-m_gain_value* m_B)+1,RGB(255,0,255));pdc->SetPixel((int)(m_gain_value*m_G+10),(int)(130-m_gain_value*m_B),RGB(255,0,255));pdc->SetPixel((int)(m_gain_value*m_G+10),(int)(130-m_gain_value*m_B)-1,RGB(255,0,255));pdc->SetPixel((int)(m_gain_value*m_G+10)+1,(int)(130-m_gain_value*m_B)+1,RGB(255,0,255));pdc->SetPixel((int)(m_gain_value*m_G+10)+1,(int)(130-m_gain_value*m_B),RGB(255,0,255));pdc->SetPixel((int)(m_gain_value*m_G+10)+1,(int)(130-m_gain_value*m_B)-1,RGB(255,0,255));pdc->SetPixel((int)(300+m_x_axis_interval*m_frequency_add_times)-1,(int)(130-m_gain_val<dp n="d17"/>ue*m_G/2)-1,RGB(255,0,0));pdc->SetPixel((int)(300+m_x_axis_interval*m_frequency_add_times)-1,(int)(130-m_gain_val<br/>ue*m_G/2),RGB(255,0,0));pdc->SetPixel((int)(300+m_x_axis_interval*m_frequency_add_timgs)-1,(int)(130-m_gain_val<br/>ue*m_G/2)+1,RGB(255,0,0));pdc->SetPixel((int)(300+m_x_axis_interval*m_frequency_add_times),(int)(130-m_gain_value<br/>*m_G/2)-1,RGB(255,0,0));pdc->SetPixel((int)(300+m_x_axis_interval*m_fequency_add_times),(int)(130-m_gain_value*m_G/2),RGB(255,0,0));pdc->SetPixel((int)(300+m_x_axis_interval*m_fequency_add_times),(int)(130-m_gain_value*m_G/2)+1,RGB(255,0,0));pdc->SetPixel((int)(300+m_x_axis_interval*m_frequency_add_times)+1,(int)(130-m_gain_value*m_G/2)-1,RGB(255,0,0));pdc->SetPixel((int)(300+m_x_axis_interval*m_frequency_add_times)+1,(int)(130-m_gain_value*m_G/2),RGB(255,0,0));pdc->SetPixel((int)(300+m_x_axis_interval*m_frequency_add_times)+1,(int)(130-m_gain_value*m_G/2)+1,RGB(255,0,0));pdc->SetPixel((int)(300+m_x_axis_interval*m_frequency_add_times)-1,(int)(130-m_gain_value*m_B/2)-1,RGB(0,0,255));pdc->SetPixel((int)(300+m_x_axis_interval*m_frequency_add_times)-1,(int)(130-m_gain_value*m_B/2),RGB(0,0,255));pdc->SetPixel((int)(300+m_x_axis_interval*m_frequency_add_times)-1,(int)(130-m_gain_alue*m_B/2)+1,RGB(0,0,255));pdc->SetPixel((int)(300+m_x_axis_interval*m_fequency_add_times),(int)(130-m_gain_value*m_B/2)-1,RGB(0,0,255));pdc->SetPixel((int)(300+m_x_axis_interval*m_fequency_add_times),(int)(130-m_gain_value*m_B/2),RGB(0,0,255));pdc->SetPixel((int)(300+m_x_axis_interval*m_frequency_add_times),(int)(130-m_gain_value*m_B/2)+1,RGB(0,0,255));pdc->SetPixel((int)(300+m_x_axis_interval*m_frequency_add_times)+1,(int)(130-m_gain_value*m_B/2)-1,RGB(0,0,255));pdc->SetPixel((int)(300+m_x_axis_interval*m_frequency_add_times)+1,(int)(130-m_gain_value*m_B/2),RGB(0,0,255));pdc->SetPixel((int)(300+m_x_axis_interval*m_frequency_add_times)+1,(int)(130-m_gain_value*m_B/2)+1,RGB(0,0,255));} /*繪圖程序到此為止*/CSerialDlg∷UpdateData(0);m_output_freq_low_ong+=m_frequency_grads;m_frequency_add_times++;if(m_output_feq_low_long>m_output_freq_high_long)KillTimer(ID_CLOCK_TIMER);/*判斷掃描是否結(jié)束*/char cc[6];for(i=0;i<8;i++)cc[i]=0; /*計(jì)算下次掃描過程中的下一個(gè)點(diǎn)的頻率*/cc
=m_output_freq_low_long/100000+48;cc[1]=m_output_freq_low_long%100000/10000+48;cc[2]=m_output_freq_low_long%10000/1000+48;cc[3]=m_output_freq_low_long%1000/100+48;cc[4]=m_output_freq_low_long%100/10+48;cc[5]=m_output_freq_low_long%10+48;while(cc
==′0′){for(i=1;i<6;i++){ cc[i-1]=cc[i];}cc[i-1]=0;}m_output_frequency=cc;CDialog∷OnTimer(nIDEvent);<dp n="d18"/>}</pre>程序中進(jìn)行數(shù)據(jù)保存的程序如下<pre listing-type="program-listing">void CSerialDlg∷OnSaveData(){//TODOAdd your control notification handler code hereCString path,name;CString save_data=″frequency(Hz)\tCos(fi)\tG(ms)\t\tB(ms)\t\tR(ohm)\t\tX(ohm)\n″;/*數(shù)據(jù)表格的類目*/CString tmp;if(m_data_pointer!=0){ /*將掃描中的所有數(shù)據(jù)存到字符串中*/for(inti=0;i<m_data_pointer;i++){ save_data+=m_data[i].m_frequency; save_data+=″\t\t″; tmp.Format(″%f″,m_data[i].m_cos_fi); save_data+=tmp; save_data+=″\t″; tmp.Format(″%f″,m_data[i].m_G); save_data+=tmp; save_data+=″\t″; tmp.Format(″%f″,m_data[i].m_B); save_data+=tmp; save_data+=″\t″; tmp.Format(″%f″,m_data[i].m_R); save_data+=tmp; save_data+=″\t″; tmp.Format(″%f″,m_data[i].m_X); save_data+=tmp; save_data+=″\n″;}}save_data+=″\n″;tmp=″Syntonic F(Hz) Cos(fi) G(ms) B(ms) R(ohm) X(ohm)\n″;/*諧振點(diǎn)數(shù)據(jù)的表格類目*/save_data+=tmp; /*以下為諧振點(diǎn)的數(shù)據(jù)*/save_data+=m_syntonic_freq;save_data+=″ \t″;tmp.Format(″%f″,m_max_cos_fi);save_data+=tmp;save_data+=″\t″;tmp.Format(″%f″,m_syntonic_g);save_data+=tmp;save_data+=″\t″;tmp.Format(″%f″,m_syntonic_b);save_data+=tmp;save_data+=″\t″;tmp.Format(″%f″,m_syntonic_r);save_data+=tmp;save_data+=″\t″;tmp.Format(″%f″,m_syntonic_x);<dp n="d19"/>save_data+=tmp;save_data+=″\n″;CFileDialog_dlg(true,″RTF″,NULL,OFN_OVERWRITEPROMPT,NULL,NULL);/*打開程序保存對(duì)話框,將數(shù)據(jù)保存到一個(gè)文件中*/if(dlg.DoModal()=IDOK){ path=dlg.GetPathName(); name=dlg.GetFileName(); FILE*FileHandlele=fopen(path.GetBuffer(0),″wb″); fwrite(save_data.GetBuffer(0),save_data.GetLength(),1,F(xiàn)ileHandle); fclose(FileHandle);}}</pre>將鼠標(biāo)點(diǎn)擊處的坐標(biāo)值顯示出來的子程序如下<pre listing-type="program-listing">void CSerialDlg∷OnMouseMove(UINT nFlags,CPoint point){//TODOAdd your message handler code here and/or call defaultif((nFlags&amp;MK_LBUTTON)=MK_LBUTTON){ if(m_ceramic_select==0){/*測(cè)量檔位1*/ if(point.x<303){/*鼠標(biāo)點(diǎn)擊處為坐標(biāo)左半部分*/ m_pointer_g=((float)point.x-13)/m_gain_value; m_pointer_b=(375-(float)point.y)/m_gain_value; m_pointer_f=0;}if(point.x>303){ /*鼠標(biāo)點(diǎn)擊處為坐標(biāo)右半部分*/ m_pointer_g=(375-(float)point.y)*2/m_gain_value; m_pointer_b=(375-(float)point.y)*2/m_gain_value; float_qq=(float)(m_frequency_grads*(point.x-303)) /m_x_axis_interval; m_pointer_f=(int)qq+m_frequency_start_long;}}else{if(point.x<303){/*測(cè)量檔位2,鼠標(biāo)點(diǎn)擊處為坐標(biāo)左半部分*/ m_pointer_g=((float)point.x-13)/m_gain_value; m_pointer_b=(375-(float)point.y)/m_gain_value;} if(point.x>303){/*鼠標(biāo)點(diǎn)擊處為坐標(biāo)右半部分*/ m_pointer_g=(375-(float)point.y)*2/m_gain_value; m_pointer_b=(375-(375-(float)point.y)*2/m_gain_value; float_pp=(float)(m_frequency_grads*(point.x-303))/m_x_axis_interval; m_pointer_f=(int)pp+m_frequency_start_long;}}CSerialDlg∷UpdateData(0);}}</pre>
權(quán)利要求
1.一種針對(duì)壓電陶瓷換能器的導(dǎo)納圓測(cè)量裝置;其特征在于將硬件和PC機(jī)軟件結(jié)合起來,由硬件部分完成換能器導(dǎo)納數(shù)據(jù)采集功能,由軟件部分完成繪圖與數(shù)據(jù)分析功能,兩部分通過計(jì)算機(jī)串行口互相通信。
2.如權(quán)利要求1所述的、壓電陶瓷換能器導(dǎo)納圓圖示儀中導(dǎo)納測(cè)量的基本原理;其特征在于將壓電陶瓷換能器與可變電阻串聯(lián),通過可變電阻上的電壓值取得支路電流值,從而根據(jù)以下導(dǎo)納計(jì)算公式推導(dǎo)出導(dǎo)納值。換能器阻抗Z=uA-uBuB/RM=RM|uAuB-1|]]>(uA為換能器與電阻RM串聯(lián)支路兩端電壓、uB為電阻RM兩端電壓)設(shè)uA=KAejwt,uB=KBej(ωt+)可得UAMUBM=KAKB]]>(UAM為uA的峰值、UBM為uB的峰值)則 式中 (R為阻抗的實(shí)部) (X為阻抗的虛部)換能器的導(dǎo)納Y為Y=1Z=RR2+X2+jXR2+X2=G+jB]]>(G為導(dǎo)納的實(shí)部、B為導(dǎo)納的虛部)
3.如權(quán)利要求1中所述的、壓電陶瓷換能器導(dǎo)納圓圖示儀中硬件部分的、頻率精確可控而且穩(wěn)定的正弦信號(hào)源的設(shè)計(jì);其特征在于以直接數(shù)字合成(DDS)技術(shù)為基礎(chǔ),以單片機(jī)做頻率控制,以功率運(yùn)放對(duì)信號(hào)進(jìn)行放大獲得所需信號(hào)源。
4.如權(quán)利要求1中所述的、壓電陶瓷換能器導(dǎo)納圓圖示儀中硬件部分的運(yùn)算電路的設(shè)計(jì);其特征在于通過檢測(cè)支路電壓和串聯(lián)電阻上的電壓的方式獲取換能器的導(dǎo)納數(shù)據(jù),通過模擬乘法器獲得兩路信號(hào)的相位差,以峰值檢波電路獲得其電壓的峰值。
5.如權(quán)利要求1中所述的、壓電陶瓷換能器導(dǎo)納圓圖示儀中軟件的程序用戶界面的設(shè)計(jì);其特征在于用戶在軟件上實(shí)現(xiàn)對(duì)硬件的控制,包括掃描頻率的起始值、終止值、頻率步進(jìn),導(dǎo)納圓顯示在屏幕下方,所得參數(shù)顯示在屏幕右上方,通過鼠標(biāo)點(diǎn)擊導(dǎo)納圓圖可獲得圖形上任意一點(diǎn)的坐標(biāo)值。
全文摘要
本發(fā)明是一種涉及物理學(xué)中聲學(xué)領(lǐng)域的、有關(guān)壓電陶瓷換能器導(dǎo)納圓測(cè)量的裝置。壓電陶瓷換能器是聲學(xué)領(lǐng)域內(nèi)產(chǎn)生和接收聲的一種裝置。在使用壓電陶瓷換能器之前需要測(cè)出其導(dǎo)納圓以獲得其主要參數(shù),才可以指導(dǎo)其應(yīng)用。本發(fā)明是針對(duì)壓電陶瓷換能器導(dǎo)納圓測(cè)定的、將硬件和PC機(jī)軟件分析結(jié)合起來的綜合性技術(shù)方案,此方案具有精度高、成本低、使用方便、針對(duì)性強(qiáng)的特點(diǎn)。其硬件部分主要完成導(dǎo)納圓數(shù)據(jù)采集功能,軟件部分主要完成數(shù)據(jù)分析功能,它們之間通過計(jì)算機(jī)串行口進(jìn)行通信。硬件部分主要由信號(hào)發(fā)生電路、運(yùn)算與采集電路、數(shù)據(jù)通信三部分電路構(gòu)成。軟件部分主要由數(shù)據(jù)通信、用戶界面、數(shù)據(jù)處理三部分構(gòu)成。
文檔編號(hào)H01L41/00GK1439884SQ0310512
公開日2003年9月3日 申請(qǐng)日期2003年3月5日 優(yōu)先權(quán)日2003年3月5日
發(fā)明者姚成剛 申請(qǐng)人:姚成剛