資料介紹
描述
概述
很多時候,需要產生可編程頻率輸出或實現用于各種用途的頻率計數器。該項目僅使用低成本(≈5-17 美元)Pro Micro(Sparkfun DEV-12640 或等效克隆)模塊實現這些功能塊中的一個或兩個,該模塊帶有 ATMega32U4 處理器芯片和使用 Arduino IDE 編譯器和環(huán)境實現的軟件。這些功能塊可以單獨使用,也可以在更大的應用程序中一起使用,或者作為獨立設備使用。由于它們是獨立的功能,因此將分別進行介紹。作為該項目的一部分,還包括一個通用主模塊,可用于設置頻率發(fā)生器或從頻率計數器讀取頻率。這可以通過串行端口完成,或者,
與本網站上列出的許多項目不同,該項目沒有實現一些最終設備,而是專注于頻率發(fā)生器和頻率計數器的功能塊。假設用戶隨后將編寫一個主模塊,將這些模塊部署到所需的任何目的,并且可能包括 LCD 顯示器、鍵盤或其他外部接口,或者可能是用戶需要的某個更大項目的一部分。最后,由于頻率發(fā)生器和頻率計數器都依賴于Pro Micro通常未經校準的內部晶振,因此詳細說明如何修改模塊以提高振蕩器的精度。
應該注意的是,也可以使用其他帶有 ATMega32U4 處理器的 Arduino 模塊,包括 Arduino Leonardo 和 Arduino Micro 以及可能的其他模塊。
頻率發(fā)生器
該庫使用 Arduino Pro Micro 模塊(使用 ATMega32U4)上的 Timer 4 實現可變頻率發(fā)生器。該信號可用于向任何用戶定義的設備或電路輸出可調節(jié)頻率的方波信號。使用 Pro Micro 模塊本身包含的硬件,頻率發(fā)生器將輸出具有 50% 占空比的方波信號,從 1 Hz 到大約 12MHz。它可以在使用模塊的所有其他功能的同時使用。此處理器/模塊上的定時器 4 的獨特之處在于它可以連接到處理器主時鐘,也可以連接到 ATMega32U4 中包含的 PLL,提供更高的初始頻率和一些額外的縮放值,包括 1.5x 時鐘,提供更多的計數組合值以產生更接近任何所需頻率的輸出信號。
用于設置頻率的固件包含一種獨特的算法,可通過從三個不同的輸入時鐘頻率之一(通過片上 PLL)、二進制預分頻器值和一個計數值。對于所有這些變量,如果必須從外部確定這些變量,則每個變量要獲得給定頻率的設置可能具有挑戰(zhàn)性。通過固件中包含的算法,固件本身為這三個值中的每一個確定最佳值,以使輸出頻率盡可能接近請求值。一旦計算和設置了這些值,
發(fā)電機硬件
Pro Micro 模塊將在 Arduino Digital 引腳 5(處理器引腳 PC6)上輸出選定的頻率時鐘信號,作為 0-5V 50% 占空比的方波信號,無需對控制器進行進一步修改。或者,如果需要,也可以將輸出配置為在 Arduino 數字引腳 10(處理器引腳 PB6)上輸出信號。下圖顯示了 Pro Micro 模塊上頻率發(fā)生器輸出的引腳。
根據您的應用,可能不需要額外的電路,但如果需要與模塊輸出引腳不同的電平或更大的功率,則可能需要外部放大器、電平轉換器或電阻分壓器。還顯示了一個 5V 電源,如果需要,它可用于為該外部電路供電,其功率要求小于 100mA。
該發(fā)生器的頻率精度與 Pro Micro 模塊上的晶振直接相關,通常在 0.1-0.2% 之間,但通常比這更接近標稱頻率。如果需要更高的精度,請參閱下面的部分,詳細說明對 Pro Micros 晶體振蕩器的修改。頻率精度還與處理器芯片的各個寄存器中設置的值有關。雖然該算法試圖確定 PLL、預分頻器和計數器的最佳值,但有些頻率是硬件無法獲得的,無需額外的軟件干預,這超出了本項目的范圍。幾乎所有較低的頻率(低于約 5KHz)都是完美的(或接近完美的),這意味著模塊可以輸出準確的頻率,但隨著要求的頻率越來越高,將存在無法實現準確頻率的“差距”。在這些情況下,將設置可獲得的最接近的頻率,并且通常對于大多數應用來說足夠接近。輸出的占空比固定為 50%。
發(fā)生器軟件接口功能
該庫在一個名為“FrequencyGenerator”的類中實現。這個類有兩個函數:“set”和“read”來設置頻率發(fā)生器和讀取發(fā)生器設置的當前頻率。
** 設置功能 **
使用頻率設置命令設置頻率,該命令將頻率設置為最接近的可獲得值。函數 'FrequencyGenerator::set' 接受一個長整數,它是以赫茲為單位輸出的頻率。這可以從小于 0(返回電流頻率)的值到 0(發(fā)電機關閉)到超過微時鐘頻率(8MHz)的 1/2 的值。在現有的 Pro Micro 模塊可用的情況下,據觀察它的工作頻率約為 12MHz。如果設置了請求的頻率,則“FrequencyGenerator::set”函數返回設置的頻率,如果無法設置為所需的頻率,則返回 -1。由于定時器設置為自動重新加載,因此不需要中斷或其他軟件開銷——只需調用該函數,然后硬件將產生輸出頻率,無需額外干預。
要關閉頻率發(fā)生器,只需調用頻率為零的“FrequencyGenerator::set”函數。這將禁用頻率發(fā)生器并將其輸出引腳置于高阻抗狀態(tài)。也可以通過使用 -1(或任何負數)調用“FrequencyGenerator::set”函數來請求當前頻率。
** 讀取功能 **
還提供了一個函數“FrequencyGenerator::read”來請求頻率發(fā)生器模塊的當前頻率。返回的值將是控制器輸出的實際頻率(以及硬件能夠輸出的最接近的值),并且可能與上次設置的頻率略有不同。這以長整數形式返回。
生成器代碼詳細信息和選項
頻率發(fā)生器功能包含在文件“FrequencyGenerator.cpp”中。包含類原型的頭文件位于文件“FrequencyGenerator.h”中。該模塊是專門為 Pro Micro 設備(或具有類似功能塊的其他微控制器設備)上的 ATMega32U4 的定時器 4 編寫的,假設控制器作為 USB 設備運行,PLL 設置為 96MHz,晶振為 16MHz(這是Pro Micro 設備的默認設置)。它可能會為其他計時器重新設計,但分辨率會更低。
“FrequencyGenerator.cpp”模塊中的代碼包含將處理器中的各種寄存器設置為所需輸入頻率的最佳值的算法。它通過連續(xù)對每個 PLL 設置進行計算,然后確定哪個 PLL 設置提供最接近所需值的輸出頻率來實現。預分頻器和計數值通過計算所需頻率的 log2 來確定,然后將其轉換為寄存器的預分頻器和計數值。一旦確定了最佳組合,就將物理寄存器設置為這些值。代碼中的注釋更詳細地詳細說明了該算法。
在 FrequencyGenerator.cpp 模塊中有 2 個條件編譯定義,可以定義也可以不定義。其中之一是“FRQGENUSEPB6”,如果定義為非零,將使用 Arduino 數字引腳 10(處理器引腳 PB6)作為發(fā)生器的輸出,而不是默認的 Arduino 數字引腳 5(處理器引腳 PC6)。另一個定義是“FRQGENDEBUG”,如果定義為非零,則在設置頻率以進行調試時會將一些變量值輸出到串行端口。
頻率計數器
該庫使用屬于 Pro Micro 模塊的硬件定時器/計數器資源來實現頻率計數器。它使用定時器 0 和另一個定時器作為 Pro Micro 模塊上的“門”定時器。它既可以用作傳統頻率計數器,通過在固定時間(門限時間)內對輸入引腳上發(fā)生的脈沖數進行計數,也可以用作周期計數器,其中輸入波形的單個或多個周期的時間被測量。傳統的頻率計數模式最適合測量較快的信號,而周期測量模式在測量較低頻率的信號時提供更高的亞赫茲分辨率。該模塊的接口是通過 2 到 3 個主要功能。第一個函數向用戶提供讀取頻率,而第二個功能將頻率計數器設置為傳統計數模式或周期測量模式,還設置門時間或輸入脈沖數以進行平均。如果需要,可以使用另一個功能來確定是否有新的“新”讀數可用。由于該模塊使用硬件定時器和中斷例程來實現頻率計數器,因此除了用戶需要編寫的任何代碼之外,它還可以在使用 Pro Micro 模塊和 Arduino 環(huán)境的所有其他功能的同時使用。
當計數器配置為傳統計數模式時,定時器 0 配置為對輸入脈沖進行計數,第二個定時器(定時器 1)用作門控源。計數時,每次 Timer 0 溢出時,中斷例程都會將保存的計數變量加一。門控計時器 (Timer 1) 用于定期將此累積計數移動到另一個變量,然后在請求頻率時將其返回給用戶,然后重置 Timer 0 計數器中的計數(以及保存的計數變量)下一個周期。門控定時器可以配置為 10 毫秒、100 毫秒、1 秒、10 秒或 100 秒之一。門控定時器也是中斷驅動的,因此計數器模塊可以準確地計時門控窗口。
當計數器處于周期測量模式時,定時器 0 用于對輸入引腳上的單次跳變或多次跳變進行計數。系統微秒計數(即 Arduino 環(huán)境的一部分)在收到第一個轉換時保存,然后當第二個轉換發(fā)生時,再次讀取微秒值并從中減去保存的微秒值以確定周期的輸入信號。然后當用戶請求頻率時,將該值轉換為頻率并返回給用戶。在周期測量模式下,可以使用三種平均模式中的一種。可選擇不平均或平均 10 或 100 個輸入脈沖。這種平均是通過設置定時器 0 計數器在 1、10 或 100 次轉換時產生中斷來完成的,
計數器硬件
頻率計數器的輸入位于 Pro Micro (ATMega32U4) 的 Arduino 數字引腳 6(處理器引腳 PD7)上,并假定為要計數的低脈沖序列。下圖顯示了計數器輸入以及外部門輸入引腳(稍后詳述)。外部門輸入(如果使用)位于 Arduino 數字引腳 9(處理器引腳 PB5)上,但如果需要,可以移動到另一個引腳。
顯然,輸入信號必須是適當的 TTL 電平才能被計數。將較低電平信號放大到這個 TTL 電平(如果需要)的輸入放大器超出了這項工作的范圍。還展示了一個 5V 電源,如果需要,它可用于為任何外部電路供電,其功率要求小于 100mA。
此計數器的頻率精度與 Pro Micro 模塊上的晶振直接相關,通常在 0.1-0.2% 之間,但通常更接近實際頻率。如果需要更高的精度,請參閱下面的部分,詳細說明對 Pro Micros 晶體振蕩器的修改。
精度還與傳統頻率計數器模式的門控定時器和周期測量模式的毫秒定時器的精度直接相關。在這個項目中,這兩個定時器都是中斷驅動的,這意味著它們在沒有任何軟件干預的情況下自主發(fā)生,并且在 Arduino 環(huán)境中盡可能接近立即發(fā)生。雖然中斷程序有一些開銷,但這通常可以忽略不計,并且讀取的頻率通常非常接近或通常完全正確的頻率。
對該項目開發(fā)期間可用的不同模塊進行的測試表明,在傳統的頻率計數器模式下,Pro Micro 模塊能夠可靠地計算高達約 8MHz 的頻率(處理器時鐘頻率的 1/2)。在周期測量模式下,該模式旨在以更高的分辨率測量較低頻率,當平均設置為 10 和 100 和 10 KHz 時(平均值為 1),最高 20 KHz 的頻率是可能的且可靠的。在周期測量模式下,如果頻率高于這些值,模塊將報告值“999999”或在極少數情況下報告錯誤值。
如果應用需要測量高于約 8 MHz 的頻率,則可以在將輸入信號連接到此計數器模塊之前將外部分頻器鏈(預分頻器)添加到輸入信號中,然后相應地調整此模塊返回的值。一個 74196 或一組 74F74 可用于高達約 60-100MHz 的頻率,而其他預分頻器 IC 可用于更高的頻率。如果使用預分頻器,則可以將“FrequencyCounter.cpp”模塊中名為“FCPRESCALER”的定義調整為除數,以便使用預分頻器時返回的輸出頻率是正確的。
計數器軟件接口功能
該庫在一個名為“FrequencyCounter. 這個類有兩個主要功能和幾個可能需要的輔助功??能,具體取決于選擇的具體實現。
** 模式功能 **
第一個函數“FrequencyCounter::mode”用于設置或讀取計數模式,包括模式和門時間或平均次數。這使用單個參數調用,該參數指定要使用的模式,或請求當前模式。如果輸入參數為 -1(或任何小于 0 的值),則函數返回當前模式值。如果輸入參數在 0 到 9 的范圍內,則設置以下模式:
如果輸入參數超出上述值的范圍,該函數總是返回當前選擇的模式或 -1。模式 6 到 9 可能存在也可能不存在,具體取決于模塊的編譯方式。如果在沒有參數的情況下調用“FrequencyCounter::mode”函數,它將返回當前模式。
** 讀取功能 **
第二個函數“FrequencyCounter::read”用于讀取頻率計數器并返回一個字符串,該字符串是讀取頻率的數字浮點值。調用此函數時,會使用一個指向將由該函數填充的字符串緩沖區(qū)的指針和一個名為“Wait”的參數,如果非零將導致該函數等待,直到頻率計數器的新“新”讀數為可用的。該函數返回一個指向包含此頻率值的字符串的指針,其格式為“12345678”或“12345.67890”(或類似)。傳遞給此函數的字符串緩沖區(qū)位置必須足夠大以容納此函數將創(chuàng)建的字符串——建議使用 15 個或更多字符。參數 'Wait' 應該為零以獲取最后讀取的頻率,或非零以等待新的“新”頻率計數。需要注意的是,如果調用函數時將 'Wait' 參數作為非零值,則函數可能需要長達 100 秒才能返回,具體取決于頻率計數器模塊所處的模式。如果這是不可接受的,還可以使用輪詢功能來查看是否有新的頻率讀數可用。此函數返回一個可以是浮點值的字符串,而不是實際的二進制浮點值類型,因此不需要編譯器的浮點函數(占用大量代碼空間)。
** 可用功能 **
如上一段所述,還包括確定是否有新的“新”頻率讀數可用的功能。函數 ''FrequencyCounter::available'' 不需要參數,如果新值準備好則返回 1,如果新值未準備好則返回 0。
大多數用戶只需要上面提到的兩個或三個功能。在特殊情況下,還可以使用其他一些功能。
** 讀取二進制函數 **
當函數 ''FrequencyCounter::read'' 僅使用“Wait”參數(并且沒有指向字符串參數的指針)調用時,讀取函數返回一個長整數,它是讀取頻率的未更正計數或周期。然后,用戶必須根據應用程序的需要將其縮放/轉換為適當的值。與 ''FrequencyCounter::read'' 函數的字符串版本一樣,此函數也接受一個 'Wait' 參數,其工作方式與該函數相同。此功能通常不使用,但在其他代碼(可能在主機應用程序中)出于任何原因需要讀取未更正的二進制值的情況下可用。請參閱此函數的字符串版本的代碼,了解如何縮放此值并將其轉換為浮點字符串,以了解此未更正的值如何“更正”。
** FreqCtrGateISR 函數 **
最后,如果不需要與系統定時器的默認鏈接及其 10mS 中斷,則用戶例程可以調用名為“FreqCtrGateISR”的函數。該函數不是類的一部分,不接受任何參數并且不返回任何內容。(如果使用已發(fā)布的默認庫文件,則不需要此功能。)
計數器代碼詳細信息和選項
頻率計數器功能包含在文件“FrequencyCounter.cpp”中。包含類原型的頭文件在文件“FrequencyCounter.h”中。該模塊包含上述功能的代碼。根據該項目用戶所需的配置,可能還需要模塊“SysTimer.cpp”和“PCInterrupt.cpp”。
在傳統的頻率計數器模式中,該模塊需要一個“門控”源,該源通常是一個以固定時間速率發(fā)生的不同定時器。如果不使用提供的“SysTimer.cpp”模塊,則需要以適當的周期速率(10mS)調用函數“FreqCtrGateISR”。這個模塊的精度直接受這個門控時序源的精度影響!
計數器系統定時器和處理器資源
該模塊專為使用 Atmel ATMega32U4 的 Arduino Pro Micro 模塊而設計,并使用 Timer 0 作為計數輸入。最好使用另一個定時器來實現此功能,但不幸的是,定時器 1 的外部時鐘引腳(ATMega32U4 引腳 26)沒有連接到模塊連接器,只有定時器 0 和定時器 1 有外部時鐘輸入,因此沒有其他選擇除了使用 Timer 0。眾所周知,Timer 0 通常用于 Arduino 系統計時功能(延遲、毫秒、微秒等),因此唯一的選擇是將這些功能移至其他計時器。這是通過重新設計作為 Arduino 系統一部分的 stock Wiring.c 模塊以為此目的使用不同的計時器來完成的。然后這個“系統”定時器被擴展為也用于頻率計數器功能的門定時器。
通過在構建中簡單地包含“SysTimer.cpp”,通常由 Timer 0 實現的功能(延遲、毫秒、微秒等)被移動到使用這個備用計時器(可配置為 Timer 1 或 Timer 3),以及一個掛鉤到定時器的中斷服務程序 (ISR) 是可訪問的,允許該定時器用于頻率計數器門控功能。最好將定時器 1 用于門,因為它具有最高的中斷優(yōu)先級(甚至高于定時器 0),但定時器 1 或定時器 3 都可以使用。如果用戶的應用程序不包含 SysTimer 模塊,則它必須使用必須編寫的其他代碼調用函數“FreqCtrGateISR”。如果需要,SysTimer 模塊還可用于頻率計數器以外的其他用途。
顯然,當為“系統”定時器功能和頻率計數器門控功能使用備用定時器時,定時器將不適用于 PWM 功能或任何其他 Arduino“內置”庫函數,通常取決于定時器 0 或為Arduino 軟件中的“系統”定時器。
需要注意的是,如果使用 USB 與 Pro Micro 模塊通信,則返回的計數可能不如使用其他或不使用外部通信方式時精確。這是因為 USB 中斷的優(yōu)先級高于用于門控定時器的定時器 1/定時器 3 定時器。一種可能的替代方法是為門控時間設置另一個定時器并將其輸出到引腳上,然后使用引腳更改或外部中斷作為門控定時器源(引腳更改和外部中斷的優(yōu)先級高于 USB 中斷)。另請注意,當測量高于約 2MHz 的頻率時,返回的計數在極少數情況下可能會少一兩個計數。這是因為該模塊中的代碼必須清除計數器,將其關閉然后重新打開,這需要幾個 CPU 周期。
計數器外部門控
該頻率計數器模塊也可以設置為使用外部選通。為此,將“FCEXTERN”定義為非零,并在此草圖中包含模塊“PCInterrupt.cpp”。然后通過將“模式”功能設置為 6,由“FCEXTGATEMSK”定義的 Arduino 引腳將用作門輸入。默認情況下,此信號在 Arduino 數字引腳 9(處理器引腳 PB5)上輸入,但如果需要,可以移動到另一個引腳。有關“PCINTMASKxx”引腳列表,請參見“PCInterrupt.h”——這些引腳中的任何一個都可以使用。激活時,此引腳上的低電平打開柵極,高電平時關閉柵極。包括外部門功能是可選的,但包括在分發(fā)文件中的定義。添加外部門控功能會使模塊的代碼大小增加約 250 字節(jié)。如果不包括在內,
使用外部門功能和另一個定時器設置為自主工作,然后在其他引腳上輸出其信號,然后將此引腳連接到“外部門”輸入是解決上述 USB 問題的一種可能方法,該問題可能會影響計數,因為外部門輸入的優(yōu)先級都高于 USB 中斷。
計數器周期測量模式
在周期測量模式下使用頻率計數器模塊時,定時器 0 用于檢測輸入引腳上的轉換,然后使用 Arduino 系統微秒計數器測量這些轉換之間的微秒數。在這種模式下,輸入仍然在同一個 Timer 0 輸入引腳上,但不是計算在給定時間內發(fā)生的脈沖數,而是將 Timer 0 設置為在第一次、第十次或第 100 次轉換時產生中斷測量計時器 0 輸入和在其中兩個轉換之間經過的微秒數,然后將其轉換為頻率。這允許在最短時間內更準確地測量低頻信號。當定時器 0 設置為計數 10 次轉換時,這有效地平均了輸入信號的 10 個周期,當設置為 100 時,它平均輸入信號的 100 個周期。包括周期測量模式是可選的,并且僅在定義“FCPERIOD”被定義為非零值(它用于分發(fā)文件)時才包括在內。包括周期測量模式會增加模塊的代碼大小約 1000 字節(jié)。
周期測量模式的計數器超時
使用傳統頻率計數模式時,函數'FrequencyCounter::read'保證在固定時間后返回;但是在周期測量模式下,如果沒有輸入信號,則永遠不會發(fā)生新的“新”頻率計數,讀取函數也不會返回。在某些情況下,這可能是有問題的。為保證此功能在給定時間后始終返回,頻率計數器模塊包含一個超時計數器,當使用周期測量模式時,該超時計數器將在給定時間后超時。這個超時定時器使用與門計數器相同的定時器中斷,并且是函數“FreqCtrGateISR”的一部分。如果未找到輸入,則在此計時器超時后,將報告一個新的零赫茲頻率(并且頻率讀取函數將返回)。此超時值默認為 5 秒,但如果需要,可以通過更改定義的“PERIODTIMOUT”的值來更改。如果此定義為 0,則期間測量功能將不包含任何超時功能。
主模塊
如介紹中所述,該項目還包括一個“主”模塊(FreqGenCtrApp.ino),用于測試頻率發(fā)生器和頻率計數器模塊。它提供了一個簡單的 ASCII 命令接口,其中大部分是 1 或 2 個字符命令來控制作為該項目一部分的模塊,或者可以通過添加 4 個按鈕開關和一個 LCD 顯示器來創(chuàng)建一個獨立的設備。它可以與頻率發(fā)生器模塊或頻率計數器模塊或兩者一起使用。該模塊的使用是可選的,只是為了提供一種方便的方式來測試和驗證該項目的兩個功能塊的操作,并向用戶展示如何調用該項目中的每個功能。
串行接口
“FreqGenCtrApp.ino”模塊包含代碼和定義,允許它使用 USB 虛擬 com 端口作為它的命令接口,或者它可以選擇使用 Pro Micro 的 UART 串??行接口作為同一接口。將“COMM”#define 定義為“Serial”將使用 USB 接口,而將其定義為“Serial1”將使用 UART 接口。該模塊還包含一個簡單的 printf 接口,允許使用編譯器的 printf 函數。
** 串行命令 **
主模塊解釋的命令大多是 1 或 2 個字符的命令,以
獨立設備
因為相信許多用戶會想要一個簡單的獨立頻率發(fā)生器和/或頻率計數器而不自己編寫它,所以主模塊還包括一個簡單的控制器,它使用 4 個按鈕開關和一個 2x16 LCD 顯示器來實現兩者的這些功能。其中兩個按鈕控制頻率發(fā)生器,而另外兩個按鈕用于設置頻率計數器門模式。這種自包含的獨立設備可以用來代替或補充前面詳述的串行接口。
發(fā)電機設置控制會將輸出頻率更改為從 10Hz 到 4MHz 的 18 種不同設置之一,以 1、2、5 的順序在所有十年中進行。頻率計數器選擇器將選擇頻率計數器能夠設置的 9 種模式和選通時間中的任何一種。這包括 10mS、100mS、1、10 和 100 秒的選通時間和外部選通模式,以及 3 種周期測量模式,平均為 1、10 或 100 次平均值。實現這一獨立功能所需的只是一個 LCD 顯示屏和四個按鈕開關。LCD 顯示器使用標準的 Arduino “LiquidCrystal”庫。按鈕接口被實現為簡單的去抖動數字輸入。
該項目的主要 Arduino 模塊 (FreqGenCtrApp.ino) 有許多定義,這些定義控制模塊的編譯方式,從而控制程序將執(zhí)行的功能。除了控制頻率發(fā)生器和頻率計數器模塊的包含的定義外,還有兩個定義啟用獨立模式代碼、串行接口代碼以及是否有 LCD 顯示器。定義“FREEIF”控制是否包含獨立按鈕界面。定義“COMIF”控制串行接口是否可用。最后,定義“HASLCD”應包含 LCD 顯示功能。即使不包括獨立接口,LCD 顯示器也可以與串行接口一起使用。
下面的示意圖顯示了 LCD 顯示器和使用獨立模式或在設計中添加 LCD 顯示器所需的四個按鈕開關的連接。
所示的大部分部件都可從 Digikey 或 Mouser 獲得。Pro-Micro 模塊可從 Sparkfun(部分 DEV-12640)獲得,或者可以在 eBay 上以更少的價格獲得等效的克隆。顯示的 LCD 顯示器是 Hantronix HDM16216H-5-S00S(無背光)或 HDM16216L-5-L30S(LED 背光),但其他顯示器也可以使用,只要它們與 Arduino LCDDisplay 庫一起使用。電位器和電阻器可以是所需/可用的任何通用部件。四個開關應為適合工程機械設計的任意瞬時觸點按鈕開關。
使用這個附加接口允許頻率發(fā)生器和頻率計數器模塊用作獨立的測試設備。
為 Pro Micro 模塊供電
在本文檔中,沒有提及如何為 Pro-Micro 模塊以及可能的 LCD 顯示器供電。假設它將通過將 USB 電纜連接到 Pro Micro 模塊上的 USB 連接來供電。USB 連接為模塊和所需的任何外部電路提供 5V 電壓,只要任何外部電路所需的功率小于約 100mA。USB 電纜的另一端可以連接到計算機以獲取電源并訪問虛擬 COM 端口和編程,或者如果將系統用作獨立設備,則可以連接到簡單的 5V 壁式電源。只有在不使用 USB 連接的情況下,Pro Micro 模塊也可以通過 7-16V 直流電源的“RAW”輸入或通過穩(wěn)壓 5V 直流電源的“VCC”引腳供電。
編譯和歸檔信息
該項目和庫是使用 Arduino IDE 版本 1.8.5 開發(fā)的。較新的版本,包括最新版本(版本 1.8.15)也應該能夠毫無問題地使用。IDE的“工具”中的設置應該是:
董事會:阿杜諾·萊昂納多
端口:COMxx(由您的系統分配)
程序員:ArduinoISP
頻率發(fā)生器和頻率計數器模塊最初是在一個項目目錄“FreqGenCtrApp”中編寫和調試的,其中包含以下文件:
如前所述,所有上述文件都可以在單個目錄中并以這種方式編譯,或者它們可以是頻率發(fā)生器庫或頻率計數器庫的一部分。如果使用這些庫,每個庫中都有一個示例文件夾,其中包含一個僅用于頻率發(fā)生器或頻率計數器的主應用程序文件,以及一個包含組合應用程序的文件夾。
FrequencyGenerator 庫文件位于 Github 上,地址為https://github.com/Rick-G1/FrequencyGenerator 。
FrequencyCounter 庫文件位于 Github 上,地址為https://github.com/Rick-G1/FrequencyCounter 。
當我可以弄清楚如何在“草圖”/“包含庫”/“管理庫......”中的 Arduino IDE 下制作這些庫時,這些庫應該在那里可用。
頻率發(fā)生器/計數器和時基精度
用于發(fā)生器和頻率計數器的時基是微處理器的時鐘,它是一個晶體振蕩器,具有其固有的精度和穩(wěn)定性,但由于它沒有經過校準,它通常會與其標稱頻率 16MHz 相差幾赫茲。這通常在大約 0.1% 到 0.2% 之間,但可能會更多,具體取決于所使用的 Pro Micro 模塊。由于晶體頻率可能會有所不同,因此頻率發(fā)生器的輸出和頻率計數器讀取的值將以相同的百分比變化。
在編寫本文檔期間檢查了手頭上的幾個模塊,發(fā)現它們中的大多數都在 0.1% 以內,只有少數在 0.2% 的準確度值以內。如果此精度水平足以滿足預期應用,則無需進一步努力即可使用此頻率發(fā)生器或計數器功能。
如果需要更高的精度,可以修改 Arduino 模塊以包含微調電容器以將模塊晶體頻率精確調整到 16MHz,或者將外部高精度 16MHz 時鐘信號注入模塊以提高生成頻率的精度或控制器進行的頻率測量。顯然,需要一個校準的頻率計數器來將 Arduino Pro Micro 模塊校準到準確的頻率。
在測量任何晶體振蕩器的頻率時,不要直接在晶體本身的任一引腳上測量晶體頻率。僅僅增加測量設備的電容就足以顯著改變晶體振蕩器電路的頻率。相反,將控制器設置為在其輸出引腳之一上輸出已知頻率的時鐘信號,并改為測量該信號。由于該項目的一部分包含頻率發(fā)生器功能,因此該輸出信號是用于測量和校準控制器晶體時基精度的完美信號。頻率發(fā)生器功能可設置為8MHz,非常適合檢查和調諧模塊上的晶振。
添加微調電容器
可用于調整系統時基的方法之一是在 Arduino 模塊中添加一個微調電容器。然后通過使用連接到校準頻率計數器的項目的頻率發(fā)生器部分輸出已知頻率并調整此微調電容器以設置輸出頻率,系統時基可以精確設置為 16MHz,頻率發(fā)生器輸出的精度和計數器的時基為零,或與用于調整它的參考設備一樣準確。
要安裝微調電容器,請從模塊上拆下 C2 電容器并安裝一個范圍約為 5 至 40pF 的微調電容器。可用于此目的的建議部件是 Knowles Voltronics JR300 (5.5-30pF) 或 JR400 (8-40pF)(Digikey 1674-1020-1-ND 或 1674-1021-1-ND)。這是一個小型表面貼裝部件,可以粘在處理器芯片上,然后用小電線將其連接到 GND 和 C2 被移除的焊盤。由于微調電容會隨著溫度的變化而存在一定的可變性,因此振蕩器的穩(wěn)定性直接關系到微調電容的穩(wěn)定性。如果需要更高的穩(wěn)定性,另一種更穩(wěn)定的方法是將 C2 替換為較小值的電容器(可能 5-15pF),然后使用具有較小電容范圍(因此總電容變化較?。┑奈⒄{電容器(如 JR150 或 JR200 ) 使得固定電容和可變電容的總電容可以變化到接近 22pF 的值。重要的是要注意這部分,一個端子連接到轉子(和調節(jié)螺釘的金屬)。此端子應連接到 Arduino 模塊的 GND 連接,另一個端子應連接到未接地的 C2 焊盤(并連接到 Pro Micro 模塊上微處理器的引腳 17)。這將提供頻率最穩(wěn)定的電路。連接微調帽的 GND 連接的方便位置是模塊電容器 C19 的負極。接下來顯示了建議的微調電容器的圖片以及 Pro Micro 模塊的修改細節(jié)。微調電容器圖片頂部的端子是“轉子”端子。連接完成后,最好將微調帽粘在微處理器芯片的頂部,以防止其移動,從而提高晶體頻率的穩(wěn)定性。您可能還需要考慮通過在電線周圍涂上熱膠或環(huán)氧樹脂來穩(wěn)定接線以保持最大的準確性,以防止它們被意外損壞或移動。微調電容器圖片頂部的端子是“轉子”端子。連接完成后,最好將微調帽粘在微處理器芯片的頂部,以防止其移動,從而提高晶體頻率的穩(wěn)定性。您可能還需要考慮通過在電線周圍涂上熱膠或環(huán)氧樹脂來穩(wěn)定接線以保持最大的準確性,以防止它們被意外損壞或移動。微調電容器圖片頂部的端子是“轉子”端子。連接完成后,最好將微調帽粘在微處理器芯片的頂部,以防止其移動,從而提高晶體頻率的穩(wěn)定性。您可能還需要考慮通過在電線周圍涂上熱膠或環(huán)氧樹脂來穩(wěn)定接線以保持最大的準確性,以防止它們被意外損壞或移動。
一旦對模塊進行了修改,就可以進行調整。為了獲得最準確的調整,在進行調整之前,讓模塊在預期使用的溫度下保持通電至少 15 分鐘(幾個小時更好)。然后啟用控制器的頻率輸出并將其設置為 8MHz。設置輸出信號后,使用校準的頻率計數器并測量此輸出信號(在數字引腳 5 上)(或數字引腳 10)。如外部頻率計數器所示,將微調電容器調整為 8MHz。
注入外部時鐘
為了獲得更高的精度,可以使用外部時鐘為控制器芯片提供時鐘(因此也提供時基)。使用這種方法,頻率發(fā)生器和計數器的精度與外部時鐘電路的精度直接相關。各種具有極其精確和穩(wěn)定輸出的外部振蕩器可供選擇,從低成本 IC 到非常昂貴、高度穩(wěn)定的 TCXO 模塊。這些模塊的唯一要求是它們必須在 3.3V 或 5V 信號電平下輸出 16MHz。然后可以將該外部時鐘的輸出注入到修改后的 Pro Micro 模塊中,如圖所示。在本例中,外部時基通過一個電阻器注入“A3”引腳,以防止在外部時鐘通電但模塊未通電的情況下使模塊過載。10-47Ω 1/8W 電阻器可用于此目的。
顯然,當使用該引腳時,A3 引腳的正常模擬輸入功能將丟失。詳細信息還顯示了 GND(振蕩器公共端)和 5 伏電源的位置,如果外部振蕩器的電流小于 100 毫安,外部振蕩器可以使用該電源為其供電。5V 電源信號來自 USB 輸入電源,可能會在 5V 之間變化 10-15%(有時只有 4.5V 左右)。
使用外部時鐘源時,處理器上的熔絲可以重新編程為外部時鐘模式,但這不是必需的,因為注入時鐘的引腳是晶振的輸入,因此處理器會“看到”來自外部源的 16MHz 并使用它。您也可以移除 Pro Micro 模塊上的晶體,但這也不是使用外部時鐘所必需的。
結論
該項目詳細介紹了僅使用低成本 Pro-Micro 模塊來實現頻率發(fā)生器和頻率計數器模塊。頻率發(fā)生器可輸出1Hz至約12MHz的方波信號,而頻率計可在傳統頻率計模式下對1Hz至約8MHz輸入的脈沖進行計數,在周期測量模式下可對從遠小于1Hz至約20KHz的脈沖輸入進行計數。雖然該項目的主要重點是模塊本身,但還提供了一個簡單的主程序來測試這些功能,帶有一個串行端口或 4 個按鈕開關和一個 LCD 顯示器。這些模塊的編寫使得它們是自包含的功能塊,并且可以毫不費力地添加到用戶代碼中。希望擁有這些模塊能夠通過簡單地包含這些模塊來幫助用戶,
- 適用于Android的頻率計數器
- 使用Arduino制作簡單的頻率計數器
- 使用頻率計數器和OLED顯示屏的金屬探測器
- 使用Arduino Nano或Uno的Android頻率計數器
- 頻率計數器FC510前面板開源分享
- 內插倒數頻率計數器FC510開源分享
- 帶預分頻器的Arduino射頻頻率計數器
- 基于藍橋杯單片機的頻率計數器模塊簡單分析
- 如何使用STC15單片機進行頻率計及方波發(fā)生器的設計 36次下載
- 基于單片機的頻率計數器的設計 38次下載
- 頻率計數器 26次下載
- 自制25MHz頻率計數器 36次下載
- 頻率計數器仍然是通用工具 10次下載
- 6位數顯頻率計數器 21次下載
- 25MHz頻率計數器的制作方法
- 函數信號發(fā)生器怎么調頻率 1030次閱讀
- 簡單認識脈沖計數器 1212次閱讀
- 函數信號發(fā)生器怎么頻率調整 811次閱讀
- 函數發(fā)生器的頻率調整和波形選擇方法 672次閱讀
- 頻率計有哪些作用 971次閱讀
- proteus波形發(fā)生器頻率怎么調 2555次閱讀
- 基于四通道運算放大器的函數發(fā)生器電路 1075次閱讀
- 5位頻率計數器電路分享 2395次閱讀
- 如何使用Arduino制作一個頻率計數器? 6115次閱讀
- 頻率計數器的工作原理和發(fā)展 1.2w次閱讀
- 使用單片機實現數字頻率計數器的設計說明 4961次閱讀
- 電子計數器的使用_電子計數器功能 1.4w次閱讀
- 基于AT89S51單片機實現信號頻率計數功能的設計 2550次閱讀
- cd4046應用電路圖大全(金屬探測儀/頻率計/充電器/信號發(fā)生器) 3w次閱讀
- 首款LXI C 類標準的頻率計數器Agilent 53200系列日前被推出 892次閱讀
下載排行
本周
- 1ADI高性能電源管理解決方案
- 2.43 MB | 446次下載 | 免費
- 2免費開源CC3D飛控資料(電路圖&PCB源文件、BOM、
- 5.67 MB | 134次下載 | 1 積分
- 3基于STM32單片機智能手環(huán)心率計步器體溫顯示設計
- 0.10 MB | 120次下載 | 免費
- 4如何正確測試電源的紋波
- 0.36 MB | 5次下載 | 免費
- 5550W充電機原理圖
- 0.13 MB | 2次下載 | 6 積分
- 6USB的PD快充協議電壓誘騙控制器FS312A中文手冊
- 1.51 MB | 2次下載 | 免費
- 7USB的PD和OC快充協議電壓誘騙控制器FS312B中文手冊
- 1.35 MB | 2次下載 | 免費
- 8ADI公司串行端口開發(fā)和故障排除指南
- 343.09KB | 1次下載 | 免費
本月
- 1ADI高性能電源管理解決方案
- 2.43 MB | 446次下載 | 免費
- 2免費開源CC3D飛控資料(電路圖&PCB源文件、BOM、
- 5.67 MB | 134次下載 | 1 積分
- 3基于STM32單片機智能手環(huán)心率計步器體溫顯示設計
- 0.10 MB | 120次下載 | 免費
- 4使用單片機實現七人表決器的程序和仿真資料免費下載
- 2.96 MB | 44次下載 | 免費
- 53314A函數發(fā)生器維修手冊
- 16.30 MB | 31次下載 | 免費
- 6美的電磁爐維修手冊大全
- 1.56 MB | 22次下載 | 5 積分
- 7感應筆電路圖
- 0.06 MB | 10次下載 | 免費
- 8使用TL431設計電源
- 0.67 MB | 8次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935119次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關降壓/升壓雙向直流/直流轉換器 PCB layout 設計
- 1.48MB | 420062次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233084次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費下載
- 340992 | 191367次下載 | 10 積分
- 5十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183335次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81581次下載 | 10 積分
- 7Keil工具MDK-Arm免費下載
- 0.02 MB | 73807次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65987次下載 | 10 積分
評論
查看更多