AVR/Arduino定時/計數器、中斷入門

来源:http://www.cnblogs.com/zhiyishou/archive/2016/12/13/6170912.html
-Advertisement-
Play Games

在Arduino中,可以使用AnalogWrite來使用硬體產生490Hz/980Hz的pwm波,並可根據參數來設定占空比。不瞭解這個的同學可以去 "AnalogWrite" 學習下, "SecretsOfArduinoPWM" 也是講了Arduino在avr的定時/計數器上做的封裝,我們這裡並不講 ...


在Arduino中,可以使用AnalogWrite來使用硬體產生490Hz/980Hz的pwm波,並可根據參數來設定占空比。不瞭解這個的同學可以去AnalogWrite學習下,SecretsOfArduinoPWM也是講了Arduino在avr的定時/計數器上做的封裝,我們這裡並不講Arduino相關,而是講AVR的定時/計數器,如何產生更多PWM波和定時/計數器的中斷使用。

AVR Timer/Counter(以下統稱Timer)

以ATmega358p為例,其內部擁有一個16位計時器,兩個8位計時器,下圖則為16位計時器的大致圖解:

對於沒有接觸過avr內部的Arduino同學來說,這張圖看不出來任何意思,別急,這些都是AVR-GCC里定義的縮寫,我們先來解釋下圖中的縮寫對照:

縮寫 全稱
TCNT Timer/Counter Register
TCCR Timer/Counter Control Register
OCR Output Compare Register
OC Output Compare Match Output
ICR Input Capture Register
Int.Req Interrupt Request
TOV Timer Overflow
ICF Input Capture Flag

而圖中TCNT為主要工作部件,其工作模式的是依據TCCR的設定值。以該16位計時器為例,該計時器在ATmega358p中的序號為1,則其所有縮寫都會與1有關,即TCNT1的工作模式由TCCR1A和TCCR1B來決定。不急著看別的,我們先來瞅瞅TCCR1A與TCCR1B是怎麼來配置TCNT1的工作模式的:

TCCR1A:

圖中7、6、5、4位分別應該是COM1A1、COM1A0、COM1B1、COM1B0,話說這datasheet有時候也真是會省事兒

TCCR1B:

這兩個寄存器都是八位寄存器,再來一張表來對照一下圖中的縮寫:

縮寫 全稱
COMnA Compare Output Mode for Channel A
COMnB Compare Output Mode for Channel B
WGM Wave Generation Mode
ICNC Input Capture Noise Canceler
ICES Input Capture Edge Select
CS Clock Select

我們通過配置這兩個寄存器來控制TCNT1的工作模式,通過配置WGM來選擇波型生成模式,主要有Fast PWM/PWM Phase Correct/CTC模式,並且也擁有不同的計數TOP值,有0xFF/ICR1/OCR1A等,通過COM結合WGM對針腳的輸出做配置,用CS來選擇生成波型的prescaler,分別有1/8/64/256/1024,或者外部時鐘。TOP值為ICR1或OCR1A時,要對使用的寄存器進行賦值。工作模式中,Fast PWM與PWM Phase Correct這兩種計數模式不同的是,PWM Phase Correct可以到達top值後又遞減至0,Fast PWM到達top值後則會觸發上升或下降沿。

如下配置:

TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(WGM10);
TCCR1B = _BV(CS12) | _BV(CS10);
//WGM配置了PWM Phase Correct,使用的TOP值為0x00FF
//COM配置了在往上計數時清零,往下計數時置位
//使用了1024的prescaler
OCR1A = 100;
OCR1B = 50;

則我們可以得到的時鐘頻率為Fclk/(prescaler*TOP)=16000000/(1024*255)/2=30.63Hz,且OC1A占空比為OCR1A/TOP=100/255=39%,OC1B占空比為OCR1B/TOP=50/255=19.6%

更多配置組合請看SecretsOfArduinoPWM/PWM的秘密或直接datasheet,其中要註意的是,使用OCR1A為TOP值時,可以在一定範圍內配置任意頻率,但OC1A的占空比為始終為50%,OC1B的占空比為(OCR1B+1)/(OCR1A+1)

Interrupt

中斷是其它與CPU非同步進行的硬體與CPU交互的一種方法。這樣我們就不用在CPU中去等待其它某些任務的完成和觸髮狀態,由其它硬體去來觸發進入CPU主進程的時機。回頭看第一張大圖,在圖中可以找到四處(Int.Req),分別是TOVn(Timer/Counter Overflow), OCnA(Output Compare A Match), OCnB(Output Compare B Match), ICF(Input Capture Flag),根據字義我們便可瞭解到該中斷的作用,在使用中斷時,我們要先於TIMSK1(Timer/Counter 1 Interrupt Mask Register)中開啟相應的中斷位。

下圖為TIMSK1:

圖中的字母應為ICIE1, OCIE1B, OCIE1A, TOIE1,這數據手冊,也是太懶了。下表為對照:

縮寫 全稱
ICIE Input Capture Interrupt Enable
OCIE Output Compare Interrupt Enable
TOIE Timer/Counter Overflow Interrupt Enable

開啟該遮罩位後,便可打開中斷,前提也是在全局中斷打開的情況下(sei()為打開全局中斷,cli()為關閉全局中斷)。在當下的AVR-GCC環境中,我們使用巨集命令ISR來定義中斷程式,使用方法如下:

ISR(xxxx_vect)
{
    // user code here
}

而這裡的xxxx_vect則是要監聽的中斷向量地址,可以於Atmel官網<avr/interrupt.h>: Interrupts上找得到所有中斷對應的向量名稱。

如上面的四種向量,於mega328p中,則分別對應:

ICIE1 TIMER1_CAPT_vect
OCIE1A TIMER1_COMPA_vect
OCIE1B TIMER1_COMPB_vect
TOIE1 TIMER1_OVF_vect

而中斷又分為兩種,一種為事件觸髮型,這種中斷會在上一個中斷沒有運行結束前隊列等待,直至前面優先的任務完成後才能執行;另一種為中斷條件觸發,如果上一個中斷還沒有返回回來,那麼則不會觸發這個中斷(如果定時器為高頻時則會出現該情況)。所以在使用中斷的時候,進入中斷、跳轉、返回都需要耗費時鐘,不要對高頻使用中斷,甚至會使主線程一直處於堆棧狀態,且中斷中不要運行太多程式。

There are basically two types of interrupts: The first type is triggered by an event that sets the Interrupt Flag. The second type of interrupts will trigger as long as the interrupt condition is present.

The traps when using interrupts中也是羅列了一些使用中斷的坑和技巧,可以看看。附上Atmega328p的datasheet,真是有問題就看datasheet,上面的圖與摘錄都是從datasheet里出來的。

Have fun.



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 安裝samba服務步驟ps -e 查看進程ps -e | grep 文件名 管道符的使用rpm -qa 安裝包的查看rpm -qa | grep samba 抓Samba安裝包 註釋:包與包之間有依賴關係,必須保證網路是暢通的 第一步:yum install samba samba-client s ...
  • 昨天搞定了一個十萬火急的issue,客戶抱怨產品升級後系統會變慢和CPU使用率相當高,客戶脾氣很大,聲稱不儘快解決這個問題就退貨,弄得我們 R&D壓力很大,解決這個issue的任務分給了我,客戶是南非的一個公司,由於時差問題,我只好在家遠程解決問題,晚上8點半用 gotomeeting遠程到客戶電腦 ...
  • 本文地址 分享提綱: 1.查看是否啟動 2. 設置自動啟動 1.【查看是否啟動】 啟動SSH服務 “/etc/init.d/sshd start”。然後用netstat -antulp | grep ssh看是否能看到相關信息就可以了。 2.【設置自動啟動】 如何設置把ssh等一些服務隨系統開機自動 ...
  • nginx代理https站點(親測) 首先,我相信大家已經搞定了nginx正常代理http站點的方法,下麵重點介紹代理https站點的配置方法,以及註意事項,因為目前大部分站點有轉換https的需要所以學習這個方法也是很重要的,我就不啰嗦了 直奔主題了……………… 測試環境 nginx版本 ngin ...
  • 在安裝好的matlab下有MCR(MatlabCompilerRuntime)在matlab2011/toolbox/compiler/deploy/glnxa64下找到MCRInstaller.zip安裝包解壓後執行install命令,選擇路徑進行安裝即可 環境變數設置:setenv LD_LIB ...
  • 最新發佈的開源 Zephyr Project™(Zephyr 項目)是一款小型且可伸縮的實時操作系統,尤其適用於資源受限的系統,可支持多種架構;該系統高度開源,對於開發人員社區完全開放,開發人員可根據需要對該系統進行剪裁,以支持最新硬體、工具和設備驅動程式;該系統高度模塊化平臺,可輕鬆集成任何架構的 ...
  • PS:在伺服器硬體資源額定有限的情況下,最大的壓榨伺服器的性能,提高伺服器的併發處理能力,是很多運維技術人員思考的問題。要提高Linux系統下的負載能力,可以使用nginx等原生併發處理能力就很強的web伺服器,如果使用Apache的可以啟用其Worker模式,來提高其併發處理能力。除此之外,在考慮 ...
  • 1 刪除Mysql yum remove mysql mysql-server mysql-libs mysql-server; find / -name mysql 將找到的相關東西delete掉; rpm -qa|grep mysql(查詢出來的東東yum remove掉) 2 安裝Mysql ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...