找回密碼
 立即註冊
查看: 10447|回復: 21

[教學文獻] 計頻儀- 使用 AT89C2051 & LCD 0~16.5Mhz

  [複製鏈接]
發表於 2013-8-3 09:46:54 | 顯示全部樓層 |閱讀模式
http://www.8051projects.net/comment.php?comment.news.123
使用 google 翻譯:

一個非常簡單容易使頻率計數器項目。 這個項目是小AT89C2051單片機與液晶供電。 電路的框圖如下所示。 它可以支持多種頻率的輸入開始從1Hz到〜16.5Mhz,其餘取決於引腳特性。

工作原理
正如我們都知道的一個信號的頻率是每秒的週期數。 做了使用在此邏輯中,計算的輸入信號的頻率。

8051有兩個定時器,定時器0被配置為延遲1秒採樣的輸入信號和定時器1被用作一個計數器來計算在一個1秒的週期數。 如果Timer1溢出計數器溢出頻率的高字節被視為另一個寄存器。 輸入信號在P3.5/T1這是在計數器模式定時器1的輸入。 在4位模式中,LCD連接到微控制器端口1。 目前程序正在使用2行的LCD,但它可以用於1行LCD。

程序初始化定時器0 50ms的延遲值在16位模式下,一個刻度值加載到20的總延遲時間為1秒(50×20 = 1000毫秒)。 定時器1的配置在16位計數器模式。 1秒的樣本後,我們得到的週期數,因此,輸入信號的頻率從定時器寄存器(TH1:TL1)和頻率的高字節。 所以共3個字節的值,然後轉換為以十六進制表示一個十進制等效。 此十進制值,然後更新到LCD。 再次重複整個過程。
發表於 2013-8-3 12:47:59 | 顯示全部樓層
這個俺玩過
源碼可用, 但是有BUG, 實用性有待加強
回復

使用道具 舉報

 樓主| 發表於 2013-8-3 12:59:30 | 顯示全部樓層
xiaolaba 發表於 2013-8-3 12:47 PM static/image/common/back.gif
這個俺玩過
源碼可用, 但是有BUG, 實用性有待加強

請問一下 bug 是怎樣的情形?
回復

使用道具 舉報

發表於 2013-8-3 15:29:00 | 顯示全部樓層
oldhan 發表於 2013-8-3 12:59 PM static/image/common/back.gif
請問一下 bug 是怎樣的情形?

筆記不見了, 網路的記錄又被 yahoo 改過末端的圖畫被吃掉了, 所以記不起來BUG的詳細, 但是可用的, 起碼 1K / 10K 測過了, 你參考看看.
http://blog.yahoo.com/xiao-laba/articles/382537

後來記得收過作者的更新通知信, 說有修訂過, 隨便看了一下, 好像是增加提供了印PCB的圖檔, 不過沒有玩, 也沒時間試驗, 所以不確定他說的修訂是改了BUG還是只是給印PCB. 俺的經驗是留言給她, 大概半個月回信.
回復

使用道具 舉報

發表於 2013-8-3 17:18:00 | 顯示全部樓層
OLDHAN大:
    零件我都有就是缺板子!! MCU Xtal LCM ....有要做嗎?
回復

使用道具 舉報

 樓主| 發表於 2013-8-4 09:29:02 | 顯示全部樓層
這種一秒鐘計數的我做過很多,只是沒用在計頻器上,
算温度,量電壓,測電容,好用的很。
會貼這設計的原因是因為這個技術對玩51的人是很基礎很重要。
零件我不缺,缺的是熱情。
回復

使用道具 舉報

 樓主| 發表於 2013-8-8 11:41:51 | 顯示全部樓層
簡單的雙斜率 A/D 轉換:
http://www.autooo.net/utf8-classid86-id89063.html
一般經度要求在 0.5% 左右可以只用單斜率就可,
這電路可測電壓或是電容,
51 counter clock 來源改成內部,
counter 的停止計數改由比較器的輸出.
回復

使用道具 舉報

 樓主| 發表於 2013-8-9 14:43:14 | 顯示全部樓層
本帖最後由 oldhan 於 2013-8-9 02:46 PM 編輯

高精度計頻儀的實現.
以前在玩無線電 CB 的時候看到老手用一台 HP 的老 Freq. counter (還是用 nixie 管)調整發射機頻率,
在等待十秒後出現 27.1250001234 Mhz,
一直有疑問按照一般計頻儀器的解析度十秒取樣應該只能到 0.1Hz,
為何它可以達到百倍的精度?
答案是用 reciprocal counting 法.

Modern Frequency counting principles improve resolution.pdf (885.66 KB)


回復

使用道具 舉報

 樓主| 發表於 2013-8-9 15:09:37 | 顯示全部樓層
在低頻的時候為了增加解析度可以再前面用個 PLL 電路把輸入頻率 x 1000,
但在數十 Mhz 的高頻就不能這樣做了...
一般計頻儀在 100Mhz 以上輸入時候,
都會先經過除以 10 的電路,
那解析度就只剩下 10Hz,
除以 100 解析度就只剩下 100Hz,
多年來念茲在茲的就是想把失去的解析度救回,
藉由 google 大神的幫助找到解答.

http://www.mshopf.de/proj/avr/freq_meter.html
回復

使用道具 舉報

發表於 2013-8-10 15:15:55 | 顯示全部樓層
oldhan 發表於 2013-8-4 09:29 AM static/image/common/back.gif
這種一秒鐘計數的我做過很多,只是沒用在計頻器上,
算温度,量電壓,測電容,好用的很。
會貼這設計的原因 ...

OLDHAN大:
   好像很好玩!很好用!! 配合 LCM 就很方便!! 若用7段顯示 會比較容易閃爍接線上面也比較多一點,你可以做個樣本,大家來"仿"也很有成就感!! 學習從模仿開始!!
回復

使用道具 舉報

 樓主| 發表於 2013-8-16 14:00:54 | 顯示全部樓層
antlu 發表於 2013-8-10 03:15 PM static/image/common/back.gif
OLDHAN大:
   好像很好玩!很好用!! 配合 LCM 就很方便!! 若用7段顯示 會比較容易閃爍接線上面也比較多一 ...

網路上的軟硬體範例多如牛毛不缺我一個
能融會貫通納為己用才是正解.

評分

1

查看全部評分

回復

使用道具 舉報

發表於 2013-8-28 09:09:08 | 顯示全部樓層
oldhan 發表於 2013-8-16 02:00 PM static/image/common/back.gif
網路上的軟硬體範例多如牛毛不缺我一個
能融會貫通納為己用才是正解. ...

想請教小弟最近在做這專體!
但T1最大不是65536~把整個65536當成計數!最大也才才得1092HZ~
怎樣才可以想版大所說16.5M??
還是當值超過1KHZ~改變計數方式
1..用累加方式:但計算上每1KHZ就要1秒~2K就要2秒........
2..每兩次觸發算一次,但精準度放大兩倍,可測2K。單數會有問題~
謝謝
回復

使用道具 舉報

 樓主| 發表於 2013-8-28 11:39:45 | 顯示全部樓層
eereer12 發表於 2013-8-28 09:09 AM static/image/common/back.gif
想請教小弟最近在做這專體!
但T1最大不是65536~把整個65536當成計數!最大也才才得1092HZ~
怎樣才可以想版 ...

1092 這數值那來的?
T1 兩個八位串成 16 位元 的 65535 計數器,
1 秒取樣至少可得 65.535Khz 數值?
如果輸入超過 65.535Khz 那在一秒內 T1 會滿了不是可產生中斷?
在中斷副程式讓軟體的計數器加一,
軟體8位元加上硬體 16位元不是 24 位元可計數到 16777215 Hz ?
頻率上限只受到 T1 的輸入頻寬限制,
如果要測 10 秒取樣的頻率可再加一個8 位元軟體計數器達到總數 32 位元計數器也是可以的.
回復

使用道具 舉報

發表於 2013-8-29 08:33:47 | 顯示全部樓層
oldhan 發表於 2013-8-28 11:39 AM static/image/common/back.gif
1092 這數值那來的?
T1 兩個八位串成 16 位元 的 65535 計數器,
1 秒取樣至少可得 65.535Khz 數值?

小弟說錯意思!
65535~得到就是65.535Khz
但我現在有一個問題!!
可能T0在算一秒~T1在計數!
是不是兩個中斷一起!!因為T0在中斷時~造成T1計數漏掉。
所以我的頻率會有上下跳動??
謝謝
回復

使用道具 舉報

 樓主| 發表於 2013-8-29 19:27:31 | 顯示全部樓層
本帖最後由 oldhan 於 2013-8-29 07:32 PM 編輯
eereer12 發表於 2013-8-29 08:33 AM static/image/common/back.gif
小弟說錯意思!
65535~得到就是65.535Khz
但我現在有一個問題!!


請問您現在的數字跳動多少?
+-2 以內的跳動是正常的,
如果超過此就要研究是訊號來源的問題還是程式造成的結果,
T0 中斷並不會干擾 T1 的計數(因為 T0,T1 都是硬體的計數器),
問題在一秒的取樣時間不固定,
無誤差的一秒取樣不容易達到,
調整程式讓誤差固定再把數值修正回來.
回復

使用道具 舉報

發表於 2013-8-30 10:42:25 | 顯示全部樓層
oldhan 發表於 2013-8-29 07:27 PM static/image/common/back.gif
請問您現在的數字跳動多少?
+-2 以內的跳動是正常的,
如果超過此就要研究是訊號來源的問題還是程式造成的 ...

這部分!小弟有濾掉!!現在只有每100HZ會多1HZ~這可用程式把他砍了!
採用訊號產生器~~當訊號

想請問~
1.我想把它當成轉速偵測~去判定馬達是否有問題!
但問題來了轉速RPM~每分幾轉!如果我這樣頻率需要X60,這樣我轉速最低單位60RPM。

不知道怎樣方式?撰寫?才是要讓我顯示轉速?希望轉速單位為1RPM??
回復

使用道具 舉報

 樓主| 發表於 2013-8-30 12:18:31 | 顯示全部樓層
eereer12 發表於 2013-8-30 10:42 AM static/image/common/back.gif
這部分!小弟有濾掉!!現在只有每100HZ會多1HZ~這可用程式把他砍了!
採用訊號產生器~~當訊號

>不知道怎樣方式?撰寫?才是要讓我顯示轉速?希望轉速單位為1RPM??
F = 1 / T
回復

使用道具 舉報

發表於 2013-9-2 09:04:03 | 顯示全部樓層
oldhan 發表於 2013-8-30 12:18 PM static/image/common/back.gif
>不知道怎樣方式?撰寫?才是要讓我顯示轉速?希望轉速單位為1RPM??
F = 1 / T   ...

F(頻率)=1/T(週期)
然到~這樣說好了!!
轉速=RPM/每分
故我得到的轉速=頻率X60(秒轉分)
因為這樣我的轉速最低單位是60RPM
說真的不太懂大大意思!
請詳解
謝謝
回復

使用道具 舉報

發表於 2013-9-2 18:46:43 | 顯示全部樓層
本帖最後由 xiaolaba 於 2013-9-2 06:48 PM 編輯
eereer12 發表於 2013-9-2 09:04 AM static/image/common/back.gif
F(頻率)=1/T(週期)
然到~這樣說好了!!
轉速=RPM/每分


大大, 或者這樣給你一個計算頻率的關係解釋, 會容易理解一些

頻率 = 1 / 週期
f = 1/ T

如果用1秒時長去觀察一個訊號, 得到 20 個週期的變化, 那
f = 20T/1sec = 20HZ = 1/T, T = 0.05sec

如果用0.1秒時長去觀察一個訊號, 得到 20 個週期的變化, 那
f = 20T/0.1sec = 200HZ = 0.1/T, T = 0.005sec

如果用0.01秒時長去觀察一個訊號, 得到 20 個週期的變化, 那
f = 20T/0.01sec = 2000HZ = 0.01/T, T = 0.0005sec

那假設用 10 MHZ 的 MCU, 怎樣算得 16MHZ 或更高頻率的訊號呢 ?
其實說穿了很簡單, 假設 CPU 的頻率 10MHZ, 那 TIMER 的速度可能是 1/100 = 0.1 MHZ
如果是 16 BIT 的計數器, 則每次計數器加一, 時間就是 1/0.1MHZ = 10us
那麼計數 65536 次就會 OVERFLOW, 耗時約 65536 x 10us = 0.65 秒

當然以上都是假設的, 但原理大概就是這樣, 還有一些實際上調配須要
例如, 選取觀察一個訊號時間長度, 通常用 2^n 作為計數值 和 計時值
原因是 8 BIT CPU 做除法非常慢, 但是移位運算則很快
例如 256 / 2 = 0xFF >> 1, 就是 0x11111111b 右移一位 = 0x01111111 = 0x7F = 128
所以選哪個時長去觀察一個訊號, 這個數值就很重要

另外, 還有一樣,
頻率 = 1 / 週期, 所以, 計數的時間長度通常選 1 秒, 1/2秒, 1/4秒....

原因是 1 = 2^0, 1/2 = 2^-1, 1/4 = 2^-2.....

以上兩個要素加在一起,
假設 0.5秒, 計數器得到 20 個訊號週期, 那頻率是多少呢 ?
f = 20 / 0.5 = 20 / 2^-1 = 20 * 2 = 20 << 1 = 40 HZ

假設 0.25秒, 計數器得到 20 個訊號週期, 那頻率是多少呢 ?
f = 20 / 0.25 = 20 * 4 = 20 << 2 = 80 HZ

是不是簡單又有效率算得頻率呢 ?

這個方法就是自動頻率量程的運作原理, 不斷地縮短或增長時間長度, 直到計數器有沒有 OVERFLOW
然後用移位法把計數器的值直接左移或右移, 頻率就算好了.

希望以上都沒有寫錯, 參考看看.

那你的問題呢

RPM = Revolution Per Minute
轉數 / 每分鐘 = 轉數 / 60秒

假設 600 RPM, 換成頻率
600轉 / 60 sec = 10轉/sec = 10HZ

到頭來還是一樣, 算頻率 HZ

http://en.wikipedia.org/wiki/Frequency
回復

使用道具 舉報

發表於 2013-9-4 14:30:26 | 顯示全部樓層
xiaolaba 發表於 2013-9-2 06:46 PM static/image/common/back.gif
大大, 或者這樣給你一個計算頻率的關係解釋, 會容易理解一些

頻率 = 1 / 週期

那假設用 10 MHZ 的 MCU, 怎樣算得 16MHZ 或更高頻率的訊號呢 ?
其實說穿了很簡單, 假設 CPU 的頻率 10MHZ, 那 TIMER 的速度可能是 1/100 = 0.1 MHZ
如果是 16 BIT 的計數器, 則每次計數器加一, 時間就是 1/0.1MHZ = 10us
請教F=10MHZ 那T=1/10MHZ  =>  T=0.1us   怎麼是10us

所以我要得到最小單位轉速1RPM好像不好取得?1/60 =>0.016666... 我的F=0.016.....
反之如果我最小單位是6RPM F=6/60=0.1 F=0.1 我的T=10S
我的MCU 4MHZ
還是不了解!
想通了~會在上來修改..
謝謝
回復

使用道具 舉報

 樓主| 發表於 2013-9-4 21:08:44 | 顯示全部樓層
本帖最後由 oldhan 於 2013-9-4 09:18 PM 編輯
eereer12 發表於 2013-9-4 02:30 PM static/image/common/back.gif
那假設用 10 MHZ 的 MCU, 怎樣算得 16MHZ 或更高頻率的訊號呢 ?
其實說穿了很簡單, 假設 CPU 的頻率 10MH ...


看一下 51 的 timer 0/1 結構圖:
mcs51timer.png
mode 1 與 mode 0 類似只是 TL1 改成 8 位元,
一般都是用 mode 1 兩個八位元串成 16 位元,
C/T 控制位元為 0 時候被測訊號由 INT1 輸入
INT1 為1 的時候每 12 個 OSC 會讓 TL1 上數加1,
INT1 為0時候終止計數, TL1/TH1 測量到的數值為半周期.
C/T 控制位元為 1 時候, 被測訊號由 T1 pin 輸入,
T1 pin 每個 clk 會讓 TL1 上數加1, 一秒取樣時間後 TL1/TH1 測量到的數值為 頻率 Hz.
回復

使用道具 舉報

發表於 2013-9-20 09:25:04 | 顯示全部樓層
謝謝指導
回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

關閉

站長小叮嚀上一條 /1 下一條

手機版|禁閉室|連繫我們|痞酷網電子技術論壇

GMT+8, 2025-6-9 06:19 AM , Processed in 0.077501 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.