Input Capture - Microchip Taiwan
Input Capture - Microchip Taiwan
Input Capture - Microchip Taiwan
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<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