AUTOSAR MCAL決議: ADC
1. 知識點概覽
可能很多人認為ADC很簡單,是的,ADC的作業原理很多人大概了解 ,但再簡單的模塊在AUTOSAR里面就沒聽說過簡單的,先看看一張圖吧,以下是我大概總結的一些ADC模塊里面的概念,該圖也只是盡量囊括主要概念,并非所有東西都能體現,下圖只是列舉的知識點,各個知識點之間有牽連,總之并沒有你想的那么簡單,本文也不會涉及到下圖中的所有知識點,但會盡量將重要的知識點給大家講解清楚,

2. Group/Channel/Hardware關系
首先來看看最常見的Group, Channel與硬體實體(HW Instance)/硬體通道之間的關系,

如上圖所示,Group及Channel是軟體層面抽象出來的概念,這里的Channel可以說是邏輯通道,其與硬體通道相對應,但是注意這里的對應并非那么絕對,邏輯通道的0并非只能與硬體的通道0關聯,而是可以任意映射,但是每個邏輯通道只能與一個物理通道映射,并且邏輯通道的編號是連續編碼的,而硬體通道則不同,不同的芯片上面可能有多個物理單元,每個物理單元下面又有多個通道,這些通道的編號在芯片手冊里面通常是以每個物理單元里面重新獨立編號的,如上圖所示,ADC0和ADC1就是兩個物理單元,而他們下面分別由3個通道,其編號都是從0開始編碼,下文提到的Channel默認指軟體層面的邏輯通道,
- 任何Channel都必須掛靠到Group下面,上層/API都是操作Group的,不能直接去操作Channel,
- 每個Group下面可以掛一個或多個Channel,但至少有一個Channel,如上圖Group5是空的則不允許,
- 如果掛了多個Channel,則這些Channel必須屬于同一硬體單元,不能跨多個物理單元,如上圖Group3是不允許的,
- 一個Channel可以同時屬于多個Group,如上CH0,CH1,但這種情況需要用戶自己合理管控轉換順序,否則可能會出現沖突,
部分廠商支持Group里面的Channel可以通過API去部分開啟或關閉(但注意該功能為擴展功能,并非標準功能),
3. 轉換及觸發模式
AUTOSAR里面,ADC驅動模塊支持兩種轉換模式及兩種觸發模式,
首先來看轉換模式:一種是One-shot(一次性的),另一種是Continuous(連續性的),兩者有什么區別呢?顧名思義,One-shot在觸發后只轉換一次,轉換結束后就停止,然后將轉換結果寫入緩沖區中,而Continuous則不同,當用戶呼叫啟動轉換函式(Adc_StartGroupConversion)后開始采樣轉換,轉換完成后由硬體自動啟動下一次轉換,一直這樣回圈,直到你主動呼叫Adc_StopGroupConversion函式讓其停止,前面這兩句話看似簡單,但其包含的資訊卻不少,在深入展開講解前,我們先來看看另一個概念:觸發方式,
對應于轉換模式的還有觸發方式,觸發方式大體上分為兩類,分別是硬體觸發和軟體觸發,不同廠家的芯片,具體細分的硬體觸發方式可能不同,比如NXP的S32K系列芯片,其硬體觸發可以是PDB,也可能是BCTU,或者是外部信號觸發等,而軟體觸發實際上就是我們程式里面去呼叫啟動轉換函式(Adc_StartGroupConversion)就叫軟體觸發,
接下來我們深入講解一下上面所包含的意思,為了便于理解,我總結為下圖,

如上圖所示,軟體觸發對于兩種轉換模式都是適用的,而硬體觸發只適用于One-shot模式,軟體觸發這個比較好理解,因為是程式里面去呼叫一個API,而硬體觸發之所以只適用于One-shot模式,這里可以分兩個方面來看,首先它并不代表真的只能實作一次采樣轉換這種需求,如果你想實作連續采樣轉換也是可以的,硬體觸發模式下實作Continuous這樣的效果,可以通過對應的觸發源來實作,比如前面提到的PDB,很多時候它本身就是和Timer配合使用或者說大部分都是與類似于Timer這樣與時間相關的場景下使用,那么這些觸發源本身實作周期觸發這種功能是很容易的,
換個角度來說,假如硬體觸發支持Continuous模式,那么我們想想會發生什么呢?當第一觸發后,由于其運行在Continuous模式,其轉換完成后會自動啟動下一次轉換,然后中途你又來硬體觸發,豈不是他們會沖突,所以現在你知道為何硬體觸發不支持Continuous模式了吧,硬體觸發模式,對于ADC硬體來說,它完全聽從于這個觸發信號,你觸發一次就采樣轉換一次,你什么時候觸發我就什么時候開始采樣轉換,這樣就不會沖突,不會亂,這里其實不是很嚴謹,但為了說明這個功能,我想你應該能明白,不嚴謹是因為很多芯片可以配置硬體過濾,觸發一次,硬體會多次采樣(根據你配置)然后進行過濾,最后得到一個過濾后的結果,這完全是硬體層面的,相比軟體過濾其性能要高很多,但也由弊端,就是其過濾機制單一,所以這里我們以轉換結果為準就可以了,以拿到轉換結果為一次,而不管具體采樣的程序),
我們再換個角度來描述上面這幾者的關系,One-shot模式同時支持軟體觸發和硬體觸發兩種,而Continuous模式只支持軟體觸發,上面提到了為何不支持另外一種,聰明的你一定會問,那Continuous模式下,如果我頻繁呼叫Adc_StartGroupConversion函式不是一樣會沖突么,是的,理論上的確存在這個問題,所以在軟體層面,我們由狀態機管理,當第一次啟動轉換還沒完成時,你再次呼叫這個函式,軟體層面會忽略,只有當第一次的觸發完成轉換后,你再呼叫這個函式軟體才會繼續回應,
軟體觸發及硬體觸發其對應的API也是不一樣,都有相應的函式,這些函式通常都是一對一對的,如下所示,他們的功能也很明確,如函式名所示,就不深入講解了,引數也很簡單,
| 觸發方式 | 啟動/使能API | 停止/關閉API |
|---|---|---|
| 軟體觸發 | Adc_StartGroupConversion | Adc_StopGroupConversion |
| 硬體觸發 | Adc_EnableHardwareTrigger | Adc_DisableHardwareTrigger |
4.Buffer訪問模式及型別
你以為上面這些就完了么?如果這樣,那也不像我描述那么復雜了,接下來我們繼續添加新的功能屬性,看完后我相信你不會覺得ADC就是采樣轉換那么簡單了,當然本文的目的就是讓你看完后也覺得,ADC也不過如此,都清楚了,那就達到目的了,🐶
除了上面提到的轉換模式以及觸發方式,其buffer也對應不同的訪問方式,并且這幾者是緊密相連的,如下圖所示:

Buffer的訪問方式分為Streaming和Single兩種,Stream模式又分為Linear(線性模式)和Circular(回圈模式),Single模式相對簡單,而Stream模式下的兩種訪問模式與前文提到的轉換模式相匹配又會得到不同的效果,
與Stream模式相關的另一個引數我們不得不提及,那就是采樣數(Adc Group Streaming Numbers Samples),這個引數也扮演重要角色,先說簡單的Single模式,該模式下采樣數只能為1,并且不管你是One-shot模式還是Continuous模式,都轉換一次之后就停止,這種配置搭配下兩種轉換模式沒啥區別,
如果你問我,到底他們誰才是老大,到底是轉換模式說了算還是Buffer的訪問模式說了算,那我只能告訴你,他們不搞霸權,他們講民主,分不同組合,誰都有話語權,
再來看Streaming下的Linear模式,該情況下,如果采樣數配置為1,那么效果和Single是一樣的,轉換一次就停止,如果采樣數大于1,則轉換次數等于采樣數,當設定的采樣數的次數完成后自動停止,
最后一種Circular則是一直回圈,不會自動停止,直到你主動呼叫停止函式,
以上所有情況都需要注意Buffer的大小,如果設定錯誤,則很容易溢位導致程式例外,如果模式為Streaming(注意包含兩種型別),用戶需要保證提供的Buffer大小足夠容納所有Channel的大小,Buffer的大小與Channel數量及Streaming的sample數有關,計算方法為,Channel * StreamSampleNum,型別為SizePerChannel允許的最小型別,假如你的ADC轉換精度是12Bit的,那么每個通道需要uint16型別的變數存盤,也就是SizePerChannel為2Bytes,StreamSampleNum設定為2,某個Group里面你配置了3個Channel,則你定義的Buffer大小為:3*2=6,型別為位寬大于uint16型別的,比如uint16 TestBuffer[6],
如上所述,Streaming的Buffer可以選擇線性的或回圈的,每次轉換完成后,Buffer會從頭覆寫,Buffer的初始化可通過呼叫Adc_SetupResultBuffer函式實作,每個Group僅需提供一個Buffer即可,注意其大小,
Adc_GetStreamLastPointer引數回傳第一個Channel的buffer位置,由于每個Channel的Buffer是按照順序線性排布的(先放第一個Channel,再挨著放第二個Channel,依次排放),所以用戶可以通過前面提到的采樣數(Sample number)來計算其他Channel的位置資訊,函式回傳值代表當前完成了多少次組轉換,如果為0,則引數回傳對應為NULL,如果等于設定的Sample number,則代表buffer里面的所有值都有效,只有在轉換完成后才會回傳有效值,如果ADC處于busy或者idle狀態,則回傳0,
Adc_ReadGroup,第一個引數是你想讀取的組的索引號,第二個引數是快取的指標,
ADC驅動不提供直接去訪問硬體轉換結果暫存器的API,只提供訪問中轉Buffer的API(部分廠商會進行擴展),
5. 其他重要機制
| 轉換型別 | SW API | HW Event Trigger |
|---|---|---|
| One-shot | Normal Conversion | Injected Conversion(255) |
| Continuous | Normal Conversion | X |
Group可以設定優先級,數字越大優先級越高,Injected Conversion 型別優先級需要設定到最高,255,
AUTOSAR: 標準規定可以針對每路Channel配置單獨的觸發源,但某些廠家的MCAL里面是每個Group配置觸發源,需要和芯片功能確認,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/289913.html
標籤:其他
