痞酷網_PIGOO

 取回密碼
 立即註冊
搜尋
檢視: 3434|回覆: 61

試作基於Arduino的頻率計

[複製連結]
發表於 2018-1-31 21:14:17 | 顯示全部樓層 |閱讀模式
在網路上找到一個  [製作基於Arduino的頻率計,帶LCD屏顯示]的分享文 網址 https://www.cnread.news/content/6019007.html
因為沒有LCD屏 只好將測得頻率傳送到電腦顯示
結果發現最高頻率只能測到25KHZ  
另外所測到的數值不太穩定 ,請前輩指教 如何改善不穩定狀態?

本主題中包含更多資源 (圖片、附件...)

你需要 登入 才可以下載或檢視,沒有帳號?立即註冊

x

評分

1

檢視全部評分

發表於 2018-1-31 21:47:55 | 顯示全部樓層
本文章最後由 單晶片微電腦 於 2018-1-31 10:01 PM 編輯

跟頻率有關的,先要有精準的石英。

評分

1

檢視全部評分

發表於 2018-1-31 22:14:56 | 顯示全部樓層
開始取樣的時序,每次都可能不一致.每周期的High與Loow時間取樣可能不完整.

評分

1

檢視全部評分

 樓主| 發表於 2018-1-31 22:35:58 | 顯示全部樓層
ciko.ciko 發表於 2018-1-31 10:14 PM
開始取樣的時序,每次都可能不一致.每周期的High與Loow時間取樣可能不完整.

是的! 取樣時間都會跳動, 應該用程式來去除跳動部分

本主題中包含更多資源 (圖片、附件...)

你需要 登入 才可以下載或檢視,沒有帳號?立即註冊

x
發表於 2018-1-31 22:42:05 | 顯示全部樓層
讀出的數值大多數都是 14925,這個數值與信號產生器的 15KHz 差異就是誤差,一般 Uno 上的石英振盪器的誤差約為 100ppm 所以這個應用的實用性有待商確。

而最高只能測到 25KHz 又數值不穩定的問題可以先改一下程式也將 Htime 和 Ltime 一起列印出來,再來調整信號產生器的頻率與脈波週期比看是 H 還是 L 讀出數值不穩或是哪個已經達到臨界最小值了。

評分

1

檢視全部評分

發表於 2018-1-31 22:43:06 | 顯示全部樓層
你的信號是正弦波或者方波,是-V,0V,+V或者0V,+V?
輸入電壓位準是多少V?
是否有加入74LS14或者74HC14,MC14584?

評分

1

檢視全部評分

發表於 2018-1-31 23:10:01 來自手機 | 顯示全部樓層
這個不用改了,玩具級的軟體設計,真要做,直接控制timer capture才可

評分

1

檢視全部評分

 樓主| 發表於 2018-1-31 23:20:34 | 顯示全部樓層
xiaolaba 發表於 2018-1-31 11:10 PM
這個不用改了,玩具級的軟體設計,真要做,直接控制timer capture才可

功力不夠,只能玩這個!!  想以去除彈跳方式來改改看
 樓主| 發表於 2018-1-31 23:23:26 | 顯示全部樓層
scottwang 發表於 2018-1-31 10:43 PM
你的信號是正弦波或者方波,是-V,0V,+V或者0V,+V?
輸入電壓位準是多少V?
是否有加入74LS14或者74HC14,MC1458 ...

由信號產生器輸出0V +5V 方波
發表於 2018-2-1 00:04:13 | 顯示全部樓層
這個程式是計算 high 與 low 準位長度。
plusein() 回傳單位為 microsecond~
然後此程式以 loop() 方式設計,且有加上顯示 serial port 的 delay~

(1)以主體 polling 方式設計,會有掉訊號的問題,所以每次計算有可能不是從信號的最開始端計算。
最簡單的方式為連讀2次,去掉前端的可能誤差~

(2)用統計平均法(取10次後平均),或去頭與尾(ex:抓10次,去掉最低的2個,最高的2個,再平均)~

(3)改由中斷觸發後再配合 16bit timer來計算正負半周時度。好處是可以做到不會有損失的信號取樣。(一般人很容易寫出問題,但所有的商業程式必須用這種,這種可以當深論題)~


如果是固定周期的計數。其實把(1)弄好,去掉誤差的發生,再加上(2)統計平均,答案就應該很不錯了。

評分

1

檢視全部評分

發表於 2018-2-1 00:08:22 | 顯示全部樓層
all666大~

要不要我上次 demo 的那種7-SEG LED 啊~~
寄個3顆給你玩玩~當顯示器~

評分

1

檢視全部評分

發表於 2018-2-1 00:49:38 | 顯示全部樓層
建議~

改成中斷觸發,然後以秒(or 100ms 200ms 之類的單位計數)為單位計數~
缺點就是需要1段固定時間統計次數。
優點就是不需要高效能的timer計算正負半波的長度去計算倒數。

評分

2

檢視全部評分

 樓主| 發表於 2018-2-1 06:14:50 | 顯示全部樓層
本文章最後由 all666 於 2018-2-1 06:21 AM 編輯
jojoling 發表於 2018-2-1 12:04 AM
這個程式是計算 high 與 low 準位長度。
plusein() 回傳單位為 microsecond~
然後此程式以 loop() 方式設計 ...

要不要我上次 demo 的那種7-SEG LED 啊~~
寄個3顆給你玩玩~當顯示器~

建議~    改成中斷觸發,


謝謝老師!! 請收訊!

我打算先用 選取連續3 ~ 5 次回傳相同的數值來試試,  有空再來找找有關中斷觸發的範例程式來參考使用
發表於 2018-2-1 06:16:32 | 顯示全部樓層
all666 發表於 2018-1-31 11:23 PM
由信號產生器輸出0V +5V 方波

把最後的指令delay(500);
改為delay(1000);
再試試看效果如何?

評分

1

檢視全部評分

 樓主| 發表於 2018-2-1 06:22:42 | 顯示全部樓層
scottwang 發表於 2018-2-1 06:16 AM
把最後的指令delay(500);
改為delay(1000);
再試試看效果如何?

感謝建議!! 我會試試!
發表於 2018-2-1 07:23:26 | 顯示全部樓層
all666 發表於 2018-2-1 06:22 AM
感謝建議!! 我會試試!

若是修改後有些作用,頻率也不變,那你可以加大數值看看如2000,3000,算是騙騙我們的眼睛.
你的輸入有加74LS14或74HC14嗎?
原文說能測倒1Mhz,所以你還存在大問題.

評分

1

檢視全部評分

 樓主| 發表於 2018-2-1 09:44:12 | 顯示全部樓層
scottwang 發表於 2018-2-1 07:23 AM
若是修改後有些作用,頻率也不變,那你可以加大數值看看如2000,3000,算是騙騙我們的眼睛.
你的輸入有加74LS ...

1. 修改後沒有作用
2. 手頭無此IC 故址將信號產生器輸出直接接到8腳
3. 由程式看來 Htime 回傳值最低為1 Ltime回傳值最低為1, 因此不可能測到1MHZ,何況還有其他DELAY

Htime=pulseIn(8,HIGH); //讀高電平時間
Ltime=pulseIn(8,LOW); //讀低電平時間
Ttime = Htime+Ltime;
frequency=1000000/Ttime; //獲得頻率值
發表於 2018-2-1 13:07:40 | 顯示全部樓層
all666 發表於 2018-2-1 09:44 AM
1. 修改後沒有作用
2. 手頭無此IC 故址將信號產生器輸出直接接到8腳
3. 由程式看來 Htime 回傳值最低為1  ...

你可以試試以下的方式,看看穩定度有沒有比較好,頻率50Khz以下.

Arduino Frequency Counter with 16×2 LCD Display

評分

1

檢視全部評分

 樓主| 發表於 2018-2-1 16:31:41 | 顯示全部樓層
scottwang 發表於 2018-2-1 01:07 PM
你可以試試以下的方式,看看穩定度有沒有比較好,頻率50Khz以下.

Arduino Frequency Counter with 16×2 L ...

測試結果最高只能測到13Khz
測試數據如圖

剛剛看了一下我的開發粄時序是12.000M , 不知道是否有影響?

本主題中包含更多資源 (圖片、附件...)

你需要 登入 才可以下載或檢視,沒有帳號?立即註冊

x
 樓主| 發表於 2018-2-1 18:42:16 | 顯示全部樓層
本文章最後由 all666 於 2018-2-1 07:06 PM 編輯

找到一個範例 使用中斷方式可測到200khz以上雖然有誤差 但是非常穩定 已經適合我的需求了

版上前輩是否有辦法修改程式 ,降低其頻率誤差 此程式就更完美了!!

https://www.hackster.io/moty/frequency-counter-92ec57



本主題中包含更多資源 (圖片、附件...)

你需要 登入 才可以下載或檢視,沒有帳號?立即註冊

x
發表於 2018-2-1 19:51:36 | 顯示全部樓層
本文章最後由 單晶片微電腦 於 2018-2-1 07:55 PM 編輯

修改程式之前,要先確定你訊號來源的精準性。
上面的數據,應該可以算出12M石英的誤差,再由程式修正。

評分

1

檢視全部評分

發表於 2018-2-1 20:07:06 | 顯示全部樓層
我的想法是,Arduino 它很適合單任務、主程式下的直覺式操作模式。
其它超出這個圈圈外的目標與想法,並不推薦。

就像設定好的程式框架。
refer to https://en.wikipedia.org/wiki/Software_framework

同 7# 兄台的看法。

評分

1

檢視全部評分

發表於 2018-2-1 20:42:50 | 顯示全部樓層
看來一般人還是誤解 Arduino ~
Arduino 提供了一個簡化的東西,不代表 Arduino 就被它所限制~

就像 Arduino UNO ,當然也有 Timer/Interrupt 可以用,覺得 Arduino 提供的效能不足,那就自己去直接寫。
那些東西是給一般常用目的使用,需要特殊考量的,當然另外處理。

評分

2

檢視全部評分

發表於 2018-2-1 20:52:51 | 顯示全部樓層
誤差除了由硬體產生,還有些是從軟體運算而來。

數值分析
https://zh.wikipedia.org/wiki/%E ... C%E5%88%86%E6%9E%90

評分

2

檢視全部評分

 樓主| 發表於 2018-2-1 21:46:01 | 顯示全部樓層
本文章最後由 all666 於 2018-2-1 09:53 PM 編輯
jojoling 發表於 2018-2-1 08:42 PM
看來一般人還是誤解 Arduino ~
Arduino 提供了一個簡化的東西,不代表 Arduino 就被它所限制~


Arduino 能夠達到這個功能,對一些使用者來說 是很滿意了, 以前為了檢知頻率的上下限,到處搜尋,到處問都無法達到需求,現在由Arduino UNO 這塊板子,不但簡單的達到了我的需求 ,功能也超出了很多, 實在很感謝老師介紹了
Arduino 的使用!!

玩了一個下午得到下面數據, 雖然有誤差 但是穩定度很高(1HZ的變化) ,每1KHZ 誤差為4HZ 也可接受 如要求高 應該可由程式來調整,

本主題中包含更多資源 (圖片、附件...)

你需要 登入 才可以下載或檢視,沒有帳號?立即註冊

x
發表於 2018-2-1 21:51:36 | 顯示全部樓層
你把period再乘上1.0037試看看,乘完的值再送進去計算。

評分

1

檢視全部評分

 樓主| 發表於 2018-2-1 21:59:13 | 顯示全部樓層
單晶片微電腦 發表於 2018-2-1 09:51 PM
你把period再乘上1.0037試看看,乘完的值再送進去計算。

感謝您的建議, 有空再來試試,  剛剛才拿另一台Arduino  UNO 做比較, 得到與之前那台不同的數據, 猜想是板子上那12M晶振的問題

本主題中包含更多資源 (圖片、附件...)

你需要 登入 才可以下載或檢視,沒有帳號?立即註冊

x
發表於 2018-2-1 22:57:53 | 顯示全部樓層
如真的要玩精度,需要:
(1)先使用外部且比較有高精度的振盪源,確保內部參考主頻的所有地方都正確。
需要有量測儀器確定實際的偏差在那裏。
(2)量測值與實際信號值的固定延遲偏差量測與量測,然後加上軟體修正。
(3)內部浮點數/雙精度浮點,全部修改為整數運算。
ex: float , double => uint32_t or uint64_t
(4)任何運算式都需修改為最小誤差的寫法。
ex: (A/B ) * C  =>   ((A * C)*1000 )/B   , 1000 為放大1000倍,可在疊代運算時保留小數3位,最後答案再(加499,如4捨5入)除1000去掉。

你再搞下去,要當儀器玩的話,就是要這樣考慮了。


評分

4

檢視全部評分

發表於 2018-2-1 23:02:32 | 顯示全部樓層
all666 發表於 2018-2-1 09:59 PM
感謝您的建議, 有空再來試試,  剛剛才拿另一台Arduino  UNO 做比較, 得到與之前那台不同的數據, 猜想是板 ...

另外, UNO上次那顆,應該為 16Mhz 的 XTAL~非 12Mhz

評分

1

檢視全部評分

發表於 2018-2-1 23:30:54 | 顯示全部樓層
要學一樣新東西如果有人帶著玩是最快的,當然若再加上自己埋頭苦練,那假以時日定是有所小成,也期待有一天痞酷網也有較完整的課程出現。

評分

2

檢視全部評分

你需要登入後才可以回覆 登入 | 立即註冊

本版積分規則

關閉

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

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

GMT+8, 2018-6-20 01:18 PM , Processed in 0.064961 second(s), 6 queries , Gzip On, Redis On.

Powered by Discuz! X3.3 Licensed

© 2001-2017 Comsenz Inc.