『壹』 我用單片機產生一個50赫茲的信號但是用邏輯分析儀測顯示是48赫茲,這個屬於正常誤差嗎
50Hz頻率誤差應該沒那麼大才對的,檢查一下是不是程序上面有不完善的地方。有沒有其他程序過多佔用單片機性能,或者一些中斷設置的是不是不太好之類的
『貳』 單片機能產生最大頻率方波是多少
我用STC11F02E-SOP20做的模擬DDS的波形發生器(正弦或方波),跑32.768MHZ,正弦表采樣速度為1310720HZ,輸出波形步進為1HZ,最高輸出300KHZ。
『叄』 使用單片機晶元內部時鍾發覺很不準用萬用表測量其頻率在32k到34k跳變 正常嗎
出現這個問題,主要的毛病在晶振上,而不是單片機上,幾乎所有的晶振,都有一定的硬誤差和軟誤差,硬誤差,是指有固定數值的誤差,比如說,都比標的快-0.5K---+1KHz,通常是比標注的高。
軟誤差,是與晶振的標頻率有關,說白了,就是有一定的百分比誤差,比如有正負0.5%的誤差。
軟誤差和硬誤差,都主要是與溫度有關系。
從上面我們就可以看出來,由於硬誤差的存在,使得頻率越低的晶振,誤差就越大,同樣是晶振,12M的,幾乎可以忽略硬誤差的影響,而32.768K的則不可以。
所以,對於低頻率的晶振,通常是業界比較頭疼的,因為不是很好控制其穩定性,所以,對於一般要求不嚴格的,都只買普通的晶振,對於要求稍微嚴格的,都買精度高一些的晶振。而軍工產品,則通常用的是有源時鍾,這鍾低頻的有源時鍾,可以通過高頻的晶振分頻而得到,這樣,就可以忽略掉硬誤差的影響。
比如說,要得到32.768K的時鍾,可以把32.768M的晶振進行1000分頻,這樣,即使原晶振的硬誤差為1KHz,被分頻後,也成了1Hz.
綜上所述,你需要做的是換晶振,要麼,你換10PPM的無源晶振,用NPO或者X5R的負載電容,要麼,你換成有源的時鍾來驅動。
『肆』 基於51單片機的頻率測量及測量誤差
可以用對單位時間內 脈沖個計數的方法來實現,用2個 定時/計數器 ,一個作為定時器,定時50 ms,累積10次或20次,即0.5S或1S
另外一個作為計數器,對外部脈沖計數
誤差與晶振頻率准確度有關,測量與時間有關的量,你本身的時間當然要准確。如果所測信號頻率高,可以測0.2s或0.5S內的脈沖數,可以防止溢出,如果頻率低,可以測1S或2S內的脈沖數,以減小誤差,但響應速度慢一些。
程序比較簡單,以下供參考
void init()//初始化設置
{
TMOD=0x15;//定時器0作為計數器,定時器1作為定時器用
TH0=0;//計數器清0
TL0=0;
EA=1;//開總中斷
ET1=1;//允許定時器1中斷
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
TR0=1;//啟動計數器
TR1=1;//啟動定時器
aa=0;
}
void main()//主程序
{
init();//初始化
while(1)//循環程序
{
dd=bb*256+cc;//0.5S的計數值
ee=2*dd;//換算為1秒鍾的計數值
if(aa==1)
{
if(TH0>12)//預判斷,50ms內TH0>12,1s內計數值將超過可計數的最大值65535
fm=1;//報警
}
display4(ee);//顯示
fm=0;//報警停止
}
}
void timer1()interrupt 3//注意:定時器1的中斷序號為3
{
aa++;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
if(aa==10)//中斷10次,共0.5S
{
TR0=0;//暫停計數
aa=0;
bb=TH0;//讀出計數器數據
cc=TL0;
TL0=0;//計數器清0
TH0=0;
TR0=1;//重新啟動計數器
}
}
『伍』 設MCS-51單片機的晶振頻率為12MHZ,試編寫10ms的延時程序(要求誤差不超過0.003ms)。
C語言程序:
#include
void main (void)
{
TMOD = 0x10;
TH1 = (-50000>>8);
TL1 = -50000;
TCON = 0x40;
IE = 0x88;
while(1);
}
void T1_int (void) interrupt 3
{
TH1 = (-50000>>8);
TL1 = -50000;
}
匯編程序如下:
ORG 0000H
AJMP MAIN
ORG 001BH
AJMP T1INT
ORG 0100H
MAIN:
MOV TMOD, #10H
MOV TH1, #HIGH(-50000)
MOV TL1, #LOW(-50000)
MOV TCON, #40H
MOV IE, #88H
AJMP $
T1INT:
PUSH ACC
MOV TH1, #HIGH(-50000)
MOV TL1, #LOW(-50000)
POP ACC
RETI
Keil C51程序設計中幾種精確延時方法
延時通常有兩種方法:一種是硬體延時,要用到定時器/計數器,這種方法可以提高CPU的工作效率,也能做到精確延時;另一種是軟體延時,這種方法主要採用循環體進行。
使用定時器/計數器實現精確延時
單片機系統一般常選用11.059 2 MHz、12 MHz或6 MHz晶振。第一種更容易產生各種標準的波特率,後兩種的一個機器周期分別為1 μs和2 μs,便於精確延時。
本程序中假設使用頻率為12 MHz的晶振。最長的延時時間可達216=65 536 μs。若定時器工作在方式2,則可實現極短時間的精確延時;如使用其他定時方式,則要考慮重裝定時初值的時間(重裝定時器初值佔用2個機器周期)。
在實際應用中,定時常採用中斷方式,如進行適當的循環可實現幾秒甚至更長時間的延時。使用定時器/計數器延時從程序的執行效率和穩定性兩方面考慮都是最佳的方案。但應該注意,C51編寫的中斷服務程序編譯後會自動加上PUSH ACC、PUSH PSW、POP PSW和POP ACC語句。
執行時佔用了4個機器周期;如程序中還有計數值加1語句,則又會佔用1個機器周期。這些語句所消耗的時間在計算定時初值時要考慮進去,從初值中減去以達到最小誤差的目的。
『陸』 用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等單片機.
『柒』 at89c52單片機的時鍾頻率是多少
時鍾頻率和晶振的頻率相同。
單片機datasheet寫的0-24MHz。
如果模擬選12MHz,這是理想狀態時鍾。一個機器周期等於12個時鍾周期,就是1uS。但是實際應用中選擇11.0592MHz,因為
其一:因為它能夠准確地劃分成時鍾頻率,與UART(通用非同步接收器/發送器)量常見的波特率相關。特別是較高的波特率(19600,19200),不管多麼古怪的值,這些晶振都是准確,常被使用的。
其二:用11.0592晶振的原因是51單片機的定時器導致的。用51單片機的定時器做波特率發生器時,如果用11.0592Mhz的晶振,根據公式算下來需要定時器設置的值都是整數;
如果用12Mhz晶振,則波特率都是有偏差的,比如9600,用定時器取0XFD,實際波特率10000,一般波特率偏差在4%左右都是可以的,所以也還能用STC90C516 晶振12M 波特率9600 ,倍數時誤差率6.99%,不倍數時誤差率8.51%,數據肯定會出錯。
這也就是串口通信時大家喜歡用11.0592MHz晶振的原因,在波特率倍速時,最高可達到57600,誤差率0.00%。 用12MHz,最高也就4800,而且有0.16%誤差率,但在允許范圍,所以沒多大影響。
另外不建議使用內部時鍾,單片機內部時鍾都是有誤差的。
『捌』 單片機到底能檢測到多大的頻率,檢測誤差是否是隨頻率增大而變大
12m晶振的單片機的周期是2微秒,1個指令要2個周期左右,不同指令不一樣,加上指令間的時間和硬體誤差什麼的,當10微秒來說。頻率就是1/10微秒 赫茲 自己算 頻率越高 誤差越大
『玖』 數顯頻率計的誤差范圍是多大
用單片機製作的數顯頻率計,測試頻率直接加到單片的計數引腳。誤差很小,萬分之一。如測試頻率經分頻後到單片的計數引腳,如經100分頻,誤差+ - 100HZ
『拾』 單片機頻率精度計算
精確到50KHZ到0.001Hz用12M晶振足夠了.
12M晶振在C51系列單片機中的機器周期是1us,機器執行指令的時間也就幾us,在測量時考慮的是頻率上限50KHZ即20us周期,用測單位時間里脈沖個數的方法可行,測頻率下限時用測周期的方法可行.自己寫程序時設計一個轉換點就行了,能達到較高的精度.所以用12M晶振絕對能達到你的要求.
不過你的0.001HZ是1000秒的周期,這個數字轉換用來測量人都要等老了(16分鍾多).要求的頻率其實也用不了那麼低的.