會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客





請益量測外部輸入1KHz方波的方法
中級會員
註冊日期:
2009/09/22 11:30
所屬群組:
註冊會員
文章: 57
等級: 6; EXP: 41
HP : 0 / 135
MP : 19 / 2970
離線
如果我想要使用PIC18F65J50量測外部輸入方波,並推測該輸入與1KHz誤差多少。PIC18F65J50以12MHz為系統頻率,並以精準度為優先考量,我想了兩個方案:

1.關閉所有interrupt,用assembly寫一個subroutine偵測input兩次上升緣之間的指令數,並配合指令週期計算出經過時間。

2.只留下CCP的interrupt,並設定CCP為capture mode每次下降緣產生interrupt,每次interrupt都先儲存CCPR的值在清除TMR的值,這樣第二次interrupt後只要每兩次的CCPR相減就知道間隔時間多久。

方案2可以不用到assembly,但相對步驟較為複雜。請問大家會比較推薦哪種作法?或是除此之外還有其他建議的方法嗎?

2016/11/08 12:07
轉換PDF檔 列印


Re: 請益量測外部輸入1KHz方波的方法
資深會員
註冊日期:
2004/07/23 16:25
所屬群組:
註冊會員
文章: 1144
等級: 29; EXP: 60
HP : 0 / 715
MP : 381 / 26497
離線
用 CCP CAPTURE

1KHZ =1ms

抓個 16次,計數時間,大概 16ms 處理一次~~

(看你的1khz 範圍決定)

要將沒信號時納入考量

程式寫的好,ccp 時間夠精確,從0.1~99999 hz 都能算的準

2016/11/08 14:15
轉換PDF檔 列印


Re: 請益量測外部輸入1KHz方波的方法
中級會員
註冊日期:
2009/09/22 11:30
所屬群組:
註冊會員
文章: 57
等級: 6; EXP: 41
HP : 0 / 135
MP : 19 / 2970
離線
引用:

Eigen 寫道:
用 CCP CAPTURE

1KHZ =1ms

抓個 16次,計數時間,大概 16ms 處理一次~~

(看你的1khz 範圍決定)

要將沒信號時納入考量

程式寫的好,ccp 時間夠精確,從0.1~99999 hz 都能算的準


請教一下,我看了CCP CAPTURE的描述,設定成16次上升緣以後,當它捕捉到16次上升緣會自動把[TMRxH:TMRxL]的值搬到[CCPRxH:CCPRxL]去,並產生CCPxIF。

可是這樣我並沒有辦法知道第1個上升緣的時候[TMRxH:TMRxL]的值是多少,這樣我知道第16個上升緣的[TMRxH:TMRxL]值似乎也無法推算出經過多少時間。而且好像也沒辦法設定成第1個上升緣啟動timer或是清空[TMRxH:TMRxL]。

這部分是我理解有誤,或是不該這樣操作的呢?

2016/11/08 15:15
轉換PDF檔 列印


Re: 請益量測外部輸入1KHz方波的方法
中級會員
註冊日期:
2009/09/22 11:30
所屬群組:
註冊會員
文章: 57
等級: 6; EXP: 41
HP : 0 / 135
MP : 19 / 2970
離線
在論壇有找到一篇用dspic33f做這個功能的討論,我想照著做應該就能成功了。

http://www.microchip.com.tw/modules/n ... ct&topic_id=10381&forum=2

補充一下,剛剛研究了一下內容發現不能直接套用於PIC18,原因在於dsPIC30F的Input Capture是有帶FIFO的(ICxBUF),你可以設定讓它捕捉4筆資料再產生interrupt,因為過程是全自動化的,所以之後只要從FIFO取中間兩次的值相減就可以精準換算出經過時間。

而PIC18沒有FIFO,所以在產生interrupt後比需經過部分程式碼處理資料搬移、清除flag等事情才能捕捉第二次,所以最後在換算經過時間時,得花一些心思處理這些程式碼的時間消耗,這部分必須算得正確時間才會精準。

2016/11/08 15:27

wei0510 於 2016年11月08日 16:08:21
轉換PDF檔 列印


Re: 請益量測外部輸入1KHz方波的方法
資深會員
註冊日期:
2004/07/23 16:25
所屬群組:
註冊會員
文章: 1144
等級: 29; EXP: 60
HP : 0 / 715
MP : 381 / 26497
離線
輸入的信號源決定你要怎麼抓

抓下之後的處理都是類似的程序


ex: 以前我做過一個 1~99999 rpm 的測速器

換算回來大概就 1666~1 hz 也就是一個pulse 大概 0.6~1000ms

為什麼capture 會有計數一次、四次、16次,就是因為如果進來的pulse太快

mcu 跟本沒時間『間隔』來處理資料

選擇1次、四次、16次的基本上就是,你希望多久會發生一次中斷


二、capture 抓取的另一個重點就是 timer1 overflow 的控制

ex: 600rpm換算下來 100ms 一次,抓 16次中斷一次,一般 timer1 32768hz 2sec

你每次抓下的時間,幾乎都會 overflow 的狀況發生。

所以如何設定抓幾次、及 overflow 控制之後剩下的方式就是


ccp_int:

t_now=抓下的時間

if t_now > t_pre
t_interval=t_now-t_pre
else
t_interval=t_pre-t_now ;overflow

t_pre=t_now

plus/t_interval =frequence

2016/11/09 09:43
轉換PDF檔 列印


Re: 請益量測外部輸入1KHz方波的方法
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 13877
等級: 72; EXP: 7
HP : 1066 / 1776
MP : 4625 / 67024
離線
1. 因為測量的頻率不高不低的 1KHz. 我的做法會選用 Timer0 提供一個 100mS 的中斷計時,做為測量輸入脈波的計時基準時間。

1KHz 輸入訊號接給 Timer1 的計數器用來數這輸入的脈衝數。

每當 Timer0 發生 100mS 的中斷時立即讀取 Timer1 的值後立即將 Timer1 的值清除。並設個旗號交給主程式處理。

主程式迴圈只要看到這旗號被設定,清除此旗號並一 Timer1 的儲存值來計算其頻率 (以 1KHz 的輸入,Timer1 的值約在 100)

2. PIC18F46J50 系列的 Timer1 也有提供 Gated Time 模組的功能,這也是很好的量測模組。可以參考 Data Sheet 裡的 12.8.3 TIMER1 GATE TOGGLE MODE 的章節的說明。

2016/11/09 13:00
轉換PDF檔 列印


Re: 請益量測外部輸入1KHz方波的方法
中級會員
註冊日期:
2009/09/22 11:30
所屬群組:
註冊會員
文章: 57
等級: 6; EXP: 41
HP : 0 / 135
MP : 19 / 2970
離線
引用:
Ryang 寫道:
1. 因為測量的頻率不高不低的 1KHz. 我的做法會選用 Timer0 提供一個 100mS 的中斷計時,做為測量輸入脈波的計時基準時間。

1KHz 輸入訊號接給 Timer1 的計數器用來數這輸入的脈衝數。

每當 Timer0 發生 100mS 的中斷時立即讀取 Timer1 的值後立即將 Timer1 的值清除。並設個旗號交給主程式處理。

主程式迴圈只要看到這旗號被設定,清除此旗號並一 Timer1 的儲存值來計算其頻率 (以 1KHz 的輸入,Timer1 的值約在 100)

2. PIC18F46J50 系列的 Timer1 也有提供 Gated Time 模組的功能,這也是很好的量測模組。可以參考 Data Sheet 裡的 12.8.3 TIMER1 GATE TOGGLE MODE 的章節的說明。


回報一下最後的結果, 因為我使用的PIC18F65J50沒有Gated Time, 所以最後採用CCP配timer1來做, 其中CCP設成capture mode然後抓16次, timer1設成Fosc/4(12MHz)的計時器, 量測部分的程式碼如下:


static uint16_t         GetFrequency(void) {
    
uint8_t             count;
    
uint16_t            sample1, sample2, sample3;
    
uint16_t            period1, period2;
    
// Get 3 times.
    
count = 5;
    while(
count--) {
        
PIR3bits.CCP5IF = 0;
        while(!
PIR3bits.CCP5IF);
        
sample3 = sample2;
        
sample2 = sample1;
        
sample1 = CCPR5;
    }
    
// Get 2 periods by 3 times sample.
    
period1 = (sample1>=sample2)?(sample1-sample2):(65536+sample1-sample2);
    
period2 = (sample2>=sample3)?(sample2-sample3):(65536+sample2-sample3);
    
// Return average of 2 periods.
    
return ((period2+period1)/2);

基本上就是自己做dsPIC裡的CCP FIFO, 因為在while loop裡面每次間隔的時間一樣長, 所以只要量測頻率時間大於while loop中的計算時間period都會很穩定.

目前做了幾項測試, 即使量測頻率是2MHz左右都還是十分精準.

2016/12/09 12:09
轉換PDF檔 列印


Re: 請益量測外部輸入1KHz方波的方法
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 13877
等級: 72; EXP: 7
HP : 1066 / 1776
MP : 4625 / 67024
離線
感謝您的回覆及做法。

測量外部訊號的方法真的有很多種。看個人的喜好。
不過剛在查一下 PIC18F46J50 在 Timer1 是有 Gate Time 的設計的。請看一下 Data Sheet 的 196 頁。FIGURE 12-1: TIMER1 BLOCK DIAGRAM

2016/12/09 14:03
轉換PDF檔 列印






無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
線上教學影片
網頁捷徑
教育訓練
其它網站連結
電話: 02-25000405
產品技術問題產品技術支援專線:0800-717718 台北02-25088221 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project