Untitled Document

RS Components 為您呈遞最新的工程資訊

還不是
RS Components
的用戶?

立即註冊,可收到最新的產品、
技術和推廣資訊。

帶 ATiny 的時間/間隔測量儀

作者: Vladimir Mitrovic, Croatia

本專案要說明的是,用很少的硬體就能製成一個多功能的時間及間隔測量儀,帶有易於讀數的LCD顯示幕。ATtiny2313型的AVR微控制器可以測量輸入針腳PD2和PD3的脈衝的兩個連續邏輯電平轉換之間的時間間隔。在微秒(μs)級,時間間隔的測量範圍為10微秒到30分鐘(!),測量精度為1微秒。在毫秒(ms)級,時間間隔的測量範圍為1毫秒到4小時,測量精度為1毫秒。

在電路中,DIP開關組S2決定了儀器的設置,具體如下:

  • S2 1-8: 選擇開始測量的脈衝邊沿(上升或下降)。
  • S2 2-7: 選擇結束測量的脈衝邊沿(上升或下降)。
  • S2 3-6: 測量單位和精度(μs或ms)
  • S2 4-5: 測量模式(連續或單次/保持)

開關組功能和選項的詳細說明請見表1。測量結果顯示在一個 LC 顯示幕上,分兩行顯示,16個字元。第一行顯示了所選的時間間隔、測量單位和測量模式,秒數和測量時間。

表 1
S2 1-8 S2 2-7 S2 3-6 S2 4-5 測得的時間間隔
x x 從下降邊沿到下一個下降邊沿。
x x 從下降沿到上升沿(2 個正脈衝的時間間隔)。
x x 從上升沿到下降沿(正脈衝持續時間)。
x x 從上升沿到下一個上升沿。
x x x 測量單位為 μs (t(min)=10μs, t(max)=1800s (30m))。
x x x 測量單位為 ms (t(min)=1ms, t(max)=14400s (4h))。
x x x 連續測量:當一次測量已結束且其結果已顯示時, 開始一次新的測量
x x x 單次測量:當一次測量結束其結果顯示時,程式停止。
(x = 無關項)


元件列表
電阻器 RS庫存號
R1,R3 = 10kΩ
R2 = 1kΩ
R4 = 39Ω
R5 = 1kΩ8
P1 = 10kΩ (預設) 522-2485
電容器 RS庫存號
C1 = 22μF 35V radial 707-5701
C2,C3,C6 = 100nF 537-3909
C4 = 47pF 微調
C5 = 22pF 537-3634
半導體 RS庫存號
D1 = 1N4001 628-8931
D2,D3 = BAT41 544-4679
D4 = 低電流 LED 826-492
IC1 = 78L05 398-552
IC2 = ATtiny2313, Elektor Shop # 080876-41 738-0621
其他 RS庫存號
S1 = 觸覺開關,6mm 尺寸 378-6498
S2 = 4 路 DIP 開關 702-3331
K1,K2 = PCB 安裝端子,引腳間距 5mm (0.2”) 467-0388
K3 = 10 路方形針座 251-8272
X1 = 8MHz 石英晶體 478-9347
LCD1 = LCD模組,2 行,16字元 294-8774
LCD 針座16 路 1 行 0.1" 間距 673-7499
LCD 插排16 路 1 行 0.1" 間距 509-2880
PCB,參考 080876-I www.elektor.com
/080876


LED D4在測量期間會點亮,而在兩次測量的間隔及保持期間熄滅。其主要目的在於,在較長的測量期間指示“測量進行中”。當然你也可以視自身喜好略去LED和R5。

在微秒級,ATtiny2313 內的8位計時器/計數器0設置為比较匹配輸出B處在啟動狀態的正常模式,計算預分頻的系統同步脈衝發生器脈衝。使用一個8MHz石英晶體且将分頻器的除數設定為8,計時器/計數器0每微秒以1 递增。輸出比較寄存器B設定為 255,每到第256個脈衝時會觸發輸出比較針腳 (OC0B)。OC0B針腳與計時器/計數器1輸入端內部連接,而計時器/計數器1則計算OC0B上收到的這些脈衝,計算精度為16位。通過這種方式,我們便製成了一個25位元的硬體計數器(16位元T/C1+OC0D位 + 8位T/C0)。

該軟體可實現額外的6位精度。在測量過程中,程式迴圈運行,等待停止測量信號,且不斷收集計時器/計數器1的溢位元標記TOV1。如果設定了TOV1,則程式會將6位元SW計數器值增加1並清除TOV1。此時不必造成迴圈中斷,因為中斷可能會延遲停止狀態的識別。一個31位的計數器可以計算高達2147483647微秒。

出於實用考慮,微秒級最大測量時間定為1800000000微秒(30分鐘)。毫秒級也是通過大致相同的方式實現,但將系統時鐘的分頻係數設定為8。測量後,把結果除以125,可得出最大值17179869毫秒。同樣出於實用考慮,毫秒級最大測量時間定為14400000毫秒(4小時)。

當ATtiny的針腳PD2(觸發斜率取決於S2 1-8的設置)識別到一個下降或上升邊沿時,測量開始,同時執行外部中斷向量INT0。當針腳 PD3(觸發斜率取決於 S2 2-7的設置)識別到一個下降或上升邊沿時,測量停止,同時執行外部中斷向量INT1。

為該專案編寫的程式可以從[1]免費下載。此類程式用BascomAVR編寫,內嵌有中斷匯編碼並插入了計時要求很高的程式。在主迴圈內,程式反復監控S2中的開關,啟動測量並顯示測量結果。與之前的讀數相比,開關的設置一發生變化,即可確定新的測量級別和模式并/或開始/停止斜率,顯示幕上的第一行顯示內容也會相應更新。

在測量例行程式開始時,計時器/計數器和軟體計數器( 26-31 位)清零,OC0B位重置,且外部中斷INT0啟用。之後程式迴圈運行,等待發生INT0中斷,觸發INT0中斷程式。在該程式中,計時器/計數器0啟動後,部分計數器被設置成初始值,LED D3點亮,INT0中斷關閉以避免再次觸發,而INT1中斷開啟。程式繼續迴圈運行,等待INT1中斷發生,INT1 發生中斷時將觸發INT1中斷程式。在該程式中,計時器/計數器0停止,且往後的外部中斷被禁用。

程式開始時,計時器/計數器1啟動,並且在程式運行過程中無需停止和重新啟動:因為它會計算來自計時器/計數器0的脈衝,從而使計時器/計數器0同時啟動和停止。

當測量程式探測到兩個外部中斷都被禁用時,一次測量即告完成。測量結果從硬體(HW) 和軟體 (SW) 寄存器收集得來,LED D3被關閉,計算後測得的時間間隔將顯示在顯示幕的下一行(第二行)。

至於精確度,計數器的HW部分計算時鐘脈衝,因此不可能有錯誤計數。而SW部分計算的計時器/計數器1溢位,則會有幾個週期數的延遲。但是,當計時器停止時,SW部分能實現與HW部分同步。INT0與INT1中斷程式是精心編寫而成,從程式開始到計時器/計數器0在一個程式開始、在另一個程式停止這段時間內,延遲是完全相同的。在外部中斷被觸發的時刻到中斷程式開始啟動的這段時間內,會有短時間的延遲。這段延遲的長短取決於中斷被觸發時正在執行的指令。指令在1-4 步脈衝發生器週期內執行,因此差異最大可達3個同步脈衝發生週期。但是,由於計時器/計數器0計算的系統時鐘要除以8,一次在兩個級別(微秒和毫秒)的最終計數僅產生一個±1的誤差。因此,對總體精度有顯著影響的唯一因素就是晶體精度 – 針對顯示幕上顯示“t=123456789 μs”的情形。

第二個需要考慮的因素是測量時間。在毫秒級,測量時間可能持續幾個小時。因此一個特別的SW計數器在等待迴圈中(在測量期內有兩個等待迴圈:等待開始信號和等待停止信號)被啟動。該計數器可計算預先設定的測量時間最大值,在這種情況下,計數器停止繼續測量並顯示“t>14400000”。在開始階段,測量時間的最大值設定為最大允許值,即微秒級為30分鐘,毫秒級為4小時。

與其他開關一樣,測量開始前讀取S2 4-5。但是,如果該開關關閉(並且單次/保持模式啟動),則程式以另一種方式運行:

在等待開始信號時,測量時間最大值計數器被阻止,但在等待停止信號時(在等待一次非重複的脈衝發生時,允許無限時等待時間,儘管脈衝持續時間仍被限制在測量時間最大值之內),它會再次開啟。

測量結果顯示在顯示幕上時,程式在迴圈中等待(持續監控S2 4-5);一旦打開開關,會立即繼續運行。

該專案附帶的Tmeter_Elektor.bas程式應在首次使用前寫入ATtiny2313微控制器。必須確保已為外部晶體諧振器 (CKSEL3…1,0 =1111)的Flash熔絲位CKSEL3...0設定一個合適的值,因為默認選擇的是內部RC振盪器。晶體的頻率必須剛好等於8.000 MHz,這非常重要,因為總體精度由此決定。您可使用一個微調電容器C4來微調晶體頻率。如果您對晶體的頻率很滿意,則可用一個固定電容器代替C4。您也可以用一個精確的石英振盪器來驅動微控制器;此時可不用C4、C5和X1,而把振盪器的輸出端連接到XTAL1的輸入端。調節P1以獲得最佳的顯示對比度。

在程式中,開始階段測量時間的最大值被設定為常數:

  • Const Tmax_us_default = 1800
    ‘max measuring time for us range [s]
  • Const Tmax_ms_default = 14400
    ‘max measuring time for ms range [s]

推薦使用上面所列的值作為測量時間最大值,當然您也可以用適當的較小值來代替這些推薦值,例如:

  • Const Tmax_us_default = 60
    ‘max measuring time for us range [s]
  • Const Tmax_ms_default = 300
    ‘max measuring time for ms range [s]

這樣就會把測量時間的最大值分別縮短到60微秒(微秒級)和300秒(毫秒級)。當然,改變這些最大值之後需要重新編寫程式並把改寫的程式重新寫入微控制器。選擇測量時間的最佳非常重要,因為如果輸入電平不變時(或電平躍遷發生過於緩慢時,程式將等待長達兩倍的測量時間最大值),程式迴圈運行並等待,等待的時間等於測量時間最大值。

改變測量時間最大值的另一個方法是在微控制器的EEPROM中把合適的值編成16位元無符號的二進位值,參見表2。這些值應以秒為單位。 程式的原理如下: 如果EEPROM為空(FFh),則使用程式中預先設定的測量時間最大值。 如果微秒級EEPROM的值大於1800,則使用程式中為微秒級預設的測量時間最大值。 如果毫秒級EEPROM的值大於14400,則使用程式中為毫秒級預設的測量時間最大值。任何在允許範圍內的EEPROM均將使用,此時將不採用程式中為該測量級別預設的測量時間最大值。

表 2
EEPROM 數值 EEPROM 評價
000 0000 LSB 最大微秒級測量時間 [s]
000 0001 MSB
000 0010 LSB 最大毫秒級測量時間 [s]
000 0011 MSB

在主程序迴圈開始時,將讀取配置開關組。長時間測量可能會造成混淆——因為在正在進行的測量未結束且測量結果未顯示出來之前,顯示幕上顯示的是舊的設置以及前一次的測量結果。在新開關設置後立即重置微控制器,即可加快這個過程。如要重置微控制器,請按“重置”按鍵。

在單次/保持模式下,您可以按下述方法開始新的測量:

開啟S2 4-5以重新開機持續測量模式或重新設置微控制器以重新開機單次/保持模式(採用這種方法,無法通過快速打開和關閉 S2 4-5重新開機保持模式)。

最後,輸入脈衝應該有一個TTL或CMOS相容邏輯電平。正確定義邊沿非常重要,即無跳動和振盪的邊沿。

網路連結
[1] www.elektor.com/080876
下載與產品
PCB: 080876-1 PCB 設計,下載地址: www.elektor.com/080876
程式控制器: 080876-41 ATtiny 2313,可程式設計
軟體: 080876-11 Bascom 和彙編代碼程式

瀏覽更多工程文章,請瀏覽 www.designspark.com, 是一個平台提供網上資源及設計支援給工程師,由RS提供。

回到頁首