一個(gè)常見的問題是,“我如何使用數(shù)字輸入來計(jì)數(shù)事件?”
該問題針對(duì)以下產(chǎn)品(不是最終列表)提出:
USB-DIO24/48/96(H)
USB-1024(H)LS
PCI-DIO24/48/96(H)
PCIe-DIO24/96H
USB/PCI /CIO/PC104/E-PDISO8/16
以及任何具有附加 DIO 功能的模擬輸入或輸出板。
這里用偽代碼解釋,講述編程過程:
這些設(shè)備不包含計(jì)數(shù)脈沖的功能(它們確實(shí)有,但只有 1 個(gè)通道),只能告訴您某些東西是打開還是關(guān)閉。
您最好使用內(nèi)置該功能的USB-QUAD08 之類的東西。
除此之外,您需要使用一個(gè)計(jì)時(shí)器,該計(jì)時(shí)器的時(shí)鐘頻率至少是按下按鈕的頻率的兩倍。這樣您就不會(huì)錯(cuò)過按鈕按下事件。
每次按下按鈕不超過一次的方法是跟蹤按鈕的最后位置。例如,假設(shè)按鈕在關(guān)閉時(shí)為 0,按下時(shí)為 1。
在初始計(jì)時(shí)器滴答聲中,數(shù)字輸入/按鈕將讀取 0(未按下),并保持這種狀態(tài),直到有人按下按鈕。您讀取該值,并將其復(fù)制到名為“Last”的變量中
在未來的某個(gè)時(shí)間索引,有人按下按鈕,它變成了數(shù)字輸入讀取的 1(按下)。
您會(huì)將其與“上次”讀數(shù)進(jìn)行比較,如果上次讀數(shù)設(shè)置為 0 且當(dāng)前讀數(shù)為 1,則您將計(jì)數(shù)器遞增(加 1)并將“上次”變量更新為 1。
Timer Tick 的下一次迭代,您仍然會(huì)看到該輸入的 1,將其與“Last”讀數(shù) 1 進(jìn)行比較,您知道它尚未發(fā)布,因此您不要增加您的計(jì)數(shù)器,也不要更新 Last。
在 Timer Tick 的下一次迭代中,輸入又回到 0,現(xiàn)在您可以將 'Last' 變量再次更新為 0,并等待循環(huán)重復(fù)。
因此,在此方法中,您僅在“Last”的值為 0 時(shí)才增加計(jì)數(shù)器。
總之,您只在“Last”和當(dāng)前讀數(shù)分別為 0 和 1 時(shí)增加計(jì)數(shù)器,當(dāng)它們都為 1 時(shí)不增加計(jì)數(shù)器,并且當(dāng)“Last”為 1 且當(dāng)前讀數(shù)為 0 時(shí)不增加。
明白了嗎?
這種技術(shù)可用于任意數(shù)量的數(shù)字輸入,以及幾乎任何編程語言。