音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊(cè) 首頁(yè) | 行業(yè)黑名單 | 幫助
維庫(kù)電子市場(chǎng)網(wǎng)
技術(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ī)
頻率計(jì),在TMR1H,TMR1L中讀出的脈沖數(shù)不穩(wěn)定,不知為何?
大家好,請(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
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
先謝謝大俠。
先謝謝大俠。

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
zgl7903
if(n==/*100*/50) 改為 if(n>=/*100*/50)
T1CON=0b00000111;改為 T1CON=0b10000111;   //16位模式


5樓: >>參與討論
mikezhong
謝謝大俠
我同意將if(n==/*100*/50) 改為 if(n>=/*100*/50) ,但是T1CON=0b00000111;改為 T1CON=0b10000111;  其中的第8位為無(wú)效位!不過(guò)我也試了,還是不行!謝謝大俠!


6樓: >>參與討論
zgl7903
zgl7903
不好意思我看得是另外一款單片機(jī)的PDF資料;
用示波器看看你的陶瓷振蕩器是否穩(wěn)定,RD0上的信號(hào)是否穩(wěn)定。

7樓: >>參與討論
mikezhong
謝謝大俠
謝謝大俠提供的連接,我將仔細(xì)看一下,另外一位大俠,我使用的是陶瓷振蕩器,振蕩很穩(wěn)定,RD0是給我自己看是否進(jìn)入0。5秒中斷中起指示作用。我再想想辦法。

8樓: >>參與討論
zgl7903
zgl7903
你的顯示使用的是PORTD,而中斷中又操作RD0,能不跳嗎?

9樓: >>參與討論
mikezhong
我找到了問(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樓: >>參與討論
傲氣雄鷹
書(shū)上說(shuō)用異步計(jì)數(shù)和同步計(jì)數(shù)都可以的
 
11樓: >>參與討論
xieyuanbin
異步和同步應(yīng)該是和波形的雜波有關(guān)
具體什么原因還不好說(shuō)

12樓: >>參與討論
martin
沒(méi)道理,我也覺(jué)得是信號(hào)的問(wèn)題
 
13樓: >>參與討論
mikezhong
我也感到很難理解
謝謝!大家,我也感到很難理解,不過(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)題?

參與討論
昵稱(chēng):
討論內(nèi)容:
 
 
相關(guān)帖子
請(qǐng)問(wèn)高手!
溫濕度控制
大蝦們使用PICC遇到過(guò)這樣的問(wèn)題嗎?
求劉和平寫(xiě)的PIC16F87X單片機(jī)使用軟件的書(shū)的配套實(shí)驗(yàn)板原理圖
請(qǐng)問(wèn)單片機(jī)在寫(xiě)程序時(shí)為什么要設(shè)置“Config”
免費(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)