痞酷網_PIGOO

 找回密碼
 立即註冊
!!! [系統偵測到廣告阻擋軟體] !!!

如果您覺得痞酷網對您有些許幫助,或者您認同痞酷網的理想,

那麼希望您將痞酷網設定為白名單.

並請在上論壇的時候,動動您的手指,用行動支持我們.

謝謝!
查看: 8797|回復: 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, 下載次數: 60)


 樓主| 發表於 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, 2024-11-24 04:23 AM , Processed in 0.308010 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.