|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
頻率計(jì),在TMR1H,TMR1L中讀出的脈沖數(shù)不穩(wěn)定,不知為何? |
| 作者:mikezhong 欄目:單片機(jī) |
大家好,請(qǐng)幫忙,這是一個(gè)測(cè)量20K以下頻率的程序,TMR2做為一個(gè)0。5秒的定時(shí),TMR1為一個(gè)異步計(jì)數(shù)器,計(jì)數(shù)外部脈沖個(gè)數(shù)。這樣從而得出頻率。采用TMR2中斷,并在TMR2中斷中停止TMR1,并讀出TMR1H,TMR1L,然后重新開(kāi)啟TMR1,TMR2。然而,我讀出的脈沖數(shù)亂來(lái),不穩(wěn)定,而且沒(méi)有任何的規(guī)律性。我是通過(guò)其中的一位ABCD來(lái)顯示的,其中任何一位我都試過(guò),均不穩(wěn)定。請(qǐng)問(wèn)大俠這是為何? 我的程序如下: /***************************************************** 程序說(shuō)明: 1,功能:頻率計(jì),采用周期對(duì)比法,即在0.5秒內(nèi)所計(jì)得的脈沖數(shù)。 最大計(jì)數(shù)9999個(gè)脈沖(十進(jìn)制數(shù)僅有四位),最大頻率為 9999*2=19.998KHz. 2,硬件電路:PIC16F87X,4.00陶瓷振蕩器。計(jì)數(shù)脈沖從IC第15腳 輸入。 3,硬件資源:使用了兩個(gè)定時(shí)器,TMR2,TMR1;TMR2完成0.5秒的 定時(shí),TMR2完成在0.5抄內(nèi)計(jì)量脈沖的個(gè)數(shù)。 *****************************************************/ #include "pic.h" unsigned int x,f_result; unsigned CHAR a,b,c,d,y1,y2,flag,a1,a2,b1,n,b2; void interrupt ISR(void) { if(TMR2IE&&TMR2IF) //定時(shí)時(shí)間500000us=250*4(前分頻比)*10*50(循環(huán)次數(shù)) { TMR2IF=0; n++; if(n==/*100*/50) { flag=1; n=0; TMR1ON=0; //停止計(jì)數(shù),為了下面讀出正確的數(shù)值。 TMR2ON=0; y1=/*0x04*/TMR1H; y2=/*0xd2*/TMR1L; TMR1H=0; //計(jì)數(shù)器清零。 TMR1L=0; TMR2ON=1; TMR1ON=1; RD0=!RD0; } } ) void main(void) { TRISD=0X00; // OUTPUT PORTD=0XFF; TRISC=0xff; //RC0設(shè)為input. T2CON=0b01001101;/*-- TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKIPSI T2CKIPS0 后分頻比為 1:10,前分頻1:4。*/ PR2=249; //設(shè)置初值,希望得到250計(jì)數(shù)次數(shù)。中斷50次,得到0.5S. TMR1H=0x00; //賦初值; TMR1L=0x00; T1CON=0b00000111; /*-- -- T1CKPSI T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR10N ,分頻比1:1 TMR1CS=1(外部引腳上升沿計(jì)數(shù)),T1SYNC=1異步計(jì)數(shù); TMR1ON=1(開(kāi)啟計(jì)數(shù)器) */ INTCON=0b11000000; //GIE PEIE T0IE INTE RBIE T0IF INTF RBIF PIE1=0b00000011; //PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE PIR1=0B00000000; //PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF while(1) { if(flag==1) { x=y1; //須將十六進(jìn)制數(shù)化為十進(jìn)制數(shù) x<<=8; x+=y2; d=x%10; x/=10; c=x%10; x/=10; b=x%10; x/=10; a=x%10; /******************* a1=a<<4; a2=a1+b; b1=c<<4; b2=b1+d; f_result+=a2; f_result<<=8; f_result+=b2; ********************/ SWITCH (b) /*ABCD*/ { case 0: PORTD=~0b11111100; break; //高--低 ABCDefg: 1111110 0 case 1: PORTD=~0b01100000; break; //高--低 ABCDefg: 0110000 0 case 2: PORTD=~0b11011010; break; //高--低 ABCDefg: 1101101 0 case 3: PORTD=~0b11110010; break; //高--低 ABCDefg: 1111001 0 case 4: PORTD=~0b01100110; break; //高--低 ABCDefg: 0110011 0 |
| 2樓: | >>參與討論 |
| 作者: zgl7903 于 2005/1/21 12:23:00 發(fā)布:
zgl7903 1:TMR1的外部輸入時(shí)ST門(mén),看看你的信號(hào)是否達(dá)到要求 2:在主程序中 x=y1; x<<=8; x+=y2; 因?yàn)閥1,y2在中斷中被賦值,因此在主程序中直接使用有被中斷竄改的危險(xiǎn),可以改成 di(); x=y1; x<<=8; x+=y2; ei(); 當(dāng)然di() ei()之間的時(shí)間不能太長(zhǎng),否則會(huì)影響到中斷的精度和實(shí)時(shí)性。 3:中斷服務(wù)中if(n==/*100*/50) 條件不完全,如果n>/*100*/50呢,況且n沒(méi)有被初始化。 4:像這種操作最好使用CCP功能,用一個(gè)定時(shí)器加一些存儲(chǔ)器就夠了,節(jié)省資源。 |
|
| 3樓: | >>參與討論 |
| 作者: mikezhong 于 2005/1/21 14:04:00 發(fā)布:
先謝謝大俠。 先謝謝大俠。 1,輸入的信號(hào)是來(lái)自音頻信號(hào)發(fā)生器,經(jīng)過(guò)四級(jí)反相器(CD4069)然后輸?shù)絇IC877A的第15腳。示波器觀察是很好的方波。 2,向你所說(shuō)我在那位置加入了di();**** ;ei();,試驗(yàn)的結(jié)果仍然是亂來(lái)。 3,中斷中n一會(huì)大于50,由于我在中斷后半部分加了n=0; 試驗(yàn)的頻率來(lái)自穩(wěn)定的信號(hào)源,到底是哪里的問(wèn)題呢?一定是程序中有哪里處理不當(dāng),就是無(wú)法找到。請(qǐng)大家?guī)兔Γ?br> |
|
| 4樓: | >>參與討論 |
| 作者: zgl7903 于 2005/1/21 14:48:00 發(fā)布:
zgl7903 if(n==/*100*/50) 改為 if(n>=/*100*/50) T1CON=0b00000111;改為 T1CON=0b10000111; //16位模式 |
|
| 5樓: | >>參與討論 |
| 作者: mikezhong 于 2005/1/21 15:38:00 發(fā)布:
謝謝大俠 我同意將if(n==/*100*/50) 改為 if(n>=/*100*/50) ,但是T1CON=0b00000111;改為 T1CON=0b10000111; 其中的第8位為無(wú)效位!不過(guò)我也試了,還是不行!謝謝大俠! |
|
| 6樓: | >>參與討論 |
| 作者: zgl7903 于 2005/1/21 16:03:00 發(fā)布:
zgl7903 不好意思我看得是另外一款單片機(jī)的PDF資料; 用示波器看看你的陶瓷振蕩器是否穩(wěn)定,RD0上的信號(hào)是否穩(wěn)定。 |
|
| 7樓: | >>參與討論 |
| 作者: mikezhong 于 2005/1/21 16:29:00 發(fā)布:
謝謝大俠 謝謝大俠提供的連接,我將仔細(xì)看一下,另外一位大俠,我使用的是陶瓷振蕩器,振蕩很穩(wěn)定,RD0是給我自己看是否進(jìn)入0。5秒中斷中起指示作用。我再想想辦法。 |
|
| 8樓: | >>參與討論 |
| 作者: zgl7903 于 2005/1/21 16:53:00 發(fā)布:
zgl7903 你的顯示使用的是PORTD,而中斷中又操作RD0,能不跳嗎? |
|
| 9樓: | >>參與討論 |
| 作者: mikezhong 于 2005/1/22 10:36:00 發(fā)布:
我找到了問(wèn)題點(diǎn)。 謝謝大家,我找到了問(wèn)題點(diǎn),將TMR1的異步計(jì)數(shù)改為同步計(jì)數(shù)即可!但我不知道這是為什么? 不論如何,這是一個(gè)簡(jiǎn)單的頻率計(jì),采用周期對(duì)比法測(cè)量,由于沒(méi)有采用多次平均法,從而存在2HZ的脈沖誤差,這對(duì)我這個(gè)需要的應(yīng)用來(lái)說(shuō)是已經(jīng)足夠了,同時(shí)我想他對(duì)其它的這方面運(yùn)用的兄弟朋友會(huì)有所幫助!謝謝! |
|
| 10樓: | >>參與討論 |
| 作者: 傲氣雄鷹 于 2005/1/24 9:49:00 發(fā)布:
書(shū)上說(shuō)用異步計(jì)數(shù)和同步計(jì)數(shù)都可以的 |
|
| 11樓: | >>參與討論 |
| 作者: xieyuanbin 于 2005/1/25 16:23:00 發(fā)布:
異步和同步應(yīng)該是和波形的雜波有關(guān) 具體什么原因還不好說(shuō) |
|
| 12樓: | >>參與討論 |
| 作者: martin 于 2005/1/25 20:05:00 發(fā)布:
沒(méi)道理,我也覺(jué)得是信號(hào)的問(wèn)題 |
|
| 13樓: | >>參與討論 |
| 作者: mikezhong 于 2005/1/26 12:57:00 發(fā)布:
我也感到很難理解 謝謝!大家,我也感到很難理解,不過(guò)我的信號(hào)應(yīng)該沒(méi)有問(wèn)題,我使用的是音頻信號(hào)發(fā)生器,信號(hào)通個(gè)3個(gè)施密特非門(mén)整形后輸入到15腳,在15腳的波形已經(jīng)非常漂亮了。(另外電路板上沒(méi)其它的電路,應(yīng)不存在干擾的問(wèn)題),難道是程序哪里的問(wèn)題? |
|
|
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |