Re: 請益量測外部輸入1KHz方波的方法

作者 wei0510 於 2016年12月09日 12:09:13
引用:
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左右都還是十分精準.

來自: http://www.microchip.com.tw/newbb/viewtopic.php?forum=1&topic_id=19830&post_id=73699