29.04.2015 Views

Input Capture - Microchip Taiwan

Input Capture - Microchip Taiwan

Input Capture - Microchip Taiwan

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Microchip</strong> 16-bit MCU<br />

內 建 周 邊 模 組<br />

<strong>Input</strong> <strong>Capture</strong> Module<br />

dsPIC Peripheral Module Training – RTC <strong>Taiwan</strong><br />

SLIDE 1


什 麼 是 <strong>Input</strong> <strong>Capture</strong><br />

• 目 的 : 用 來 計 算 某 外 部 信 號 特 定 狀 態 發 生 的 時 間 點<br />

• 用 途 : 脈 波 寬 測 量 , 頻 率 量 測 等 …<br />

• 可 以 設 定 外 部 觸 發 信 號 的 型 式 , 並 使 用 此 外 部 觸 發 來 觸<br />

動 一 個 Timer 的 栓 鎖 動 作<br />

• Timer 的 計 時 值 會 因 為 此 栓 鎖 動 作 而 被 寫 入 特 定 的<br />

buffer<br />

• <strong>Input</strong> <strong>Capture</strong> 的 buffer 可 以 是 一 個 或 多 個<br />

• CPU 也 會 因 為 栓 鎖 動 作 的 發 生 而 被 中 斷<br />

• CPU 若 讀 取 <strong>Input</strong> <strong>Capture</strong> buffer 的 內 容 即 可 知 外 部 信<br />

號 觸 發 條 件 成 立 的 時 間 點<br />

• 外 部 信 號 觸 發 條 件 是 可 以 彈 性 被 設 定 的<br />

• <strong>Input</strong> <strong>Capture</strong> 的 buffer 越 多 越 能 記 錄 快 速 的 外 部 事 件<br />

dsPIC Peripheral Module Training – RTC <strong>Taiwan</strong><br />

SLIDE 2


<strong>Input</strong> <strong>Capture</strong><br />

第 一 代 的 IC module<br />

• dsPIC30F , PIC24FXXXGA0 等 系 列 內 建 第 一 代 的 <strong>Input</strong><br />

<strong>Capture</strong> module<br />

• 最 多 提 供 達 8 個 <strong>Input</strong> <strong>Capture</strong> Channels<br />

• 利 用 捕 捉 16-bit timer 的 值 來 計 算 輸 入 信 號 觸 發 的 時 間<br />

當 CPU 執 行 於 30 MIPS 時 的 解 析 度 = 33 ns (Tcy)<br />

<br />

當 CPU 執 行 於 30 MIPS 並 搭 配 16x pre-scale 時 解 析 度 可 達<br />

2.1 ns ( 33/16 = 2.1 )<br />

• 每 個 capture input 都 有 4 層 的 buffer<br />

<br />

<br />

<br />

Interrupt on 1- 4 capture events<br />

FIFO buffer overflow status<br />

FIFO buffer empty status<br />

dsPIC Peripheral Module Training – RTC <strong>Taiwan</strong><br />

SLIDE 3


<strong>Input</strong> <strong>Capture</strong><br />

第 一 代 的 IC module<br />

• 可 以 使 用 Timer 2 或 Timer 3 為 時 間 基 準<br />

• 可 以 讓 <strong>Capture</strong> 的 事 件 發 生 於 以 下 條 件 :<br />

<br />

<br />

<br />

<br />

edge at ICx pin<br />

edge at ICx pin<br />

Every 4th edge at ICx pin<br />

Every 16th edge at ICx pin<br />

<br />

edge and edge<br />

<br />

對 於 脈 波 寬 與 頻 率 測 量 非 常 有 幫 助<br />

<br />

在 UART 通 信 場 合 可 以 做 自 動 Baud Rate 的 計 算<br />

dsPIC Peripheral Module Training – RTC <strong>Taiwan</strong><br />

SLIDE 4


<strong>Input</strong> <strong>Capture</strong> 的 方 塊 圖<br />

TMR2 TMR3<br />

16 16<br />

ICx<br />

Prescaler<br />

Counter<br />

1:4<br />

1:16<br />

1:1<br />

Edge<br />

Detection<br />

Logic and Sync<br />

1 0<br />

ICTMR<br />

Module<br />

Control Logic<br />

ICxF<br />

Interrupt Flag<br />

ICxBUF<br />

O<br />

FIF<br />

dsPIC Peripheral Module Training – RTC <strong>Taiwan</strong><br />

SLIDE 5


• ICxCON<br />

CO<br />

<br />

<br />

<br />

<br />

<br />

<br />

<strong>Input</strong> <strong>Capture</strong> 相 關 的 控 制 暫 存 器<br />

ICSIDL ⇒ Stop in Idle mode<br />

ICTMR ⇒ Time Base Select for <strong>Input</strong> <strong>Capture</strong><br />

ICI ⇒ <strong>Capture</strong> events per Interrupt select<br />

ICOV ⇒ FIFO buffer overflow status<br />

ICBNE ⇒ FIFO buffer Not Empty status<br />

ICM ⇒ <strong>Input</strong> <strong>Capture</strong> mode select<br />

U-0 U-0 R/W-0 U-0 U-0 U-0 U-0 U-0<br />

-<br />

-<br />

ICSIDL -<br />

-<br />

-<br />

- -<br />

bit15 14 13 12 11 10 9 bit8<br />

R/W-0 R/W-0 R/W-0 R-0, HC R-0, HC R/W-0 R/W-0 R/W-0<br />

ICTMR ICI<br />

ICOV<br />

ICBNE<br />

ICM<br />

bit7 6 5 4 3 2 1 bit0<br />

dsPIC Peripheral Module Training – RTC <strong>Taiwan</strong><br />

SLIDE 6


選 擇 <strong>Input</strong> <strong>Capture</strong> 的 操 作 模 式<br />

• ICM : <strong>Input</strong> <strong>Capture</strong> 操 作 模 式 選 擇 位 元<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

000 : <strong>Input</strong> <strong>Capture</strong> turned off<br />

001 : <strong>Capture</strong> every edge change<br />

010 : <strong>Capture</strong> every falling edge is coming<br />

011 : <strong>Capture</strong> every rising edge is coming<br />

100 : <strong>Capture</strong> every 4th rising edge<br />

101 : <strong>Capture</strong> every 16th rising edge<br />

110 : Unused (Disable)<br />

111 : <strong>Input</strong> <strong>Capture</strong> function as interrupt only,<br />

when device is in the SLEEP or IDLE mode (rising<br />

edge detect only)<br />

dsPIC Peripheral Module Training – RTC <strong>Taiwan</strong><br />

SLIDE 7


<strong>Input</strong> <strong>Capture</strong> FIFO<br />

• 每 個 capture input 都 有 4 個 buffer<br />

TMR2 TMR3<br />

• 可 設 定 在 1-4 個 capture 事 件 後 中 斷 ICTMR<br />

• FIFO buffer overflow 狀 態 位 元<br />

• FIFO buffer empty 狀 態 位 元<br />

ICxBUF<br />

FIFO<br />

ICxCON SFR<br />

-<br />

-<br />

ICSIDL -<br />

-<br />

-<br />

- -<br />

bit15 14 13 12 11 10 9 bit8<br />

ICTMR ICI ICOV ICBNE<br />

ICM<br />

bit7 6 5 4 3 2 1 bit0<br />

dsPIC Peripheral Module Training – RTC <strong>Taiwan</strong><br />

SLIDE 8


<strong>Input</strong> <strong>Capture</strong> 的 規 劃 與 使 用 範 例<br />

dsPIC Peripheral Module Training – RTC <strong>Taiwan</strong><br />

SLIDE 9


設 定 於 Edge Detection Mode<br />

來 計 算 <strong>Input</strong> Duty<br />

• ICM = 001, 來 規 劃 為 每 次 的 edge change 都 產 生<br />

capture 事 件<br />

• ICI = 01, 設 定 每 兩 次 capture 事 件 後 產 生 中 斷<br />

• <strong>Input</strong> Duty = (n16 – n3 ) * TMRx input cycle<br />

TMRx<br />

n2<br />

n3<br />

n4<br />

n5<br />

n6 n7<br />

n8<br />

n9 n10<br />

n11<br />

n12<br />

n13<br />

n14<br />

n15<br />

n16<br />

n17<br />

n18<br />

n19<br />

n20 n21<br />

n22<br />

ICx pin<br />

ICxBUF<br />

<strong>Input</strong> Duty<br />

FIFO 0<br />

FIFO1<br />

?? n3 n16<br />

QEIIF<br />

ICxIF cleared by Software<br />

dsPIC Peripheral Module Training – RTC <strong>Taiwan</strong><br />

SLIDE 10


使 用 Edge Detection Mode<br />

來 計 算 <strong>Input</strong> Frequency<br />

• ICM = 011, 設 定 為 每 個 rising edge 都 發 生<br />

<strong>Capture</strong> 事 件<br />

• ICI = 01, 設 定 為 每 兩 次 capture 事 件 後 中 斷 CPU<br />

• <strong>Input</strong> Freq. = 1 / [(n16 – n3 ) * TMRx input cycle]<br />

TMRx<br />

n2<br />

n3<br />

n4<br />

n5<br />

n6 n7<br />

n8<br />

n9 n10<br />

n11<br />

n12<br />

n13<br />

n14<br />

n15<br />

n16<br />

n17<br />

n18<br />

n19<br />

n20 n21<br />

n22<br />

ICx pin<br />

ICxBUF<br />

FIFO 0<br />

?? n3 n16<br />

FIFO1<br />

QEIIF<br />

ICxIF cleared by Software<br />

dsPIC Peripheral Module Training – RTC <strong>Taiwan</strong><br />

SLIDE 11


第 二 代 的 <strong>Input</strong> <strong>Capture</strong> 模 組 所 增 加<br />

功 能 的 簡 介<br />

dsPIC Peripheral Module Training – RTC <strong>Taiwan</strong><br />

SLIDE 12


第 二 代 的 <strong>Input</strong> <strong>Capture</strong> 模 組<br />

• 第 二 代 的 <strong>Input</strong> <strong>Capture</strong> module 被 整 合 於 新 的 16-bit<br />

MCU 系 列 , 如 PIC24FJXXXGB1 與 PIC24FJXXXGA1<br />

• 第 二 代 <strong>Input</strong> <strong>Capture</strong> module 的 特 點 為 :<br />

<br />

各 自 有 獨 立 的 且 接 受 外 部 Sync. 來 源 同 步 的 上 數 計 時 器<br />

<br />

計 時 器 的 名 稱 為 ICxTMR , x = IC module number<br />

<br />

有 “cascade” mode , 可 以 將 兩 個 16-bit 的 capture 串 聯 成<br />

32-bit 的 <strong>Input</strong> <strong>Capture</strong> module 使 用<br />

<br />

<br />

多 了 ICxCON2 暫 存 器 , 除 支 援 上 述 的 “cascade” 的 設 定 控 制<br />

外 並 且 可 設 定 IC module 是 否 由 外 部 的 Event 來 ti trigger 或 與<br />

外 部 的 Event 做 synchronous 的 動 作<br />

可 以 用 許 多 Timer 設 定 的 clock source 或 System Clock 作 為<br />

Time-Base<br />

<br />

Timer1 .. Timer5 & System Clock<br />

dsPIC Peripheral Module Training – RTC <strong>Taiwan</strong><br />

SLIDE 13


第 二 代 的 <strong>Input</strong> <strong>Capture</strong> 模 組<br />

• 新 的 <strong>Input</strong> <strong>Capture</strong> 方 塊 圖 如 下 :<br />

dsPIC Peripheral Module Training – RTC <strong>Taiwan</strong><br />

SLIDE 14


第 二 代 的 <strong>Input</strong> <strong>Capture</strong> 模 組<br />

• ICxCON2 新 增 的 控 制 位 元<br />

dsPIC Peripheral Module Training – RTC <strong>Taiwan</strong><br />

SLIDE 15


第 二 代 的 <strong>Input</strong> <strong>Capture</strong> 模 組<br />

• ICxCON2 中 可 用 來 Trigger 或 Sync. <strong>Input</strong> <strong>Capture</strong><br />

module 的 sources<br />

dsPIC Peripheral Module Training – RTC <strong>Taiwan</strong><br />

SLIDE 16


<strong>Input</strong> <strong>Capture</strong> 練 習 一<br />

使 用 APP020 實 驗 板<br />

• <strong>Input</strong> <strong>Capture</strong> 7 (IC7/RB4/AN4) 連 接 至 PIC12F675 的<br />

Pin-6 輸 出 來 測 其 輸 出 頻 率<br />

• 將 DSW4 的 SW1 置 於 ON 的 位 置 ( 將 IC7 與<br />

PIC12F675 的 Pin-6 相 連<br />

• 將 <strong>Input</strong> <strong>Capture</strong> mode 設 定 為 Edge Detection ,<br />

每 兩<br />

次 的 capture events 後 產 生 中 斷<br />

• 每 隔 200mS 將 frequency 及 period 顯 示 於 LCD<br />

• 改 變 VR3 應 該 可 看 到 頻 率 的 變 化 , 必 要 時 可 利 用 示 波 器<br />

來 確 認 所 測 得 的 頻 率 是 否 正 確 (0.8K ~ 3.8KHz)<br />

LCD Module display 的 範 例<br />

Freq. = 1238 Hz<br />

Period= 807 uS<br />

dsPIC Peripheral Module Training – RTC <strong>Taiwan</strong><br />

SLIDE 17


<strong>Input</strong> <strong>Capture</strong> 練 習 一<br />

使 用 APP020 - Plus 實 驗 板<br />

• APP020 - Plus 的 電 路 與 APP020 相 容 但 使 用 PIC16F684<br />

來 取 代 PIC12F675<br />

• <strong>Input</strong> <strong>Capture</strong> 7 (IC7/RB4/AN4) 連 接 至 PIC16F684 的 Pin-<br />

6 輸 出 來 測 其 輸 出 頻 率<br />

• 將 DSW4 的 SW1 置 於 ON 的 位 置 ( 將 IC7 與 PIC16F684<br />

的 Pin-6 相 連<br />

• 將 <strong>Input</strong> <strong>Capture</strong> mode 設 定 為 Edge Detection , 每 兩 次 的<br />

capture events 後 產 生 中 斷<br />

• 每 隔 200mS 將 frequency 及 period 顯 示 於 LCD<br />

• 改 變<br />

VR3 應 該 可 看 到 頻 率 的 變 化 , 必 要 時 可 利 用 示 波 器 來 確<br />

認 所 測 得 的 頻 率 是 否 正 確 (0.8K ~ 3.8KHz)<br />

LCD Module display 的 範 例<br />

Freq. = 1238 Hz<br />

Period= 807 uS<br />

dsPIC Peripheral Module Training – RTC <strong>Taiwan</strong><br />

SLIDE 18


<strong>Input</strong> <strong>Capture</strong> 練 習 一 的 提 示<br />

如 何 得 到 時 間 周 期 Time Period<br />

• 宣 告 一 個 陣 列 timer _ edge[2] 來 存 放 capture 事 件 發 生 當 時<br />

的 Timer 值<br />

• 在 <strong>Input</strong> <strong>Capture</strong> 7 (IC7) Interrupt Function 可 以 連 續 對 IC7<br />

做 2 次 的 讀 取<br />

• 兩 個 正 緣 的 時 間 即 為 輸 入 信 號 的 周 期<br />

void _ISR _IC7Interrupt(void)<br />

// Interrupt Function for the IC7<br />

{<br />

Read<strong>Capture</strong>7( &timer_edge[0]); // Read Timer count from FIFO 0<br />

Read<strong>Capture</strong>7( &timer_edge[1]); // Read Timer count from FIFO 1<br />

Int_flag = 1;<br />

// Set IC7 process Flag<br />

IFS1bits.IC7IF = 0;<br />

// Clear the IC7 interrupt flag<br />

}<br />

dsPIC Peripheral Module Training – RTC <strong>Taiwan</strong><br />

SLIDE 19


<strong>Input</strong> <strong>Capture</strong> 練 習 一 的 提 示<br />

如 何 得 到 時 間 周 期 Time Period<br />

• 兩 個 正 緣 的 時 間 即 為 輸 入 信 號 的 周 期 ,<br />

在 IC7 的 中 斷 服 務<br />

程 式 中 已 經 將 其 存 於 timer_edge[0] & timer_edge[1]<br />

while (!Int_flag);<br />

// Get two input signal edge<br />

DisableIntIC7; // Disable Interrupt of <strong>Capture</strong> 7<br />

Int_flag = 0;<br />

/* calculate time count between two capture events */<br />

If ( timer_edge[1] >= timer_edge[0])<br />

period = timer_edge[1] - timer_edge[0];<br />

else<br />

period = 65536 + timer_edge[1] - timer_edge[0];<br />

frequency= FCY/period;<br />

period = period / 14.745600 ;<br />

// Calculate the frequency<br />

// Calculate the period<br />

dsPIC Peripheral Module Training – RTC <strong>Taiwan</strong><br />

SLIDE 20


<strong>Input</strong> <strong>Capture</strong> 練 習 一<br />

使 用 APP026-3X<br />

實 驗 板<br />

• 承 接 OC_Exercise 練 習 ,<br />

將 PICDEM Mechatronics<br />

J7 的 另 一 接 腳 接 至<br />

PIC24FJ128GB106 的<br />

IC7 input<br />

• 完 成 在 IC_Exercise 專 案<br />

中 IC_main.c 內 對 IC7 的<br />

初 始 化<br />

• 使 用 iPPS<strong>Input</strong> () 來 規 劃<br />

IC7 的 輸 入 腳 為 RP4<br />

• 使 用 Timer3 的 clock 設 定<br />

為 Time-Base 來 源 , 並 將<br />

Prescaler 設 為 1:64<br />

• 設 定 每 2 次 capture event<br />

就 中 斷 CPU<br />

• 設 定 為 每 個 “Rising Edge”<br />

觸 發 capture( ICM = 010 )<br />

dsPIC Peripheral Module Training – RTC <strong>Taiwan</strong><br />

SLIDE 21


<strong>Input</strong> <strong>Capture</strong> 練 習 一<br />

使 用 APP026-3X<br />

實 驗 板<br />

• 使 用 OC 送 至 PICEDM Mechatronics 實 驗 板 後 馬 達 運<br />

轉 , 此 時 在 J7 會 出 現 如 下 的 回 授 信 號 :<br />

dsPIC Peripheral Module Training – RTC <strong>Taiwan</strong><br />

SLIDE 22


<strong>Input</strong> <strong>Capture</strong> 練 習 一<br />

使 用 APP026-3X<br />

實 驗 板<br />

• 在 IC7 中 斷 服 務 程 式 計 算 IC7_Value 得 方 式 ( IC7_Value 為 半 圈 時 間 )<br />

void _ISR _IC7Interrupt(void)<br />

// 輸 入 捕 捉 中 斷 副 程 式<br />

{<br />

IFS1bits.IC7IF = 0;<br />

// 清 除 輸 入 捕 捉 中 斷 旗 標<br />

TMR3 = 0 ;<br />

IC7_ValueOld = IC7BUF ;<br />

IC7_ValueNew = IC7BUF ;<br />

if (IC7_ValueNew > IC7_ValueOld)<br />

IC7_Value = IC7_ValueNew-IC7_ValueOld ValueOld ;<br />

else<br />

IC7_Value = 65536 - IC7_ValueOld + IC7_ValueNew ;<br />

}<br />

• 在 主 程 式 回 圈 計 算 轉 速 的 敘 述 如 下<br />

// clock unit = 1:64 = 0.25us * 64 = 16 us<br />

// 2 個 edge = 半 圈 的 時 間<br />

// 1 min = 60 sec = 60000 ms = 60000000 us<br />

if (IC7_Value > 0 )<br />

RPM = 60000000L /((unsigned long)IC7_Value l * 16 *2) ;<br />

else RPM = 0 ;<br />

dsPIC Peripheral Module Training – RTC <strong>Taiwan</strong><br />

SLIDE 23


<strong>Input</strong> <strong>Capture</strong> 練 習 一<br />

使 用 APP026-3X<br />

實 驗 板<br />

• 由 以 上 示 波 器 的 信 號 分 析 ,<br />

半 圈 的 時 間 約 為 16. 24 ms<br />

<br />

馬 達 轉 子 機 構 有 2 個 開 口 , 故 2 次 光 耦 合 器 的 正 緣 的 間 隔 時<br />

間 為 半 圈<br />

• 以 計 算 機 算 出 之 轉 速 為<br />

<br />

60000 ms / 16.24 = 3694 rpm<br />

• 以 PIC24FJ128GB106 IC module capture 中 斷 所 捉 取<br />

到 的 值 計 算 後 的 結 果 為 : 3705<br />

<br />

請 參 考 下 一 Page<br />

• <strong>Input</strong> <strong>Capture</strong> module 對 信 號 測 量 的 準 確 度 是 很 好 的<br />

• 程 式 中 也 啟 用 了 Timer3 中 斷 ,<br />

來 判 斷 馬 達 是 否 停 止<br />

<br />

若 馬 達 持 續 運 轉 , 在 IC7 中 斷 裡 TMR3 會 被 清 為 0 而 造 成<br />

Timer3 的 中 斷 無 法 發 生<br />

<br />

若 馬 達 停 止 後 IC7 無 中 斷 , 將 造 成 Timer3 的 match 中 斷<br />

dsPIC Peripheral Module Training – RTC <strong>Taiwan</strong><br />

SLIDE 24


<strong>Input</strong> <strong>Capture</strong> 練 習 一<br />

使 用 APP026-3X<br />

實 驗 板<br />

• IC_<br />

Exercise 的 實 際 執 行 結 果<br />

dsPIC Peripheral Module Training – RTC <strong>Taiwan</strong><br />

SLIDE 25

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!