jfpoilpret的公認答案寫得很好,非常有效,在99%的情況下,我都會按照他的解釋做。他的解決方案完全在您定義的參數之內,因此它們應該運作良好。但是,什麼比“ 很好”更好? 完美!畢竟,問題在於要產生確切的價值。正如所說的,在大多數情況下(可以說是所有情況),足夠接近是好的,即使當以1秒鐘需要1秒鐘作為時鐘處理某些東西時,您仍然必須遭受繼承零件的缺陷。
我要做什麼會提示並非總是可能的。在某些情況下,這是可能的,但是比這種情況要麻煩和多得多。是否值得視情況而定。我的目標主要是為將來的參考提供替代方法,在某些情況下更好。本書是針對沒有電子經驗的Arduino新手編寫的。
對於更高級的人來說,這可能看起來太冗長和笨拙了。但我相信,這些人可能已經知道並且不需要這個答案。這也適用於每個微控制器,每個製造商和體系結構。但是對於其他微控制器,您將需要查閱正確的數據表以找到正確的寄存器以及預分頻器的名稱和值。
在您的情況下,您需要一個特定的頻率,其好處是,恰好56實際上,可以很容易地實現kHz(不計算零件的實際缺陷)。因此,這也是一個完美的示例案例。
生成信號取決於微控制器的計時器和時鐘源,如jfpoilpret所述。他的回答僅涉及一種觀點問題,並且擺弄了定時器。但是,您也可以擺弄時鐘源,甚至可以同時擺弄時鐘,以獲得協同作用和出色的結果。通過更改環境參數(在這種情況下,是對系統進行黑客攻擊並更換時鐘源),我們可以輕鬆,簡單得多地處理特定問題。
首先提醒一下,由於切換在引腳狀態下,您需要執行比信號頻率高兩倍的ISR。這是每秒112,000次。正如已經指出的,56,000和16,000,000的總和並不十分理想。我們需要更改信號頻率或間歇頻率。現在讓我們處理一個不變的信號頻率並找到更好的時鐘速度。
選擇一個比56 kHz(或112 kHz)大一個數量級的時鐘將是最簡單的選擇,但實際上相同),因為您只添加零,這種數學對大多數人來說是最簡單的。不幸的是,這個世界上的一切都是某種妥協。並非每個值都可以工作。
第一個示例的發電機轉速太低。
如果選擇56,000 Hz時鐘,您將無能為力。將需要在每個週期調用ISR,並且無法執行其他任何操作。這是完全沒有用的。如果您選擇10倍快的速度(560 kHz),則將有9個微控制器週期(計時器達到其最大值需要10個週期-一個週期才能調用ISR函數)來完成工作,而這完全是不夠的。您通常只是經常需要更多的計算能力。
如果您選擇一個太大的值,則因為56 MHz的微控制器根本無法使用它。太快了。因此,僅選擇商店中的最大價值也不會減少價值。
原始Arduino Uno R3的備用時鐘為16 MHz,因此可以保證任何較慢的工作。下一個大於56且小於16 MHz的數量級的值是5.6 MHz。這樣可以每隔50個週期調用一次ISR,並創建一個理想的112,000 Hz定時器頻率。您的信號將恰好是56 kHz。在ISR調用之間,您將有49個MCU週期來執行您的程序,但仍約為原始時鐘速度的1/3。一個人可以使用112作為基本頻率,並使用11.2 MHz時鐘,這將占到現有16 MHz諧振器的約2/3。 ISR函數每100個週期就會調用一次,並且仍會生成一個完美的56 kHz信號。
但是這些值存在兩個主要問題。
為了避免這種情況,我們可以查看可用的諧振器值,並找出可以用於生成精確所需值的其他方法。如果將56除以4,我們得到14,幸運的是有一個14 MHz諧振器。這為我們提供了更高的速度和更多的功能,並且同樣容易找到寄存器值。要每秒調用一次ISR 112,000次,我們需要在OCR寄存器中放入一個十進制124或十六進制0x7C的值,因此通過計算124個週期+ 1來調用ISR,我們得到了理想的理想值。
NB
- ISR-中斷服務程序(這是僅在生成的中斷上執行的代碼)
- 程序的大小取決於內存大小!它與時鐘速度無關,也與您調用ISR的頻率無關。
-
當微控制器以程序命令啟動時,計數器將遞增。如果產生中斷,則調用ISR,並將該值存儲在特殊寄存器中。 ISR代碼完成後,程序計數器的值將從該特殊寄存器中恢復,並且程序從中斷處繼續執行,就好像從未發生過一樣。
我將舉一個非常笨拙的示例。如果您是一個純粹主義者,我警告您:鼻子和眼睛可能會流血。分步路線說明是您的主程序及其命令。您走路或跑步的速度取決於您的“時鐘速度”,而不取決於路線說明(前進30步,向左1旋轉90度,前進10步,向右45度等),它們始終是相同的。現在想像一下,一個小孩或一個貪婪的腐敗的當地政客不時地解開鞋子。這是產生中斷的事件。然後您在最後一步後停下來,跪下並再次係好鞋子。這是您的ISR程序。
然後從停止的地方繼續;您不是從頭開始。當您在世間無時無刻不在走路時,即使您必須每隔一步都係鞋帶,也不在乎。但是,如果您這樣做有時間限制,例如在奧運會上奔跑100米(或從飢餓的食肉天敵中奔跑),停下來系鞋帶可能會帶來可怕的後果。微控制器也是如此。即使只執行一行代碼,程序也會繼續執行,儘管速度很慢。如果您根本不關心速度,那將不是問題。如果您需要做一些與時間有關的事情,例如使用其他與計時器有關的動作,那麼干擾可能是非常不希望的並且有問題。
-
少就是多!更快的時鐘並不總是更好。較慢的時鐘設備消耗的功率要少得多。這可能是電池供電設備中的關鍵點。
-
所需的周期是從以下公式得出的:
(時鐘速度/(預分頻器值*所需的ISR通話頻率))-1
ol>