Re: [問題] 量測脈波寬度
※ 引述《BlueFeel (藍色感覺)》之銘言:
: 請教一下,
: 如果我要設計一個....
: pin2 輸入負脈波寬度>1ms , pin1 = 1
: <1ms , pin1 = 0
: 的功能
: 剛開始以為 pin2用INT0(外部中斷)做
: 在中斷函式內 寫個 計數器,
: 當跳開後,會依計數值做pin1判斷1還是0
: 後來發現,我誤會中斷的意義
: 它是 "下緣觸發".....就跳進中斷函式,做計數沒錯
: 但這計數....值並非並非是負脈波寬度
: 怎麼說??
: 跳到中斷計數....這計數只計1次.....非我想像的一直計數到 rising才停
: 所以想跟大大請教一下
: 這樣的應用該怎麼做呢??
通常啦,你要的結果有 n 種解法,要怎麼解就是看你的應用和其他因素
例如這只是一個練習的話,Anal 說的是一種方法,但缺點在於在 plus 在改變狀態
之前,程式會被卡在 ISR 裡面
當然更簡單的話,就是連中斷都不用進,整個迴圈就是在 poll IO 和計數 XD
如果你的程式有要做其他事情,那可以先估計 Anal 說的方法會不會造成什麼影響,
如果還可以的話,這個方法就不用增加什麼新的東西,改點程式碼就 OK 了
當然,如果不用 Anal 的方法,那麼勢必要增加硬體來解決這個部份
最簡單就是換一顆支援 level change trigger 或是可以設定 trigger edge 方向的 IC
不過如果你的 IC 有支援 兩個 IO 中斷向量 or 中斷 signal 的話
(簡單的說就是有 INT0 和 INT1 之類的)
利用一個電晶體來當作反向器,例如:
pin1 = output
pin2 = int0
pin3 = int1
pin4 = output
TC0 = 計數/計時器 counter
把接到 pin2 的訊號經過一個反向器(也就是當 pin2 = 1 時 pin3 = 0,反之亦然)
然後程式一開始:pin2 = 1, pin3 = 0(因為一開始,所以 pin3 的中斷應該會被清除)
falling edge :pin2 = 0, pin3 = 1,int0 被觸發
在 int0 中取得 TC0 並重設 TC0,像是 T_Rising = TC0, TC0 = 0
rising edge :pin2 = 1, pin3 = 0,int1 被觸發
在 int1 中取得 TC0 並重設 TC0,像是 T_Falling = TC0, TC0 = 0
那就看你是要看 rising to falling 還是要看 falling to rising 的時間
例如在 int0 中取得 TC0並計算完 T_Rising 後,以 pin1 來表示上昇脈波的寬度:
if ( T_Rising > 1ms )
pin1 = 1
else
pin1 = 0
或是在 int1 中取得 TC0 並計算完 T_Falling 後,以pin4 來表示下降脈波的寬度:
if ( T_Falling > 1ms )
pin4 = 1
else
pni4 = 0
以上
--
我是路人甲
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 123.205.238.166
討論串 (同標題文章)
ASM 近期熱門文章
PTT數位生活區 即時熱門文章