久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3332|回復: 18
打印 上一主題 下一主題
收起左側

51單片機實現等精度頻率計Proteus仿真程序(半成品)調試幾天沒進展

[復制鏈接]
跳轉到指定樓層
樓主
新人求助,因為近幾天完全沒有進展,所以發帖求助,另一方面,雖然是半成品,但測低頻還是蠻準的(小數點后一位),可以當個參考。出現問題如下:低頻時比較準,高頻時顯示頻率就會不停改變而且誤差較大。
仿真圖如下:

程序如下:
#include<reg52.h>
#include<string.h>
#define u8 unsigned char

sbit Gate_ctl=P1^7;sbit Gate=P3^2;
sbit RW=P2^5;sbit RS=P2^6;sbit EN=P2^7;

u8 ledbuf[8],frequency[9],hand[10]="frequency:";
unsigned long count1,count0,overflow1,overflow0;
double fx,f0;
int i,f;
unsigned long fc,Nx,N0,a;
//*****************************************//
void delay(u8 time);
void lcd_init();
void interrupt_init();
void lcd_write_com(u8 com);
void lcd_write_data(u8 date);
void lcd_send(u8 i,u8 j,u8 date[],u8 all);
void lcd_math();
//*****************************************//
void interrupt_init()
{
        TMOD=0xD9;

        T2CON=0x00;
        PT2=1;
        RCAP2H=0x4c;RCAP2L=0x00;
        TH2=RCAP2H;TL2=RCAP2L;
        TH1=0;TL1=0;
        TH0=0;TL0=0;
        ET1=1;ET0=1;ET2=1;
        TR1=1;TR0=1;TR2=1;
        EA=1;
        
}
void main()
{
  f0=921600;
  lcd_init();
  lcd_send(1,0,hand,10);
  interrupt_init();
  while(1)
  {
           while(Gate==1);//Gate=0時跳出
           TR2=0;

           TR0=0;TR1=0;
Nx=(overflow1*65536+TL1+TH1*256);
           N0=overflow0*65536+TL0+TH0*256;

fx=(double)((Nx*f0)/N0);
           fc=(unsigned long)(fx*100+0.5);
           lcd_math();
           lcd_send(2,3,frequency,9);

overflow1=0;overflow0=0;
           TH1=0;TL1=0;TH0=0;TL0=0;
           TR2=1;

TR1=1;TR0=1;
while(Gate!=1);//Gate=1時跳出
  }
}

void time0() interrupt 1 //T0
{ overflow0++;}

void time1() interrupt 3   //T1
{  overflow1++;}

void time2() interrupt 5   //T2
{     TF2=0;
       i++;  
if(i==20)
   {    i=0;
    Gate_ctl=!Gate_ctl;
    TH2=RCAP2H;TL2=RCAP2L;
   }
}

void lcd_write_data(u8 date)//LCD寫數據初始化
{
  RW=0;
  RS=1;
  P0=date;
  delay(100);
  EN=1;
  delay(100);
  EN=0;
}
void lcd_write_com(u8 com)//LCD寫命令初始化
{
  RW=0;
  RS=0;
  P0=com;
  delay(100);
  EN=1;
  delay(100);
  EN=0;
}
void lcd_init()
{
  EN=0;
  lcd_write_com(0x38);//8線,2行,5*7;
  lcd_write_com(0x0c);//屏幕顯示,光標不顯示,光標不閃爍
  lcd_write_com(0x06);//光標右移,屏幕不動
  lcd_write_com(0x01);//清屏
}
void lcd_math()//整數轉換為字符;
{
          u8 n=8;
    strcpy(frequency,"0000000.0");

       do{
                if(n==7)
                {
                 n--;
                 fc=fc*10;
                }
                else
                {
                 frequency[n]=fc%10+'0';
                 n--;
                 }
                }while(fc/=10);
}
void lcd_send(u8 i,u8 j,u8 date[],u8 all)//(行,列,數組,數組內字符個數)數組送入12864
{
  u8 m;
  if(i==1)
  {
    lcd_write_com(0x80+j);
  }
  else
  {
    lcd_write_com(0x80+0x40+j);
  }
  for(m=0;m<all;m++)
        {
         lcd_write_data(date[m]);
         delay(1);
         }

}
void delay(u8 time)
{
while(time--);
}

Keil代碼與Proteus仿真下載: 測試3.rar (103.81 KB, 下載次數: 13)

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:991374 發表于 2022-4-10 14:35 | 只看該作者
提醒一下,lcd_send函數注釋有誤,不是12864,是1602,忘改了。
回復

使用道具 舉報

板凳
ID:94031 發表于 2022-4-10 16:43 | 只看該作者
單片機主頻不夠高。電腦性能不夠好。
回復

使用道具 舉報

地板
ID:991374 發表于 2022-4-10 16:55 | 只看該作者
xuyaqi 發表于 2022-4-10 16:43
單片機主頻不夠高。電腦性能不夠好。

我用的這個單片機頻率為11.0592MHZ,外部電路經過了74LS161進行了10分頻,理論來說可以測到4MHZ,頻率太高時有誤差可以理解,但實際電路測量中,1MHZ就已經出現20~35的誤差了,個人感覺這個是有點大了。所以我覺得應該是代碼寫的沒那么好,中間漏測或者多測了些方波。
回復

使用道具 舉報

5#
ID:161164 發表于 2022-4-11 11:24 | 只看該作者
基操不應該是用定時器2的捕獲模式來得出脈沖周期時間嗎?
回復

使用道具 舉報

6#
ID:991374 發表于 2022-4-11 11:33 | 只看該作者
lkc8210 發表于 2022-4-11 11:24
基操不應該是用定時器2的捕獲模式來得出脈沖周期時間嗎?

是我拘泥于測頻法了,學到了,這就去試一下
回復

使用道具 舉報

7#
ID:401564 發表于 2022-4-11 12:11 | 只看該作者
頻率計這種東西,感覺也沒什么用,不知道要用這玩意來干嘛
單片機推薦用STC8A8K64D,這個時鐘可以到33MHZ
而且可以DMA操作,最大程度提高CPU效率
使用32MHZ有源晶振,提高精度
可以加入SN74LVC1G14之類的觸發器進行整形
回復

使用道具 舉報

8#
ID:991374 發表于 2022-4-11 12:37 | 只看該作者
Y_G_G 發表于 2022-4-11 12:11
頻率計這種東西,感覺也沒什么用,不知道要用這玩意來干嘛
單片機推薦用STC8A8K64D,這個時鐘可以到33MHZ
而 ...

主要是導師讓我搞一下這個,說我基礎不太好,提的要求還比較苛刻,要測5MHZ以上,精度在小數點后,實在沒辦法了,才來求助
回復

使用道具 舉報

9#
ID:161164 發表于 2022-4-11 14:28 | 只看該作者
起昵稱真難 發表于 2022-4-11 11:33
是我拘泥于測頻法了,學到了,這就去試一下

高速脈沖計數,
低速測量脈沖的周期,
兩種結合就是固定采樣時間內計數N個脈沖+脈沖周期,
比如采用一個外部中斷源,
當脈沖下降沿開始計時100毫秒,
計數脈沖的個數N。
100ms時間到,
再計時T到下一個脈沖的下降沿。
那么總的脈沖數N+1個,
總的周期100ms+T.。

那么頻率 =(N+1)/(0.1+T)
回復

使用道具 舉報

10#
ID:301191 發表于 2022-4-11 16:00 | 只看該作者
頂一下
回復

使用道具 舉報

11#
ID:991374 發表于 2022-4-11 18:34 | 只看該作者
lkc8210 發表于 2022-4-11 14:28
高速脈沖計數,
低速測量脈沖的周期,
兩種結合就是固定采樣時間內計數N個脈沖+脈沖周期,

很有參考價值,謝謝大佬。因為我使用的方法是單位時間內測量脈沖個數,在外部電路中使
用D觸發器達到脈沖上升沿時停止計數的作用,并且使用fx=(Nx*f0)/N0進行誤差的矯正。
(fx為待測信號頻率,f0為時鐘頻率即晶振大小,Nx為單位時間內所計待測信號的脈沖,N0為
單位時間內所計時鐘的脈沖個數)
。實際上達到的效果和您所說的差不多。而我目前所遇到的問題是在高頻時誤差較大并且不停
改變顯示值。經過查找資料和向周圍人了解,應該是在晶振不高的情況下,測高頻就會產生誤
差,除了換晶振好像沒什么好辦法,當然也可能是我剛剛接觸單片機,理解的不到位。大佬的
思路很清晰,我會去試試的。
回復

使用道具 舉報

12#
ID:123289 發表于 2022-4-12 09:18 | 只看該作者
低頻:在兩次輸入脈沖之間,數定時器的脈沖個數。
高頻:用定時器給出一個時間間隔,數此間隔中輸入脈沖的個數。
回復

使用道具 舉報

13#
ID:991374 發表于 2022-4-13 11:46 | 只看該作者
尬住,我問了另一個導師這個問題,那個老師說實現這種要求(5MHZ以上且精度為小數點)很難,不知道是這個東西本身就很難實現,還是以我的水平現在很難實現....跟導師說了之后,導師讓我做到20MHZ精度不在要求,現在又有一個問題想請教大佬們,因為我是用的74LS161和74LS01在單片機外部構成的10分頻,按理說,11.0592MHZ的單片機大概可以測到460KHZ左右,外部分頻后應該可以測到4.6MHZ,但實際電路(非仿真)只能測到1MHZ。74系列芯片的最大工作頻率也大概在25MHZ以上應該沒問題,有大佬知道為什么或者你覺得會有那種情況導致這種問題呢?給一點思路也可以
回復

使用道具 舉報

14#
ID:161164 發表于 2022-4-13 11:54 | 只看該作者
460kHz是如何算出來的?
你知道89C52進出一次中斷要多久?
你知道char類型++一次要多久?
回復

使用道具 舉報

15#
ID:991374 發表于 2022-4-13 14:43 | 只看該作者
lkc8210 發表于 2022-4-13 11:54
460kHz是如何算出來的?
你知道89C52進出一次中斷要多久?
你知道char類型++一次要多久?

因為我單片機是12T的,11.0592MHZ的晶振12分頻后為0.9216MHZ,測一個波形需要兩個機械周期,所以除2得460800HZ。當然這只是理論值,就跟您說的一樣我并沒有求出中斷一次和累加所消耗的時間,之所以確定是在460KHZ左右,是因為之前沒有使用74LS161和74LS01進行外部電路10分頻時,測得的界限大概為460KHZ(超過這個值誤差會變得特別大)。而我想的是,外部10分頻后,進入單片機(能被計算機準確測量的)的最大頻率應該也為460KHZ,那么按理論值來說,就應該是可以測到4.6M。當然這可能是比較不成熟的想法,如有疏漏的地方請指點。
回復

使用道具 舉報

16#
ID:123289 發表于 2022-4-13 16:54 | 只看該作者
13#:
你們老師敷衍你了:
理論上:測量精度取決于你的時基精度(這里是你CPU使用晶振的精度),保守一點,計數時存在+-1的誤差,即測試數量存在+-1的不確定度。這是極限精度了。
實際上:由于軟件的不合理,捕捉不及時,中斷延時等等,不確定度會增加,這就要看你對單片機的認知度了,也考驗你編程的水平。懂匯編的人,會做得更精準。
例如:你用定時器做個2秒的脈沖,再打開一個計數器,CLK從引腳用被測的5MHz信號,用2秒脈沖作CLK的開關,即當脈沖為1時,讓CLK通過,則脈沖過后,理論上計數器應收到10M個脈沖。你說是也不是。
回復

使用道具 舉報

17#
ID:991374 發表于 2022-4-13 17:22 | 只看該作者
yzwzfyz 發表于 2022-4-13 16:54
13#:
你們老師敷衍你了:
理論上:測量精度取決于你的時基精度(這里是你CPU使用晶振的精度),保守一點 ...

好像確實是這么回事
回復

使用道具 舉報

18#
ID:123289 發表于 2022-4-14 08:06 | 只看該作者
只要你用的時基是晶振,測量頻率,做到6個有效數字的精度是沒有問題的。
回復

使用道具 舉報

19#
ID:65956 發表于 2022-4-14 08:26 | 只看該作者
晶振改用有源溫度晶振試試,我也曾經試過,用15W單片機,用有源溫度晶振,用PCA采集頻率,校準后采集1HZ時,可以達到小數點第5位的精度,可惜這樣的精度還達不到我項目0.5PPM的要求,后來就沒再用了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99视频入口 | 超碰成人免费 | 亚洲视频在线观看免费 | 亚洲成人一区二区三区 | 成人片免费看 | 国产成人在线视频播放 | 国产精品免费一区二区 | 天天插天天射天天干 | 天堂一区二区三区 | 亚洲视频一区二区三区 | 欧美亚洲视频 | 国产999精品久久久久久 | 成人一区二区三区 | 99久久99热这里只有精品 | 日韩欧美精品在线 | 成人av片在线观看 | 免费视频成人国产精品网站 | 天堂色综合 | 亚洲精品乱码久久久久久9色 | 免费99视频| 一区精品视频在线观看 | 一级黄色片在线免费观看 | 亚洲美女在线一区 | 国产一区二区三区 | 久久久久久国产免费视网址 | 午夜影院| 日韩免费视频 | 日本在线观看网址 | 久久婷婷av | 欧美99久久精品乱码影视 | 日韩美av| 久久精品在线播放 | a视频在线 | 国产成人jvid在线播放 | 成人一级视频在线观看 | 精品一区二区三区91 | 欧美国产日韩精品 | 国产激情视频网址 | 国产精品久久久久久久久久久免费看 | 久久久久国产 | 国产精品久久久久久久久久久久 |