資料介紹
描述
時間敏感的任務
幾乎所有使用微控制器的項目都具有某種與時間相關的組件,例如延遲或重復任務。內部定時器電路通過對從預分頻器或時鐘直接獲得的每個脈沖進行計數來啟用此功能。

通過獲取此計數器的值,您可以確定已經過去了多少時間。例如,如果 MCU 的時鐘設置為 125KHz,其中一個定時器設置為使用該時鐘,并且其預分頻器設置為 1/1024,則其計數器寄存器的每個增量大約等于 1/122 秒,這源自:
t
= 1 / (
CLK
/
prescaler
)
所以(1/122) = 1 / (125000 / 1024)
如果您好奇,預分頻器的工作是將輸入的時鐘脈沖除以某個值,這會使計數器減慢該因子。因此,預分頻值為 4 的定時器會將 8Mhz 的系統時鐘視為 2MHz。Arduino 的 millis()、delay() 和 micros() 都依賴這些定時器來操作。但是有一個問題:delay() 是阻塞的,為了使它成為非阻塞,你必須在每個循環中檢查 millis() 的值。
改用中斷
為了避免這個問題,ATmega328P 的定時器可以設置為在幾個不同的觸發器上觸發中斷。其中之一是溢出標志,每當計數器寄存器從其最大值翻轉到 0 時都會設置該標志,例如 8 位寄存器從 255 變為 0。觸發中斷的另一種方法是使用比較寄存器,它存儲一個與計數器連續檢查的值,并在計數器達到該值時引發中斷。ATmega328P 等微控制器使用這種功能來控制引腳上的 PWM,而其他更高級的 MCU 能夠直接從定時器切換引腳,而完全不需要 CPU。
設置硬件
對于這個例子,我創建了一個簡單的程序,它為 ATmega328P 的 Timer/Counter2 設置一個比較值,在比較匹配 A 上觸發一個中斷,并切換一個引腳的值。這方面的所有細節都可以在微控制器的數據表中找到。代碼首先調用 hardware_setup() 函數,其中設置了幾個寄存器來配置系統、定時器和引腳。(1 << DDD2)
通過將 的值放入寄存器,將數字引腳 2 設置為輸出。DDRD
接下來,通過將 1 放入 TCCR2B 寄存器的時鐘選擇位字段來設置定時器 2 的預分頻器,將預分頻器設置為 1/1024。

接下來,將 255 的值放入比較寄存器 A ( OCR2A
),這意味著當計數器到達 255 時將發生事件。TIMSK2
寄存器得到一個值(1 << OCIE2A)
放入其中,這讓定時器 2 在比較匹配時輸出中斷A 被觸發。最后,在每次比較匹配時也TCCR2A
獲得一個(1 << COM2A0)
切換的值。D12

程序執行和最終想法
雖然我們設置了TIMSK2
寄存器觸發中斷,但還是需要處理的。這是通過創建將在引發中斷時觸發的 ISR(中斷服務程序)來實現的。在附加的代碼中,ISR 增加一個計數器并清除標志。在 main() 的 while 循環中,檢查計數器變量以查看它何時達到 100,如果達到了,則通過執行 XOR 操作來切換 D2 的值,如下所示:PORTD ^= (1 << PORTD2);
使count
變量 volatile 很重要,因為它告訴編譯器它的值可以在程序正常執行路徑之外的任何時間更改。該程序應通過編程器刷新到 Nano。不要將 Arduino 函數與自定義定時器一起使用,因為這會弄亂你的定時器和內置函數。

使用此代碼,連接到引腳 2 的 LED 應每 2.5 秒閃爍一次。嘗試更改不同的值或在各種模式下設置其他計時器。
?
- labview超快自定義控件制作和普通自定義控件制作 13次下載
- labview自定義控件 18次下載
- ESP32上的自定義UART協議開源
- Arduino LCD圖標(自定義字符)
- 自定義視圖組件教程案例 14次下載
- Labview自定義右鍵快捷菜單功能實用小技巧 26次下載
- STM32CUBEMX(5)--自定義紅外NEC解碼,定時器TIM捕獲方式
- 串口屏LUA教程10-自定義串口指令
- Xilinx基本自定義OpenRISC系統硬件教程 93次下載
- LCD1602自定義顯示字符及漢字 85次下載
- AN958:自定義設計的調試和編程接口 2次下載
- 自定義fifo接口控制器 1次下載
- 1602自定義字符 1次下載
- 自定義函數測試學習工程
- matlab自定義函數調用的方法
- TSMaster 自定義 LIN 調度表編程指導 714次閱讀
- 基于YOLOv8實現自定義姿態評估模型訓練 2895次閱讀
- 博途用戶自定義庫的使用 1002次閱讀
- 添加自定義屬性控制fridaserver啟動和停止 1784次閱讀
- 什么是自定義序列 1216次閱讀
- 自定義特性能做什么? 846次閱讀
- 用AWTK和AWPLC快速開發自定義功能塊 1083次閱讀
- 基于AWTK和AWPLC開發自定義功能塊 957次閱讀
- 如何自定義函數或局部腳本 1481次閱讀
- 如何在Vivado中更改自定義的Interface 2947次閱讀
- 三種自定義彈窗UI組件封裝的實現 3191次閱讀
- Python學習要點:自定義序列實現切片功能 702次閱讀
- Glib創建自定義事件源的方法 3028次閱讀
- 如何給EOS賬號設置自定義權限 1496次閱讀
- springmvc 自定義攔截器實現未登錄用戶的攔截 2523次閱讀
下載排行
本周
- 1晶體三極管的電流放大作用詳細說明
- 0.77 MB | 30次下載 | 2 積分
- 2雙極型三極管放大電路的三種基本組態的學習課件免費下載
- 4.03 MB | 23次下載 | 1 積分
- 3多級放大電路的學習課件免費下載
- 1.81 MB | 20次下載 | 2 積分
- 4PC4401_DC-DC 42V反激式隔離開關電路
- 0.85 MB | 4次下載 | 免費
- 5HR1124S/9110S單通道低壓H橋電機驅動芯片中文手冊
- 1.30 MB | 1次下載 | 免費
- 6基于51/32單片機按鍵控制步進電機正反轉,A4988驅動
- 2.05 MB | 1次下載 | 1 積分
- 7STM32F10xxx單片機編程手冊
- 0.29 MB | 1次下載 | 免費
- 8西門子PLC-模擬量采集計算使用方法
- 0.07 MB | 次下載 | 2 積分
本月
- 1晶體三極管的電流放大作用詳細說明
- 0.77 MB | 30次下載 | 2 積分
- 2雙極型三極管放大電路的三種基本組態的學習課件免費下載
- 4.03 MB | 23次下載 | 1 積分
- 3第十一屆 藍橋杯 單片機設計與開發項目 省賽 程序設計試題及源碼
- 90.88KB | 23次下載 | 3 積分
- 4Python從入門到精通背記手冊
- 18.77 MB | 21次下載 | 1 積分
- 5多級放大電路的學習課件免費下載
- 1.81 MB | 20次下載 | 2 積分
- 6STM32F103C8T6開發板最小系統原理圖
- 0.78 MB | 17次下載 | 免費
- 7SX1308應用電路圖與SX1308升壓電路圖
- 0.18 MB | 8次下載 | 1 積分
- 8東芝彩色電視機29SF6C維修說明書
- 4.86 MB | 8次下載 | 1 積分
總榜
- 1matlab軟件下載入口
- 未知 | 935127次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關降壓/升壓雙向直流/直流轉換器 PCB layout 設計
- 1.48MB | 420063次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233089次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費下載
- 340992 | 191382次下載 | 10 積分
- 5十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183337次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81585次下載 | 10 積分
- 7Keil工具MDK-Arm免費下載
- 0.02 MB | 73814次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65988次下載 | 10 積分
評論