【GoRK3288】6.TSADC操作方法,gork32886.tsadc
請先在https://github.com/tjCFeng/GoRK3288下載 GoRK3288 開源庫。
Rockchip RK3288中有好多ADC,HS-ADC(High Speed ADC)、TS-ADC(Temperature Sensor ADC)。
其中HS-ADC 主要用於傳輸資料,例如手冊中說的GPS資料等;而TS-ADC顧名思義,就是採集各種溫度感應器的資料了。
咱們先從簡單的開始,所以想辦法使用TS-ADC取得各種溫度。
由於溫度感應器是整合在CPU內部的,所以本次實驗不需要使用任何外部的硬體模組或開發板,直接通過程式來擷取結果。
來看看樣本程式吧
這次的程式更簡單,簡單到3條語句就夠了。 不過是不是這個代碼和C語言差別有些大了?這裡面其實有兩個要點,前面也曾提到過:單例模式和多返回值。
1.單例模式:
在設計模式中有一種叫單例模式,它的作用就是讓某一個類在程式運行期間內只被建立一次,即使被重複建立了, 那麼返回的也是已經存在的執行個體,而不再重新建立。不要被那麼高深的名字唬住,使用中理解為全域變數就行了。一般的靜態語言中這個方法會在建構函式中實現,然而Go語言是個特例,它沒有建構函式,所以呢我只能用個普通的函數來代替建構函式了。
至於為什麼非要把TSADC類作為單例來使用,這是因為在RK3288中,TSADC雖然有四個通道,但是它們被控制的寄存器只有一組,不能對每個通道分別控制,也就是要啟動一起啟動,要停止一起停止。為了避免多個執行個體化之間造成操作上的衝突,所以我認為單例模式更適合TSADC。
2.多返回值:
多返回值是Go語言的一大特色,其他的靜態語言是不具備的。而且對於TSADC來說,四個通道的資料是一起開始採集並且可以同時得到結果,而不是一個一個的完成,所以多返回值使用起來可能更方便一些。其實這麼寫也是有意突出語言特色,而且這個還是在寫這一節之前剛剛改成這樣的,原來的方法是標準的傳遞參數來擷取指定結果。這兩種方法無所謂好壞,如果使用起來不習慣的話可以增加一個指定通道的函數。
又說了這麼多,回到正題。代碼中RK3288.ITSADC()就是獲得TS-ADC類的執行個體,如果沒有其他地方再需要使用這個執行個體的話,後面可以直接調用方法函數GetData()。
再看這個函數的前半部分,_, Data, _, _是儲存結果的變數,_部分為不關心的結果,可以不儲存值,但是必須被佔位。
整條語句的意思為擷取TS-ADC第1通道的結果,擷取四個通道的結果應該寫為
Data1, Data2, Data3, Data4 := RK3288.ITSADC().GetData()
Go語言是不是很有意思?
後面的就簡單了,TS-ADC是12位的,Data儲存的結果是ADC的資料, 使用GetTemperature函數來將這個資料轉化為溫度值就是最終想要的結果了。
實際上,這個數值和溫度的變化不是線性,所以手冊裡給出了一個映射表
根據這個映射表進行換算可以得到溫度,具體的方法在TSADC.go中,感興趣的可以看一下。
運行程式,看看結果
CPU溫度33.x度,不知道準不準。
這裡還有一個問題,手冊中說明通道1為CPU溫度,通道2為GPU溫度,但是擷取通道2的資料始終為0,不知道為什麼,有時間還要請教一下Firefly的高手。
總結一下TSADC類的方法:
ITSADC:獲得TASDC的執行個體
FreeTSADC:釋放TSADC
GetData:獲得ADC資料(多返回值)
GetTemperature:將ADC資料轉化為溫度值(小數部分保留一位就可以了)
GoRK3288庫請在https://github.com/tjCFeng/GoRK3288下載。