資料介紹
描述
概述
很多時候,需要產(chǎn)生可編程頻率輸出或?qū)崿F(xiàn)用于各種用途的頻率計數(shù)器。該項目僅使用低成本(≈5-17 美元)Pro Micro(Sparkfun DEV-12640 或等效克?。┠K實現(xiàn)這些功能塊中的一個或兩個,該模塊帶有 ATMega32U4 處理器芯片和使用 Arduino IDE 編譯器和環(huán)境實現(xiàn)的軟件。這些功能塊可以單獨使用,也可以在更大的應(yīng)用程序中一起使用,或者作為獨立設(shè)備使用。由于它們是獨立的功能,因此將分別進行介紹。作為該項目的一部分,還包括一個通用主模塊,可用于設(shè)置頻率發(fā)生器或從頻率計數(shù)器讀取頻率。這可以通過串行端口完成,或者,
與本網(wǎng)站上列出的許多項目不同,該項目沒有實現(xiàn)一些最終設(shè)備,而是專注于頻率發(fā)生器和頻率計數(shù)器的功能塊。假設(shè)用戶隨后將編寫一個主模塊,將這些模塊部署到所需的任何目的,并且可能包括 LCD 顯示器、鍵盤或其他外部接口,或者可能是用戶需要的某個更大項目的一部分。最后,由于頻率發(fā)生器和頻率計數(shù)器都依賴于Pro Micro通常未經(jīng)校準(zhǔn)的內(nèi)部晶振,因此詳細說明如何修改模塊以提高振蕩器的精度。
應(yīng)該注意的是,也可以使用其他帶有 ATMega32U4 處理器的 Arduino 模塊,包括 Arduino Leonardo 和 Arduino Micro 以及可能的其他模塊。
頻率發(fā)生器
該庫使用 Arduino Pro Micro 模塊(使用 ATMega32U4)上的 Timer 4 實現(xiàn)可變頻率發(fā)生器。該信號可用于向任何用戶定義的設(shè)備或電路輸出可調(diào)節(jié)頻率的方波信號。使用 Pro Micro 模塊本身包含的硬件,頻率發(fā)生器將輸出具有 50% 占空比的方波信號,從 1 Hz 到大約 12MHz。它可以在使用模塊的所有其他功能的同時使用。此處理器/模塊上的定時器 4 的獨特之處在于它可以連接到處理器主時鐘,也可以連接到 ATMega32U4 中包含的 PLL,提供更高的初始頻率和一些額外的縮放值,包括 1.5x 時鐘,提供更多的計數(shù)組合值以產(chǎn)生更接近任何所需頻率的輸出信號。
用于設(shè)置頻率的固件包含一種獨特的算法,可通過從三個不同的輸入時鐘頻率之一(通過片上 PLL)、二進制預(yù)分頻器值和一個計數(shù)值。對于所有這些變量,如果必須從外部確定這些變量,則每個變量要獲得給定頻率的設(shè)置可能具有挑戰(zhàn)性。通過固件中包含的算法,固件本身為這三個值中的每一個確定最佳值,以使輸出頻率盡可能接近請求值。一旦計算和設(shè)置了這些值,
發(fā)電機硬件
Pro Micro 模塊將在 Arduino Digital 引腳 5(處理器引腳 PC6)上輸出選定的頻率時鐘信號,作為 0-5V 50% 占空比的方波信號,無需對控制器進行進一步修改。或者,如果需要,也可以將輸出配置為在 Arduino 數(shù)字引腳 10(處理器引腳 PB6)上輸出信號。下圖顯示了 Pro Micro 模塊上頻率發(fā)生器輸出的引腳。

根據(jù)您的應(yīng)用,可能不需要額外的電路,但如果需要與模塊輸出引腳不同的電平或更大的功率,則可能需要外部放大器、電平轉(zhuǎn)換器或電阻分壓器。還顯示了一個 5V 電源,如果需要,它可用于為該外部電路供電,其功率要求小于 100mA。
該發(fā)生器的頻率精度與 Pro Micro 模塊上的晶振直接相關(guān),通常在 0.1-0.2% 之間,但通常比這更接近標(biāo)稱頻率。如果需要更高的精度,請參閱下面的部分,詳細說明對 Pro Micros 晶體振蕩器的修改。頻率精度還與處理器芯片的各個寄存器中設(shè)置的值有關(guān)。雖然該算法試圖確定 PLL、預(yù)分頻器和計數(shù)器的最佳值,但有些頻率是硬件無法獲得的,無需額外的軟件干預(yù),這超出了本項目的范圍。幾乎所有較低的頻率(低于約 5KHz)都是完美的(或接近完美的),這意味著模塊可以輸出準(zhǔn)確的頻率,但隨著要求的頻率越來越高,將存在無法實現(xiàn)準(zhǔn)確頻率的“差距”。在這些情況下,將設(shè)置可獲得的最接近的頻率,并且通常對于大多數(shù)應(yīng)用來說足夠接近。輸出的占空比固定為 50%。
發(fā)生器軟件接口功能
該庫在一個名為“FrequencyGenerator”的類中實現(xiàn)。這個類有兩個函數(shù):“set”和“read”來設(shè)置頻率發(fā)生器和讀取發(fā)生器設(shè)置的當(dāng)前頻率。
** 設(shè)置功能 **
使用頻率設(shè)置命令設(shè)置頻率,該命令將頻率設(shè)置為最接近的可獲得值。函數(shù) 'FrequencyGenerator::set' 接受一個長整數(shù),它是以赫茲為單位輸出的頻率。這可以從小于 0(返回電流頻率)的值到 0(發(fā)電機關(guān)閉)到超過微時鐘頻率(8MHz)的 1/2 的值。在現(xiàn)有的 Pro Micro 模塊可用的情況下,據(jù)觀察它的工作頻率約為 12MHz。如果設(shè)置了請求的頻率,則“FrequencyGenerator::set”函數(shù)返回設(shè)置的頻率,如果無法設(shè)置為所需的頻率,則返回 -1。由于定時器設(shè)置為自動重新加載,因此不需要中斷或其他軟件開銷——只需調(diào)用該函數(shù),然后硬件將產(chǎn)生輸出頻率,無需額外干預(yù)。
要關(guān)閉頻率發(fā)生器,只需調(diào)用頻率為零的“FrequencyGenerator::set”函數(shù)。這將禁用頻率發(fā)生器并將其輸出引腳置于高阻抗?fàn)顟B(tài)。也可以通過使用 -1(或任何負(fù)數(shù))調(diào)用“FrequencyGenerator::set”函數(shù)來請求當(dāng)前頻率。
** 讀取功能 **
還提供了一個函數(shù)“FrequencyGenerator::read”來請求頻率發(fā)生器模塊的當(dāng)前頻率。返回的值將是控制器輸出的實際頻率(以及硬件能夠輸出的最接近的值),并且可能與上次設(shè)置的頻率略有不同。這以長整數(shù)形式返回。
生成器代碼詳細信息和選項
頻率發(fā)生器功能包含在文件“FrequencyGenerator.cpp”中。包含類原型的頭文件位于文件“FrequencyGenerator.h”中。該模塊是專門為 Pro Micro 設(shè)備(或具有類似功能塊的其他微控制器設(shè)備)上的 ATMega32U4 的定時器 4 編寫的,假設(shè)控制器作為 USB 設(shè)備運行,PLL 設(shè)置為 96MHz,晶振為 16MHz(這是Pro Micro 設(shè)備的默認(rèn)設(shè)置)。它可能會為其他計時器重新設(shè)計,但分辨率會更低。
“FrequencyGenerator.cpp”模塊中的代碼包含將處理器中的各種寄存器設(shè)置為所需輸入頻率的最佳值的算法。它通過連續(xù)對每個 PLL 設(shè)置進行計算,然后確定哪個 PLL 設(shè)置提供最接近所需值的輸出頻率來實現(xiàn)。預(yù)分頻器和計數(shù)值通過計算所需頻率的 log2 來確定,然后將其轉(zhuǎn)換為寄存器的預(yù)分頻器和計數(shù)值。一旦確定了最佳組合,就將物理寄存器設(shè)置為這些值。代碼中的注釋更詳細地詳細說明了該算法。
在 FrequencyGenerator.cpp 模塊中有 2 個條件編譯定義,可以定義也可以不定義。其中之一是“FRQGENUSEPB6”,如果定義為非零,將使用 Arduino 數(shù)字引腳 10(處理器引腳 PB6)作為發(fā)生器的輸出,而不是默認(rèn)的 Arduino 數(shù)字引腳 5(處理器引腳 PC6)。另一個定義是“FRQGENDEBUG”,如果定義為非零,則在設(shè)置頻率以進行調(diào)試時會將一些變量值輸出到串行端口。
頻率計數(shù)器
該庫使用屬于 Pro Micro 模塊的硬件定時器/計數(shù)器資源來實現(xiàn)頻率計數(shù)器。它使用定時器 0 和另一個定時器作為 Pro Micro 模塊上的“門”定時器。它既可以用作傳統(tǒng)頻率計數(shù)器,通過在固定時間(門限時間)內(nèi)對輸入引腳上發(fā)生的脈沖數(shù)進行計數(shù),也可以用作周期計數(shù)器,其中輸入波形的單個或多個周期的時間被測量。傳統(tǒng)的頻率計數(shù)模式最適合測量較快的信號,而周期測量模式在測量較低頻率的信號時提供更高的亞赫茲分辨率。該模塊的接口是通過 2 到 3 個主要功能。第一個函數(shù)向用戶提供讀取頻率,而第二個功能將頻率計數(shù)器設(shè)置為傳統(tǒng)計數(shù)模式或周期測量模式,還設(shè)置門時間或輸入脈沖數(shù)以進行平均。如果需要,可以使用另一個功能來確定是否有新的“新”讀數(shù)可用。由于該模塊使用硬件定時器和中斷例程來實現(xiàn)頻率計數(shù)器,因此除了用戶需要編寫的任何代碼之外,它還可以在使用 Pro Micro 模塊和 Arduino 環(huán)境的所有其他功能的同時使用。
當(dāng)計數(shù)器配置為傳統(tǒng)計數(shù)模式時,定時器 0 配置為對輸入脈沖進行計數(shù),第二個定時器(定時器 1)用作門控源。計數(shù)時,每次 Timer 0 溢出時,中斷例程都會將保存的計數(shù)變量加一。門控計時器 (Timer 1) 用于定期將此累積計數(shù)移動到另一個變量,然后在請求頻率時將其返回給用戶,然后重置 Timer 0 計數(shù)器中的計數(shù)(以及保存的計數(shù)變量)下一個周期。門控定時器可以配置為 10 毫秒、100 毫秒、1 秒、10 秒或 100 秒之一。門控定時器也是中斷驅(qū)動的,因此計數(shù)器模塊可以準(zhǔn)確地計時門控窗口。
當(dāng)計數(shù)器處于周期測量模式時,定時器 0 用于對輸入引腳上的單次跳變或多次跳變進行計數(shù)。系統(tǒng)微秒計數(shù)(即 Arduino 環(huán)境的一部分)在收到第一個轉(zhuǎn)換時保存,然后當(dāng)?shù)诙€轉(zhuǎn)換發(fā)生時,再次讀取微秒值并從中減去保存的微秒值以確定周期的輸入信號。然后當(dāng)用戶請求頻率時,將該值轉(zhuǎn)換為頻率并返回給用戶。在周期測量模式下,可以使用三種平均模式中的一種。可選擇不平均或平均 10 或 100 個輸入脈沖。這種平均是通過設(shè)置定時器 0 計數(shù)器在 1、10 或 100 次轉(zhuǎn)換時產(chǎn)生中斷來完成的,
計數(shù)器硬件
頻率計數(shù)器的輸入位于 Pro Micro (ATMega32U4) 的 Arduino 數(shù)字引腳 6(處理器引腳 PD7)上,并假定為要計數(shù)的低脈沖序列。下圖顯示了計數(shù)器輸入以及外部門輸入引腳(稍后詳述)。外部門輸入(如果使用)位于 Arduino 數(shù)字引腳 9(處理器引腳 PB5)上,但如果需要,可以移動到另一個引腳。

顯然,輸入信號必須是適當(dāng)?shù)?TTL 電平才能被計數(shù)。將較低電平信號放大到這個 TTL 電平(如果需要)的輸入放大器超出了這項工作的范圍。還展示了一個 5V 電源,如果需要,它可用于為任何外部電路供電,其功率要求小于 100mA。
此計數(shù)器的頻率精度與 Pro Micro 模塊上的晶振直接相關(guān),通常在 0.1-0.2% 之間,但通常更接近實際頻率。如果需要更高的精度,請參閱下面的部分,詳細說明對 Pro Micros 晶體振蕩器的修改。
精度還與傳統(tǒng)頻率計數(shù)器模式的門控定時器和周期測量模式的毫秒定時器的精度直接相關(guān)。在這個項目中,這兩個定時器都是中斷驅(qū)動的,這意味著它們在沒有任何軟件干預(yù)的情況下自主發(fā)生,并且在 Arduino 環(huán)境中盡可能接近立即發(fā)生。雖然中斷程序有一些開銷,但這通??梢院雎圆挥?,并且讀取的頻率通常非常接近或通常完全正確的頻率。
對該項目開發(fā)期間可用的不同模塊進行的測試表明,在傳統(tǒng)的頻率計數(shù)器模式下,Pro Micro 模塊能夠可靠地計算高達約 8MHz 的頻率(處理器時鐘頻率的 1/2)。在周期測量模式下,該模式旨在以更高的分辨率測量較低頻率,當(dāng)平均設(shè)置為 10 和 100 和 10 KHz 時(平均值為 1),最高 20 KHz 的頻率是可能的且可靠的。在周期測量模式下,如果頻率高于這些值,模塊將報告值“999999”或在極少數(shù)情況下報告錯誤值。
如果應(yīng)用需要測量高于約 8 MHz 的頻率,則可以在將輸入信號連接到此計數(shù)器模塊之前將外部分頻器鏈(預(yù)分頻器)添加到輸入信號中,然后相應(yīng)地調(diào)整此模塊返回的值。一個 74196 或一組 74F74 可用于高達約 60-100MHz 的頻率,而其他預(yù)分頻器 IC 可用于更高的頻率。如果使用預(yù)分頻器,則可以將“FrequencyCounter.cpp”模塊中名為“FCPRESCALER”的定義調(diào)整為除數(shù),以便使用預(yù)分頻器時返回的輸出頻率是正確的。
計數(shù)器軟件接口功能
該庫在一個名為“FrequencyCounter. 這個類有兩個主要功能和幾個可能需要的輔助功??能,具體取決于選擇的具體實現(xiàn)。
** 模式功能 **
第一個函數(shù)“FrequencyCounter::mode”用于設(shè)置或讀取計數(shù)模式,包括模式和門時間或平均次數(shù)。這使用單個參數(shù)調(diào)用,該參數(shù)指定要使用的模式,或請求當(dāng)前模式。如果輸入?yún)?shù)為 -1(或任何小于 0 的值),則函數(shù)返回當(dāng)前模式值。如果輸入?yún)?shù)在 0 到 9 的范圍內(nèi),則設(shè)置以下模式:

如果輸入?yún)?shù)超出上述值的范圍,該函數(shù)總是返回當(dāng)前選擇的模式或 -1。模式 6 到 9 可能存在也可能不存在,具體取決于模塊的編譯方式。如果在沒有參數(shù)的情況下調(diào)用“FrequencyCounter::mode”函數(shù),它將返回當(dāng)前模式。
** 讀取功能 **
第二個函數(shù)“FrequencyCounter::read”用于讀取頻率計數(shù)器并返回一個字符串,該字符串是讀取頻率的數(shù)字浮點值。調(diào)用此函數(shù)時,會使用一個指向?qū)⒂稍摵瘮?shù)填充的字符串緩沖區(qū)的指針和一個名為“Wait”的參數(shù),如果非零將導(dǎo)致該函數(shù)等待,直到頻率計數(shù)器的新“新”讀數(shù)為可用的。該函數(shù)返回一個指向包含此頻率值的字符串的指針,其格式為“12345678”或“12345.67890”(或類似)。傳遞給此函數(shù)的字符串緩沖區(qū)位置必須足夠大以容納此函數(shù)將創(chuàng)建的字符串——建議使用 15 個或更多字符。參數(shù) 'Wait' 應(yīng)該為零以獲取最后讀取的頻率,或非零以等待新的“新”頻率計數(shù)。需要注意的是,如果調(diào)用函數(shù)時將 'Wait' 參數(shù)作為非零值,則函數(shù)可能需要長達 100 秒才能返回,具體取決于頻率計數(shù)器模塊所處的模式。如果這是不可接受的,還可以使用輪詢功能來查看是否有新的頻率讀數(shù)可用。此函數(shù)返回一個可以是浮點值的字符串,而不是實際的二進制浮點值類型,因此不需要編譯器的浮點函數(shù)(占用大量代碼空間)。
** 可用功能 **
如上一段所述,還包括確定是否有新的“新”頻率讀數(shù)可用的功能。函數(shù) ''FrequencyCounter::available'' 不需要參數(shù),如果新值準(zhǔn)備好則返回 1,如果新值未準(zhǔn)備好則返回 0。
大多數(shù)用戶只需要上面提到的兩個或三個功能。在特殊情況下,還可以使用其他一些功能。
** 讀取二進制函數(shù) **
當(dāng)函數(shù) ''FrequencyCounter::read'' 僅使用“Wait”參數(shù)(并且沒有指向字符串參數(shù)的指針)調(diào)用時,讀取函數(shù)返回一個長整數(shù),它是讀取頻率的未更正計數(shù)或周期。然后,用戶必須根據(jù)應(yīng)用程序的需要將其縮放/轉(zhuǎn)換為適當(dāng)?shù)闹怠?/font>與 ''FrequencyCounter::read'' 函數(shù)的字符串版本一樣,此函數(shù)也接受一個 'Wait' 參數(shù),其工作方式與該函數(shù)相同。此功能通常不使用,但在其他代碼(可能在主機應(yīng)用程序中)出于任何原因需要讀取未更正的二進制值的情況下可用。請參閱此函數(shù)的字符串版本的代碼,了解如何縮放此值并將其轉(zhuǎn)換為浮點字符串,以了解此未更正的值如何“更正”。
** FreqCtrGateISR 函數(shù) **
最后,如果不需要與系統(tǒng)定時器的默認(rèn)鏈接及其 10mS 中斷,則用戶例程可以調(diào)用名為“FreqCtrGateISR”的函數(shù)。該函數(shù)不是類的一部分,不接受任何參數(shù)并且不返回任何內(nèi)容。(如果使用已發(fā)布的默認(rèn)庫文件,則不需要此功能。)
計數(shù)器代碼詳細信息和選項
頻率計數(shù)器功能包含在文件“FrequencyCounter.cpp”中。包含類原型的頭文件在文件“FrequencyCounter.h”中。該模塊包含上述功能的代碼。根據(jù)該項目用戶所需的配置,可能還需要模塊“SysTimer.cpp”和“PCInterrupt.cpp”。
在傳統(tǒng)的頻率計數(shù)器模式中,該模塊需要一個“門控”源,該源通常是一個以固定時間速率發(fā)生的不同定時器。如果不使用提供的“SysTimer.cpp”模塊,則需要以適當(dāng)?shù)闹芷谒俾剩?0mS)調(diào)用函數(shù)“FreqCtrGateISR”。這個模塊的精度直接受這個門控時序源的精度影響!
計數(shù)器系統(tǒng)定時器和處理器資源
該模塊專為使用 Atmel ATMega32U4 的 Arduino Pro Micro 模塊而設(shè)計,并使用 Timer 0 作為計數(shù)輸入。最好使用另一個定時器來實現(xiàn)此功能,但不幸的是,定時器 1 的外部時鐘引腳(ATMega32U4 引腳 26)沒有連接到模塊連接器,只有定時器 0 和定時器 1 有外部時鐘輸入,因此沒有其他選擇除了使用 Timer 0。眾所周知,Timer 0 通常用于 Arduino 系統(tǒng)計時功能(延遲、毫秒、微秒等),因此唯一的選擇是將這些功能移至其他計時器。這是通過重新設(shè)計作為 Arduino 系統(tǒng)一部分的 stock Wiring.c 模塊以為此目的使用不同的計時器來完成的。然后這個“系統(tǒng)”定時器被擴展為也用于頻率計數(shù)器功能的門定時器。
通過在構(gòu)建中簡單地包含“SysTimer.cpp”,通常由 Timer 0 實現(xiàn)的功能(延遲、毫秒、微秒等)被移動到使用這個備用計時器(可配置為 Timer 1 或 Timer 3),以及一個掛鉤到定時器的中斷服務(wù)程序 (ISR) 是可訪問的,允許該定時器用于頻率計數(shù)器門控功能。最好將定時器 1 用于門,因為它具有最高的中斷優(yōu)先級(甚至高于定時器 0),但定時器 1 或定時器 3 都可以使用。如果用戶的應(yīng)用程序不包含 SysTimer 模塊,則它必須使用必須編寫的其他代碼調(diào)用函數(shù)“FreqCtrGateISR”。如果需要,SysTimer 模塊還可用于頻率計數(shù)器以外的其他用途。
顯然,當(dāng)為“系統(tǒng)”定時器功能和頻率計數(shù)器門控功能使用備用定時器時,定時器將不適用于 PWM 功能或任何其他 Arduino“內(nèi)置”庫函數(shù),通常取決于定時器 0 或為Arduino 軟件中的“系統(tǒng)”定時器。
需要注意的是,如果使用 USB 與 Pro Micro 模塊通信,則返回的計數(shù)可能不如使用其他或不使用外部通信方式時精確。這是因為 USB 中斷的優(yōu)先級高于用于門控定時器的定時器 1/定時器 3 定時器。一種可能的替代方法是為門控時間設(shè)置另一個定時器并將其輸出到引腳上,然后使用引腳更改或外部中斷作為門控定時器源(引腳更改和外部中斷的優(yōu)先級高于 USB 中斷)。另請注意,當(dāng)測量高于約 2MHz 的頻率時,返回的計數(shù)在極少數(shù)情況下可能會少一兩個計數(shù)。這是因為該模塊中的代碼必須清除計數(shù)器,將其關(guān)閉然后重新打開,這需要幾個 CPU 周期。
計數(shù)器外部門控
該頻率計數(shù)器模塊也可以設(shè)置為使用外部選通。為此,將“FCEXTERN”定義為非零,并在此草圖中包含模塊“PCInterrupt.cpp”。然后通過將“模式”功能設(shè)置為 6,由“FCEXTGATEMSK”定義的 Arduino 引腳將用作門輸入。默認(rèn)情況下,此信號在 Arduino 數(shù)字引腳 9(處理器引腳 PB5)上輸入,但如果需要,可以移動到另一個引腳。有關(guān)“PCINTMASKxx”引腳列表,請參見“PCInterrupt.h”——這些引腳中的任何一個都可以使用。激活時,此引腳上的低電平打開柵極,高電平時關(guān)閉柵極。包括外部門功能是可選的,但包括在分發(fā)文件中的定義。添加外部門控功能會使模塊的代碼大小增加約 250 字節(jié)。如果不包括在內(nèi),
使用外部門功能和另一個定時器設(shè)置為自主工作,然后在其他引腳上輸出其信號,然后將此引腳連接到“外部門”輸入是解決上述 USB 問題的一種可能方法,該問題可能會影響計數(shù),因為外部門輸入的優(yōu)先級都高于 USB 中斷。
計數(shù)器周期測量模式
在周期測量模式下使用頻率計數(shù)器模塊時,定時器 0 用于檢測輸入引腳上的轉(zhuǎn)換,然后使用 Arduino 系統(tǒng)微秒計數(shù)器測量這些轉(zhuǎn)換之間的微秒數(shù)。在這種模式下,輸入仍然在同一個 Timer 0 輸入引腳上,但不是計算在給定時間內(nèi)發(fā)生的脈沖數(shù),而是將 Timer 0 設(shè)置為在第一次、第十次或第 100 次轉(zhuǎn)換時產(chǎn)生中斷測量計時器 0 輸入和在其中兩個轉(zhuǎn)換之間經(jīng)過的微秒數(shù),然后將其轉(zhuǎn)換為頻率。這允許在最短時間內(nèi)更準(zhǔn)確地測量低頻信號。當(dāng)定時器 0 設(shè)置為計數(shù) 10 次轉(zhuǎn)換時,這有效地平均了輸入信號的 10 個周期,當(dāng)設(shè)置為 100 時,它平均輸入信號的 100 個周期。包括周期測量模式是可選的,并且僅在定義“FCPERIOD”被定義為非零值(它用于分發(fā)文件)時才包括在內(nèi)。包括周期測量模式會增加模塊的代碼大小約 1000 字節(jié)。
周期測量模式的計數(shù)器超時
使用傳統(tǒng)頻率計數(shù)模式時,函數(shù)'FrequencyCounter::read'保證在固定時間后返回;但是在周期測量模式下,如果沒有輸入信號,則永遠不會發(fā)生新的“新”頻率計數(shù),讀取函數(shù)也不會返回。在某些情況下,這可能是有問題的。為保證此功能在給定時間后始終返回,頻率計數(shù)器模塊包含一個超時計數(shù)器,當(dāng)使用周期測量模式時,該超時計數(shù)器將在給定時間后超時。這個超時定時器使用與門計數(shù)器相同的定時器中斷,并且是函數(shù)“FreqCtrGateISR”的一部分。如果未找到輸入,則在此計時器超時后,將報告一個新的零赫茲頻率(并且頻率讀取函數(shù)將返回)。此超時值默認(rèn)為 5 秒,但如果需要,可以通過更改定義的“PERIODTIMOUT”的值來更改。如果此定義為 0,則期間測量功能將不包含任何超時功能。
主模塊
如介紹中所述,該項目還包括一個“主”模塊(FreqGenCtrApp.ino),用于測試頻率發(fā)生器和頻率計數(shù)器模塊。它提供了一個簡單的 ASCII 命令接口,其中大部分是 1 或 2 個字符命令來控制作為該項目一部分的模塊,或者可以通過添加 4 個按鈕開關(guān)和一個 LCD 顯示器來創(chuàng)建一個獨立的設(shè)備。它可以與頻率發(fā)生器模塊或頻率計數(shù)器模塊或兩者一起使用。該模塊的使用是可選的,只是為了提供一種方便的方式來測試和驗證該項目的兩個功能塊的操作,并向用戶展示如何調(diào)用該項目中的每個功能。
串行接口
“FreqGenCtrApp.ino”模塊包含代碼和定義,允許它使用 USB 虛擬 com 端口作為它的命令接口,或者它可以選擇使用 Pro Micro 的 UART 串??行接口作為同一接口。將“COMM”#define 定義為“Serial”將使用 USB 接口,而將其定義為“Serial1”將使用 UART 接口。該模塊還包含一個簡單的 printf 接口,允許使用編譯器的 printf 函數(shù)。
** 串行命令 **
主模塊解釋的命令大多是 1 或 2 個字符的命令,以

獨立設(shè)備
因為相信許多用戶會想要一個簡單的獨立頻率發(fā)生器和/或頻率計數(shù)器而不自己編寫它,所以主模塊還包括一個簡單的控制器,它使用 4 個按鈕開關(guān)和一個 2x16 LCD 顯示器來實現(xiàn)兩者的這些功能。其中兩個按鈕控制頻率發(fā)生器,而另外兩個按鈕用于設(shè)置頻率計數(shù)器門模式。這種自包含的獨立設(shè)備可以用來代替或補充前面詳述的串行接口。
發(fā)電機設(shè)置控制會將輸出頻率更改為從 10Hz 到 4MHz 的 18 種不同設(shè)置之一,以 1、2、5 的順序在所有十年中進行。頻率計數(shù)器選擇器將選擇頻率計數(shù)器能夠設(shè)置的 9 種模式和選通時間中的任何一種。這包括 10mS、100mS、1、10 和 100 秒的選通時間和外部選通模式,以及 3 種周期測量模式,平均為 1、10 或 100 次平均值。實現(xiàn)這一獨立功能所需的只是一個 LCD 顯示屏和四個按鈕開關(guān)。LCD 顯示器使用標(biāo)準(zhǔn)的 Arduino “LiquidCrystal”庫。按鈕接口被實現(xiàn)為簡單的去抖動數(shù)字輸入。
該項目的主要 Arduino 模塊 (FreqGenCtrApp.ino) 有許多定義,這些定義控制模塊的編譯方式,從而控制程序?qū)?zhí)行的功能。除了控制頻率發(fā)生器和頻率計數(shù)器模塊的包含的定義外,還有兩個定義啟用獨立模式代碼、串行接口代碼以及是否有 LCD 顯示器。定義“FREEIF”控制是否包含獨立按鈕界面。定義“COMIF”控制串行接口是否可用。最后,定義“HASLCD”應(yīng)包含 LCD 顯示功能。即使不包括獨立接口,LCD 顯示器也可以與串行接口一起使用。
下面的示意圖顯示了 LCD 顯示器和使用獨立模式或在設(shè)計中添加 LCD 顯示器所需的四個按鈕開關(guān)的連接。

所示的大部分部件都可從 Digikey 或 Mouser 獲得。Pro-Micro 模塊可從 Sparkfun(部分 DEV-12640)獲得,或者可以在 eBay 上以更少的價格獲得等效的克隆。顯示的 LCD 顯示器是 Hantronix HDM16216H-5-S00S(無背光)或 HDM16216L-5-L30S(LED 背光),但其他顯示器也可以使用,只要它們與 Arduino LCDDisplay 庫一起使用。電位器和電阻器可以是所需/可用的任何通用部件。四個開關(guān)應(yīng)為適合工程機械設(shè)計的任意瞬時觸點按鈕開關(guān)。
使用這個附加接口允許頻率發(fā)生器和頻率計數(shù)器模塊用作獨立的測試設(shè)備。
為 Pro Micro 模塊供電
在本文檔中,沒有提及如何為 Pro-Micro 模塊以及可能的 LCD 顯示器供電。假設(shè)它將通過將 USB 電纜連接到 Pro Micro 模塊上的 USB 連接來供電。USB 連接為模塊和所需的任何外部電路提供 5V 電壓,只要任何外部電路所需的功率小于約 100mA。USB 電纜的另一端可以連接到計算機以獲取電源并訪問虛擬 COM 端口和編程,或者如果將系統(tǒng)用作獨立設(shè)備,則可以連接到簡單的 5V 壁式電源。只有在不使用 USB 連接的情況下,Pro Micro 模塊也可以通過 7-16V 直流電源的“RAW”輸入或通過穩(wěn)壓 5V 直流電源的“VCC”引腳供電。
編譯和歸檔信息
該項目和庫是使用 Arduino IDE 版本 1.8.5 開發(fā)的。較新的版本,包括最新版本(版本 1.8.15)也應(yīng)該能夠毫無問題地使用。IDE的“工具”中的設(shè)置應(yīng)該是:
董事會:阿杜諾·萊昂納多
端口:COMxx(由您的系統(tǒng)分配)
程序員:ArduinoISP
頻率發(fā)生器和頻率計數(shù)器模塊最初是在一個項目目錄“FreqGenCtrApp”中編寫和調(diào)試的,其中包含以下文件:

如前所述,所有上述文件都可以在單個目錄中并以這種方式編譯,或者它們可以是頻率發(fā)生器庫或頻率計數(shù)器庫的一部分。如果使用這些庫,每個庫中都有一個示例文件夾,其中包含一個僅用于頻率發(fā)生器或頻率計數(shù)器的主應(yīng)用程序文件,以及一個包含組合應(yīng)用程序的文件夾。

FrequencyGenerator 庫文件位于 Github 上,地址為https://github.com/Rick-G1/FrequencyGenerator 。
FrequencyCounter 庫文件位于 Github 上,地址為https://github.com/Rick-G1/FrequencyCounter 。
當(dāng)我可以弄清楚如何在“草圖”/“包含庫”/“管理庫......”中的 Arduino IDE 下制作這些庫時,這些庫應(yīng)該在那里可用。
頻率發(fā)生器/計數(shù)器和時基精度
用于發(fā)生器和頻率計數(shù)器的時基是微處理器的時鐘,它是一個晶體振蕩器,具有其固有的精度和穩(wěn)定性,但由于它沒有經(jīng)過校準(zhǔn),它通常會與其標(biāo)稱頻率 16MHz 相差幾赫茲。這通常在大約 0.1% 到 0.2% 之間,但可能會更多,具體取決于所使用的 Pro Micro 模塊。由于晶體頻率可能會有所不同,因此頻率發(fā)生器的輸出和頻率計數(shù)器讀取的值將以相同的百分比變化。
在編寫本文檔期間檢查了手頭上的幾個模塊,發(fā)現(xiàn)它們中的大多數(shù)都在 0.1% 以內(nèi),只有少數(shù)在 0.2% 的準(zhǔn)確度值以內(nèi)。如果此精度水平足以滿足預(yù)期應(yīng)用,則無需進一步努力即可使用此頻率發(fā)生器或計數(shù)器功能。
如果需要更高的精度,可以修改 Arduino 模塊以包含微調(diào)電容器以將模塊晶體頻率精確調(diào)整到 16MHz,或者將外部高精度 16MHz 時鐘信號注入模塊以提高生成頻率的精度或控制器進行的頻率測量。顯然,需要一個校準(zhǔn)的頻率計數(shù)器來將 Arduino Pro Micro 模塊校準(zhǔn)到準(zhǔn)確的頻率。
在測量任何晶體振蕩器的頻率時,不要直接在晶體本身的任一引腳上測量晶體頻率。僅僅增加測量設(shè)備的電容就足以顯著改變晶體振蕩器電路的頻率。相反,將控制器設(shè)置為在其輸出引腳之一上輸出已知頻率的時鐘信號,并改為測量該信號。由于該項目的一部分包含頻率發(fā)生器功能,因此該輸出信號是用于測量和校準(zhǔn)控制器晶體時基精度的完美信號。頻率發(fā)生器功能可設(shè)置為8MHz,非常適合檢查和調(diào)諧模塊上的晶振。
添加微調(diào)電容器
可用于調(diào)整系統(tǒng)時基的方法之一是在 Arduino 模塊中添加一個微調(diào)電容器。然后通過使用連接到校準(zhǔn)頻率計數(shù)器的項目的頻率發(fā)生器部分輸出已知頻率并調(diào)整此微調(diào)電容器以設(shè)置輸出頻率,系統(tǒng)時基可以精確設(shè)置為 16MHz,頻率發(fā)生器輸出的精度和計數(shù)器的時基為零,或與用于調(diào)整它的參考設(shè)備一樣準(zhǔn)確。
要安裝微調(diào)電容器,請從模塊上拆下 C2 電容器并安裝一個范圍約為 5 至 40pF 的微調(diào)電容器。可用于此目的的建議部件是 Knowles Voltronics JR300 (5.5-30pF) 或 JR400 (8-40pF)(Digikey 1674-1020-1-ND 或 1674-1021-1-ND)。這是一個小型表面貼裝部件,可以粘在處理器芯片上,然后用小電線將其連接到 GND 和 C2 被移除的焊盤。由于微調(diào)電容會隨著溫度的變化而存在一定的可變性,因此振蕩器的穩(wěn)定性直接關(guān)系到微調(diào)電容的穩(wěn)定性。如果需要更高的穩(wěn)定性,另一種更穩(wěn)定的方法是將 C2 替換為較小值的電容器(可能 5-15pF),然后使用具有較小電容范圍(因此總電容變化較?。┑奈⒄{(diào)電容器(如 JR150 或 JR200 ) 使得固定電容和可變電容的總電容可以變化到接近 22pF 的值。重要的是要注意這部分,一個端子連接到轉(zhuǎn)子(和調(diào)節(jié)螺釘?shù)慕饘伲?/font>此端子應(yīng)連接到 Arduino 模塊的 GND 連接,另一個端子應(yīng)連接到未接地的 C2 焊盤(并連接到 Pro Micro 模塊上微處理器的引腳 17)。這將提供頻率最穩(wěn)定的電路。連接微調(diào)帽的 GND 連接的方便位置是模塊電容器 C19 的負(fù)極。接下來顯示了建議的微調(diào)電容器的圖片以及 Pro Micro 模塊的修改細節(jié)。微調(diào)電容器圖片頂部的端子是“轉(zhuǎn)子”端子。連接完成后,最好將微調(diào)帽粘在微處理器芯片的頂部,以防止其移動,從而提高晶體頻率的穩(wěn)定性。您可能還需要考慮通過在電線周圍涂上熱膠或環(huán)氧樹脂來穩(wěn)定接線以保持最大的準(zhǔn)確性,以防止它們被意外損壞或移動。微調(diào)電容器圖片頂部的端子是“轉(zhuǎn)子”端子。連接完成后,最好將微調(diào)帽粘在微處理器芯片的頂部,以防止其移動,從而提高晶體頻率的穩(wěn)定性。您可能還需要考慮通過在電線周圍涂上熱膠或環(huán)氧樹脂來穩(wěn)定接線以保持最大的準(zhǔn)確性,以防止它們被意外損壞或移動。微調(diào)電容器圖片頂部的端子是“轉(zhuǎn)子”端子。連接完成后,最好將微調(diào)帽粘在微處理器芯片的頂部,以防止其移動,從而提高晶體頻率的穩(wěn)定性。您可能還需要考慮通過在電線周圍涂上熱膠或環(huán)氧樹脂來穩(wěn)定接線以保持最大的準(zhǔn)確性,以防止它們被意外損壞或移動。

一旦對模塊進行了修改,就可以進行調(diào)整。為了獲得最準(zhǔn)確的調(diào)整,在進行調(diào)整之前,讓模塊在預(yù)期使用的溫度下保持通電至少 15 分鐘(幾個小時更好)。然后啟用控制器的頻率輸出并將其設(shè)置為 8MHz。設(shè)置輸出信號后,使用校準(zhǔn)的頻率計數(shù)器并測量此輸出信號(在數(shù)字引腳 5 上)(或數(shù)字引腳 10)。如外部頻率計數(shù)器所示,將微調(diào)電容器調(diào)整為 8MHz。
注入外部時鐘
為了獲得更高的精度,可以使用外部時鐘為控制器芯片提供時鐘(因此也提供時基)。使用這種方法,頻率發(fā)生器和計數(shù)器的精度與外部時鐘電路的精度直接相關(guān)。各種具有極其精確和穩(wěn)定輸出的外部振蕩器可供選擇,從低成本 IC 到非常昂貴、高度穩(wěn)定的 TCXO 模塊。這些模塊的唯一要求是它們必須在 3.3V 或 5V 信號電平下輸出 16MHz。然后可以將該外部時鐘的輸出注入到修改后的 Pro Micro 模塊中,如圖所示。在本例中,外部時基通過一個電阻器注入“A3”引腳,以防止在外部時鐘通電但模塊未通電的情況下使模塊過載。10-47Ω 1/8W 電阻器可用于此目的。

顯然,當(dāng)使用該引腳時,A3 引腳的正常模擬輸入功能將丟失。詳細信息還顯示了 GND(振蕩器公共端)和 5 伏電源的位置,如果外部振蕩器的電流小于 100 毫安,外部振蕩器可以使用該電源為其供電。5V 電源信號來自 USB 輸入電源,可能會在 5V 之間變化 10-15%(有時只有 4.5V 左右)。
使用外部時鐘源時,處理器上的熔絲可以重新編程為外部時鐘模式,但這不是必需的,因為注入時鐘的引腳是晶振的輸入,因此處理器會“看到”來自外部源的 16MHz 并使用它。您也可以移除 Pro Micro 模塊上的晶體,但這也不是使用外部時鐘所必需的。
結(jié)論
該項目詳細介紹了僅使用低成本 Pro-Micro 模塊來實現(xiàn)頻率發(fā)生器和頻率計數(shù)器模塊。頻率發(fā)生器可輸出1Hz至約12MHz的方波信號,而頻率計可在傳統(tǒng)頻率計模式下對1Hz至約8MHz輸入的脈沖進行計數(shù),在周期測量模式下可對從遠小于1Hz至約20KHz的脈沖輸入進行計數(shù)。雖然該項目的主要重點是模塊本身,但還提供了一個簡單的主程序來測試這些功能,帶有一個串行端口或 4 個按鈕開關(guān)和一個 LCD 顯示器。這些模塊的編寫使得它們是自包含的功能塊,并且可以毫不費力地添加到用戶代碼中。希望擁有這些模塊能夠通過簡單地包含這些模塊來幫助用戶,
- 適用于Android的頻率計數(shù)器
- 使用Arduino制作簡單的頻率計數(shù)器
- 使用頻率計數(shù)器和OLED顯示屏的金屬探測器
- 使用Arduino Nano或Uno的Android頻率計數(shù)器
- 頻率計數(shù)器FC510前面板開源分享
- 內(nèi)插倒數(shù)頻率計數(shù)器FC510開源分享
- 帶預(yù)分頻器的Arduino射頻頻率計數(shù)器
- 基于藍橋杯單片機的頻率計數(shù)器模塊簡單分析
- 如何使用STC15單片機進行頻率計及方波發(fā)生器的設(shè)計 36次下載
- 基于單片機的頻率計數(shù)器的設(shè)計 38次下載
- 頻率計數(shù)器 26次下載
- 自制25MHz頻率計數(shù)器 36次下載
- 頻率計數(shù)器仍然是通用工具 10次下載
- 6位數(shù)顯頻率計數(shù)器 22次下載
- 25MHz頻率計數(shù)器的制作方法
- 基于555電路的頻率發(fā)生器 407次閱讀
- 函數(shù)信號發(fā)生器怎么調(diào)頻率 1701次閱讀
- 簡單認(rèn)識脈沖計數(shù)器 1896次閱讀
- 函數(shù)信號發(fā)生器怎么頻率調(diào)整 1611次閱讀
- 函數(shù)發(fā)生器的頻率調(diào)整和波形選擇方法 1429次閱讀
- 頻率計有哪些作用 1499次閱讀
- 基于四通道運算放大器的函數(shù)發(fā)生器電路 1475次閱讀
- 5位頻率計數(shù)器電路分享 2727次閱讀
- 如何使用Arduino制作一個頻率計數(shù)器? 7055次閱讀
- 頻率計數(shù)器的工作原理和發(fā)展 1.3w次閱讀
- 使用單片機實現(xiàn)數(shù)字頻率計數(shù)器的設(shè)計說明 5161次閱讀
- 電子計數(shù)器的使用_電子計數(shù)器功能 1.4w次閱讀
- 基于AT89S51單片機實現(xiàn)信號頻率計數(shù)功能的設(shè)計 2751次閱讀
- cd4046應(yīng)用電路圖大全(金屬探測儀/頻率計/充電器/信號發(fā)生器) 3.2w次閱讀
- 首款LXI C 類標(biāo)準(zhǔn)的頻率計數(shù)器Agilent 53200系列日前被推出 957次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發(fā)指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應(yīng)用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關(guān)電源設(shè)計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅(qū)動電路設(shè)計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學(xué)會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論