|
轉(zhuǎn)速計是日常生活中比較重要的計量儀表之一,在汽、電子、紡織、造紙等方面有廣泛的應(yīng)用。但是由于過去的技術(shù)比較落后轉(zhuǎn)速計一般都使用機械式或機電式的機構(gòu)。其結(jié)構(gòu)原理如下:

這樣的機構(gòu)雖然原理非常簡單,設(shè)計也比較方便,但其缺點也是顯而易見的。例如:
·機械接觸式設(shè)計會影響被測件的正常工作,低速運轉(zhuǎn)時會產(chǎn)生較大影響
·傳動式結(jié)構(gòu)使測量器件壽命變短,間接提高了產(chǎn)品價格,影響其市場占有率
·采用測速電機,增加了整個系統(tǒng)的成本降低了測量精度
·功率消耗大,無便攜性可言
可見,這樣的設(shè)計給市場推廣帶來了很大的阻礙,而且降低了測量精度。從而給很難占領(lǐng)市場。
相比之下本文介紹的智能轉(zhuǎn)速計避免了老式轉(zhuǎn)速計的以上缺點。采用光電測量的方法。
結(jié)構(gòu)框圖如下:
   
光電測量部分原理:
檢測齒輪上有10個齒均勻分布在輪盤周圍,并被直接固定在被測軸上,安裝時光電耦合器的發(fā)光二極管和光敏三極管正對齒輪上的齒,當(dāng)被測軸轉(zhuǎn)動時帶動檢測齒輪轉(zhuǎn)動,光電耦合器通過對檢測齒輪上的齒進行耦合從而產(chǎn)生數(shù)字脈沖。脈沖經(jīng)過放大送向單片機的計數(shù)端。
單片機部分工作原理:
本文采用的單片機為AT89C51,內(nèi)有兩個定時/計數(shù)器。在程序設(shè)計時筆者將T0定時/計數(shù)器作為1秒定時使用,將T1定時/計數(shù)器作對脈沖的計數(shù)器使用。單片機計數(shù)端在接收到脈沖后對脈沖進行計數(shù),每隔1秒提取TH1和TL1中的計數(shù)數(shù)據(jù),并進行相應(yīng)的運算,對16進制數(shù)據(jù)進行處理,得到10進制數(shù)據(jù),送顯示緩存進行顯示輸出。
在對TH1和TL1數(shù)據(jù)整合處理時使用到了C程序中的結(jié)構(gòu)和共用的概念
union
{ unsigned int word;
struct
{ unsigned char high;
unsigned char low;
} bytes;
} result;
…
result.bytes.high=TH1;
result.bytes.low=TL1;
counter=result.word;
這樣一來就可以把兩個無符號字符型變量數(shù)據(jù)按高低字節(jié)合并成一個整型變量來處理了。在本文中四位7段LED能夠顯示0~9999的數(shù)值,根據(jù)下文提供的計數(shù)值與轉(zhuǎn)速之間的關(guān)系可確定計數(shù)值范圍必須達到0~1667,很顯然這樣的數(shù)據(jù)通過字節(jié)來處理是非常不方便的,但如果通過上述方法轉(zhuǎn)化成整型變量來處理值域變?yōu)?/SPAN>0~65535,足以容納0~1667中的任何一個整型數(shù)值。
具體計數(shù)值與轉(zhuǎn)速之間的數(shù)學(xué)關(guān)系如下:
轉(zhuǎn)速(round/minute)=
并將轉(zhuǎn)速值通過動態(tài)掃描電路和程序顯示在4位7段LED數(shù)碼管上。
其優(yōu)點如下:
·采用單片機控制,精度高,穩(wěn)定性好,測量范圍大
·功率小,易于提高其便攜性能,突出產(chǎn)品優(yōu)勢
·產(chǎn)品成本低廉,整套系統(tǒng)價格不超過15元人民幣
·抗干擾能力強,可避免外界電磁干擾和其他干擾因素的影響
·非接觸式測量,采用光電器件測量,無連接軸,對被測件無任何影響,提高測量精度
·電子式測量方法縮小整個系統(tǒng)的體積,使便攜式產(chǎn)品的開發(fā)更具可操作性
·非機械式測量方法,采用電子器件,提高設(shè)備的壽命,間接降低成本
通過以上比較不難看出智能轉(zhuǎn)速計不管從成本上、精度上還是便攜性能上都比原有的機電式設(shè)備好得多。從市場開發(fā)的角度來看各方面都比較出色。
該產(chǎn)品通過改進還可以做成出租車?yán)锍逃、水文監(jiān)測以及氣象監(jiān)測的有關(guān)儀器儀表。 #include "reg51.h" #define uchar unsigned char #define uint unsigned int
uchar code disptab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar code bittab[]={0x01,0x02,0x04,0x08}; uchar data dispbuf[]={0,0,0,0};
void main(void) { void disp(); EA=1;ET0=1; TMOD=0x51; TH0=0x3c;TL0=0xb0; TR0=1;TR1=1; for(;;) { disp(); } }
void disp(void) { uchar i,deley; for(i=0;i<4;i++) {P1=bittab[i]; P2=disptab[dispbuf[i]]; for(deley=0;deley<200;deley++); } }
void timer(void) interrupt 1 using 1 { static uchar i; uint counter; union {uint word; struct {uchar high; uchar low; } byte; } result; TH0=0x3c;TL0=0xb0; i++; if(i==10) {result.byte.high=TH1; result.byte.low=TL1; counter=result.word; counter*=6; dispbuf[0]=counter%10; dispbuf[1]=counter%100/10; dispbuf[2]=counter%1000/100; dispbuf[3]=counter/1000; } }
|