Ⅰ 小弟跪求有基於單片機的等精度頻率計的設計,范圍10HZ到100MHZ。精度千分之一,希望不吝賜教。
這么大頻率的計數器還真沒做過,給你個思路,可以使二進制用計數器進行降低頻率,比如使用四位二進制計數器進行降頻,那麼出來的頻率應該最大不超過100/16=6.25MHz,增強型51應該可以測這個頻率了,單片機測得的頻率再乘16即可,精度滿足的話可以繼續降,進行32分頻,可以降到3MHz多點。
不過這么大的頻率的晶元不一定好找,如果我以前好像看到過74f390/393好像能達到125M,其他的74系列的74hc390隻能達到60多M、74ls390隻能達到20M,你自己看看吧,
降頻的話高頻信號可以測得比較精確,低頻就沒那麼精確了,比如10Hz進行16分頻根本就測不出來,所以要把輸入信號先用單片機測下頻率,如果頻率較小就不降頻直接用單片機測,當達到單片機能測得最大頻率時就進行降頻操作。
Ⅱ 51單片機的數字頻率計
本應用系統設計的目的是通過在「單片機原理及應用」課堂上學習的知識,以及查閱資料,培養一種自學的能力。並且引導一種創新的思維,把學到的知識應用到日常生活當中。在設計的過程中,不斷的學習,思考和同學間的相互討論,運用科學的分析問題的方法解決遇到的困難,掌握單片機系統一般的開發流程,學會對常見問題的處理方法,積累設計系統的經驗,充分發揮教學與實踐的結合。全能提高個人系統開發的綜合能力,開拓了思維,為今後能在相應工作崗位上的工作打下了堅實的基礎。
1.1數字頻率計概述
數字頻率計是計算機、通訊設備、音頻視頻等科研生產領域不可缺少的測量儀器。它是一種用十進制數字顯示被測信號頻率的數字測量儀器。它的基本功能是測量正弦信號,方波信號及其他各種單位時間內變化的物理量。在進行模擬、數字電路的設計、安裝、調試過程中,由於其使用十進制數顯示,測量迅速,精確度高,顯示直觀,經常要用到頻率計。
本數字頻率計將採用定時、計數的方法測量頻率,採用一個1602A LCD顯示器動態顯示6位數。測量范圍從1Hz—10kHz的正弦波、方波、三角波,時基寬度為1us,10us,100us,1ms。用單片機實現自動測量功能。
基本設計原理是直接用十進制數字顯示被測信號頻率的一種測量裝置。它以測量周期的方法對正弦波、方波、三角波的頻率進行自動的測量。
點擊重新載入
1.2頻率測量儀的設計思路與頻率的計算
圖1 頻率測量原理圖
頻率測量儀的設計思路主要是:對信號分頻,測量一個或幾個被測量信號周期中已知標准頻率信號的周期個數,進而測量出該信號頻率的大小,其原理如右圖1所示。
若被測量信號的周期為,分頻數m1,分頻後信號的周期為T,則:T=m1Tx 。由圖可知: T=NTo
(註:To為標准信號的周期,所以T為分頻後信號的周期,則可以算出被測量信號的頻率f。)
由於單片機系統的標准頻率比較穩定,而是系統標准信號頻率的誤差,通常情況下很小;而系統的量化誤差小於1,所以由式T=NTo可知,頻率測量的誤差主要取決於N值的大小,N值越大,誤差越小,測量的精度越高。
1.3 基本設計原理
基本設計原理是直接用十進制數字顯示被測信號頻率的一種測量裝置。它以測量周期的方法對正弦波、方波、三角波的頻率進行自動的測量。
所謂「頻率」,就是周期性信號在單位時間(1s)內
Ⅲ 如何用51單片機測低頻脈沖
可行.這個就是測低頻信號頻率的方法.如果是高頻信號,就是測一段時間內有多少個周期.頻率=時間/周期
Ⅳ 做用51單片機做一個頻率計,測量范圍為0.1Hz~10kHz
在不改變定時時間的前提下,也就是0.5秒定時,是不能實現0.1~2Hz頻率的測量的。
你所謂2Hz~10KHz易實現也是基於這個道理。但這個也是理論情況。
當你0.5s內剛好檢測到一個脈沖,你認為這個時候是2Hz而不是2.5hz或者3.9hz?
這中間存在一個測量精度的問題。實際上你所測到的信號是在2hz到4hz之間。
實際上我們在測量信號的時候,低頻一般會採用測周期,高頻用測頻才能提高測量的准確性。
至於高低頻的臨界點,跟你的計數頻率有關,感興趣的話可以去看《電子測量原理》。
下面我來講下測周實現的方法,可以使用邊沿觸發的D觸發器輸出作為單片機的外部定時控制,測量信號作為觸發時鍾,計數值作為該信號的周期。
Ⅳ 基於單片機的頻率計設計問題
單片機即MCU(MICRO CTROL UNIT) 翻譯成中文就是微型控制單元。它的應用遍及各個領域單片機正朝著高性能和多品種方向發展趨勢將是進一步向著CMOS化、低功耗、小體積、大容量、高性能、低價格和外圍電路內裝化等幾個方面發展。並且由於單片機具顯著的優點,它已成為科技領域的有力工具,人類生活的得力助手。
頻率測量在科技研究和實際應用中的作用日益重要。傳統的頻率計通採用組合電路和時序電路等大量的硬體電路構成,產品不但體積較大,運行速度慢,而且測量低頻信號時不宜直接使用。頻率信號抗干擾性強、易於傳輸 ,可以獲得較高的測量精度。同時 ,頻率測量方法的優化也越來越受到重視.並採用 AT89C51片機和相關硬軟體實現。
MCS—51單片機具有體積小,功能強,性能價格比較高等特點,因此被廣泛應用於工業控制和智能化儀器,儀表等領域。我們研製的頻率計以89c51,具有性能優良,精度高,可靠性好等特點。
實現一個寬頻域,高精度的頻率計,一種有效的方法是:在高頻段直接採用頻率法,低頻段採用測周法。一般的數字頻率計本身無計算能力因而難以使用測周發,而用89c51機構成的頻率計卻很容易做到這一點。對高頻段和低頻段的劃分,會直接影響測量精度及速度。經分析我們將f=1MHz做為高頻,採用直接測頻法;將f=1Hz做為低頻,採用測周期法。為了提高測量精度,我們又對高低頻再進行分段。
以89C51機為控制器件的頻率測量方法,並用C語言進行設計,採用單片機能控制,結合外圍電子電路,得以高低頻率的精度測量。最終實現多功能數字頻率計的設計方案,根據頻率計的特點,可廣泛應用於各種測試場所。
在基礎理論和專業技術基礎上,通過對數字頻率計的設計,用十進制數字來顯示被測信號頻率的測量裝置。以精確迅速的特點測量信號頻率,在本設計在實踐理論上鍛煉提高了自己的綜合運用知識水平,為以後的開發及科研工作打下基礎。
Ⅵ 單片機頻率計
1.實驗任務
利用51單片機的T0、T1的定時計數器功能,來完成對輸入的信號進行頻率計數,計數的頻率結果通過8位動態數碼管顯示出來。要求能夠對0-250KHZ的信號頻率進行准確計數,計數誤差不超過±1HZ。
2.電路原理圖
見插圖
3.程序設計內容
(1).定時/計數器T0和T1的工作方式設置,由圖可知,T0是工作在計數狀態下,對輸入的頻率信號進行計數,但對工作在計數狀態下的T0,最大計數值為fOSC/24,由於fOSC=12MHz,因此:T0的最大計數頻率為250KHz。對於頻率的概念就是在一秒只數脈沖的個數,即為頻率值。所以T1工作在定時狀態下,每定時1秒中到,就停止T0的計數,而從T0的計數單元中讀取計數的數值,然後進行數據處理。送到數碼管顯示出來。
(2).T1工作在定時狀態下,最大定時時間為65ms,達不到1秒的定時,所以採用定時50ms,共定時20次,即可完成1秒的定時功能。
4.C語言源程序
/******************************************************************************
*定時器+計數器測頻
*
*file:frequency.c
*name:zhzhchang
*time:2010.3.17
*V1.0
*blog:http://blog.csdn.net/zhzht19861011
*Nots:本程序定義6個數碼管,經過實測,在200HZ~50KHZ時結果較准確,誤差小於0.4%,
*50KHZ以上頻率未進行測量.據資料表明,可以測量到120KHZ,本程序未證明.
*********************************************************************************/
#include<reg52.h>
bitint_flag;//定時器01S到標志位
unsignedcharvolatileint_count;//定時器0中斷次數
unsignedcharvolatileT1count;//定時器1中斷次數
unsignedcharcodedofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//顯示段碼值0123456789
unsignedlongsum;//1S內脈沖總個數
unsignedcharled[6];//LED顯示緩存
///////////////軟體延時/////////////
voiddelay(unsignedintcnt)
{
while(--cnt);
}
///定時器0初始化
voidinit_t0(void)
{
TMOD=(TMOD&0xF0)||0x01;//定時器0工作於方式1
TH0=(65536-50000)/256;//定時50ms
TL0=(65535-50000)%256;
}
//定時器1初始化
voidinit_t1(void)
{
TMOD=(TMOD&0x0F)|0x50;//timer1forcount
TH1=0x00;
TL1=0x00;
}
//顯示
voiddisp(void)
{
unsignedchari;
for(i=0;i<6;i++)
{
P0=dofly[(led[i])];//取顯示數據
P2=5-i;//取段碼
delay(100);//掃描間隙延時,根據單片機調整,延時1ms即可
}
}
///////////////////////////////////////////////////////
voidmain(void)
{
EA=1;//開總中斷
init_t0();//初始化定時器
init_t1();
TR0=1;//定時器開始工作
TR1=1;
ET0=1;//開T0中斷
while(1)
{
if(int_flag==1)
{
int_flag=0;
sum=TL1+TH1*256+T1count*65536;//計算1秒內的脈沖個數
//以下將數據格式化,轉成LED可顯示的BCD碼
led[0]=sum%10;//最低位
sum=sum/10;
led[1]=sum%10;//第二位
sum=sum/10;
led[2]=sum%10;
sum=sum/10;
led[3]=sum%10;
sum=sum/10;
led[4]=sum%10;
led[5]=sum/10;
int_count=0x00;
T1count=0;
TH1=0x00;
TL1=0x00;
TR1=1;
}
disp();
}
}
//定時器0中斷服務程序
voidint_t0(void)interrupt1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
int_count++;
if(int_count==20)
{
TR1=0;
int_flag=1;
int_count=0x00;
}
}
//定時器1中斷服務程序
voidint_t1(void)interrupt3
{
T1count++;
}
別說你的設計要求用匯編啊!!!
不過既然是課程設計,我這個只是給你參考,你自己一定要弄懂,變成自己的。我實測過,程序沒問題,但用到你的硬體上可能需要改一下,因為你的硬體數碼管不一定和我的硬體接法一樣,但整體思路我都給你了。
Ⅶ 怎樣用單片機做0-10mhz的頻率計,C語言
這個51單片機很難勝任,用stm32才行,一般的51單片機能到1MHz的頻率計已經是極限了
Ⅷ 51單片機製作簡易數字頻率計程序
這里有一個四位數碼管的頻率計,供參考
#include<reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
ucharan[10]={0xc0,0Xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //所需的段的位碼
//ucharwei[4]={0XEf,0XDf,0XBf,0X7f};//位的控制端 (開發板)
ucharwei[4]={0X80,0X40,0X20,0X10};//位的控制端 (模擬)
uintz,x,c,v,date; //定義數據類型
uintdispcount=0;
uintlck=0;
uintdisp=0;
/******************************************************************
延時函數
******************************************************************/
voiddelay(uchart)
{
uchari,j;
for(i=0;i<t;i++)
{
for(j=13;j>0;j--);
{;
}
}
}
/**********************************************************************
數碼管動態掃描
*********************************************************************/
voidxianshi()
{
/*****************數據轉換*****************************/
z=date/1000; //求千位
x=date%1000/100; //求百位
c=date%100/10; //求十位
v=date%10; //求個位
P2=wei[0];
P0=an[z];
delay(50);
P2=wei[1];
P0=an[x];
delay(50);
P2=wei[2];
P0=an[c];
delay(50);
P2=wei[3];
P0=an[v];
delay(50);
}
/*************************************************************************
定時器初值1ms
**************************************************************************/
voidinitTimer(void)
{
TMOD=0x0;
TH0=0xe3;
TL0=0xc;
}
/*************************************************************************
定時器函數
**************************************************************************/
voidtimer0(void)interrupt1
{
TH0=0xe3;
TL0=0xc;
lck++;
if(lck==1000)
{
disp=dispcount;
lck=0;
dispcount=0;
}
}
/*************************************************************************
中斷函數
**************************************************************************/
voidint0(void)interrupt0
{
dispcount++;//每一次中斷,計數加一
}
/*************************************************************************
主函數
**************************************************************************/
voidmain(void)
{
IT0=1;//INT0下降沿中斷
EX0=1;//允許INT1中斷
initTimer();//裝入初值
TR0=1;
ET0=1;
EA=1;
while(1)
{
date=disp;
xianshi();
}
}
Ⅸ 用51單片機做頻率計測量范圍1到1Mhz 誤差不超過1hz 這個怎麼控制誤差啊
肯定達不到!我做過500HZ的高精度時鍾!用在特種產品上的!這個誤差主要出現在晶振上!其實晶振是最大的誤差源!我們採用的是恆溫晶振,不知道你有什麼更好的方法沒有!恆溫晶振很貴,我也在找一個更便宜的方法,現在,我的產品的誤差是ns級,遠遠小於1hz.
樓下的:你這點怎麼算的,沒有搞明白.你這樣算我的精度是1Khz級別的!這樣看我500HZ的頻率精度在K級,要是出現誤差是不是容易變成1500HZ,...是不是這么理解,小弟不才,請賜教
那麼是周期的1 ns/ 1 us = 1/1000. 所以你的頻率精度是 1M / 1000 = 1000 Hz.
3樓正解,採用輸入信號為外部時鍾計數器,51單片機太慢,可以考慮換個其他單片機,比如DSPIC33F,30F等單片機.