RT-Thread ADC 設(shè)備學(xué)習(xí)使用
目錄
前言
一、ADC 采樣基礎(chǔ)
- 1.1 ADC 通道
- 1.2 ADC 分辨率
- 1.3 ADC 采樣計(jì)算
二、ADC 設(shè)備操作函數(shù)
- 2.1 查找 ADC 設(shè)備
- 2.2 使能/關(guān)閉 ADC 通道
- 2.3 讀取采樣值
三、ADC 設(shè)備示例
- 3.1 ADC 設(shè)備使用步驟
- 3.2 測(cè)試
結(jié)語
前言
我曾經(jīng)考慮過把 RT-Thread 常用的設(shè)備都寫完,其實(shí)通過前面的《全面認(rèn)識(shí) RT-Thread I/O 設(shè)備模型》文章學(xué)習(xí),以及 UART 和 PIN設(shè)備的學(xué)習(xí)分析,對(duì)于 RT-Thread 其他的一些設(shè)備 自己看資料基本都可以用起來了,都是同樣的思路,自己寫寫程序測(cè)試都可以用起來了。
再加上 RT-Thread 有很多軟件包,正真的我們實(shí)際的普通應(yīng)用中需要自己寫的也不會(huì)太多(除非你使用的設(shè)備傳感器是小眾品牌或者新品,那根據(jù)前面文章也刻意自己嘗試把驅(qū)動(dòng)寫好),所以我再簡(jiǎn)單的測(cè)試幾個(gè)典型的設(shè)備,設(shè)備驅(qū)動(dòng)篇也就算更新完了。
本文相對(duì)比較輕松,測(cè)試一下簡(jiǎn)單的 ADC 設(shè)備。
??
本 RT-Thread 專欄記錄的開發(fā)環(huán)境:
RT-Thread記錄(一、RT-Thread 版本、RT-Thread Studio開發(fā)環(huán)境 及 配合CubeMX開發(fā)快速上手)
RT-Thread記錄(二、RT-Thread內(nèi)核啟動(dòng)流程 — 啟動(dòng)文件和源碼分析)
??
RT-Thread 設(shè)備篇系列博文鏈接:
RT-Thread記錄(十、全面認(rèn)識(shí) RT-Thread I/O 設(shè)備模型)
RT-Thread記錄(十一、I/O 設(shè)備模型之UART設(shè)備 — 源碼解析)
RT-Thread記錄(十二、I/O 設(shè)備模型之UART設(shè)備 — 使用測(cè)試)
RT-Thread記錄(十三、I/O 設(shè)備模型之PIN設(shè)備)
一、ADC 采樣基礎(chǔ)
ADC(Analog-to-Digital Converter) 模數(shù)轉(zhuǎn)換器,把模擬信號(hào)轉(zhuǎn)化為數(shù)字信號(hào),比較簡(jiǎn)單。在我們測(cè)試之前簡(jiǎn)單的說明 ADC 使用的幾個(gè)基本點(diǎn):
1.1 ADC 通道
對(duì)于現(xiàn)在的 MCU 來說,一般都有 ADC 引腳,將需要檢測(cè)的模擬量連接至對(duì)應(yīng)的 IO 口,做好配置就能使用,對(duì)于我們測(cè)試使用的 STM32 來說,其 ADC 通道對(duì)應(yīng)關(guān)系我在以前 STM32 筆記文章中有過記錄,如下表格:
1.2 ADC 分辨率
分辨率以二進(jìn)制(或十進(jìn)制)數(shù)的位數(shù)來表示,一般有8位、10位、12位、16位等。
對(duì)于我們測(cè)試使用的 STM32F1xx 系列的芯片來說,他們的 ADC 最大支持12位,這個(gè)在 STM32 芯片手冊(cè)中可以看到:
截圖是為了說明很多資料其實(shí)都是官方文檔中會(huì)說明,當(dāng)然官方文檔是英文版本的,再次聲明一下,學(xué)習(xí)一個(gè)芯片最好的資料就是官方文檔 。
很多常見的問題你或許可以網(wǎng)上搜索就能找到,但是如果一個(gè)新的芯片,網(wǎng)上參考資料少,你得想起來官方文檔!
分辨率是什么概念?
比如一個(gè)ADC設(shè)置為 12 位的分辨率,2 的12 次方 = 4096,簡(jiǎn)單來說就是這個(gè) ADC 設(shè)備把他的量程分為 4096 份:0 ~ 4095 最大值 4095 就等于他量程的最大值。
一般來說我們使用 STM32 VDDA引腳都是直接連接3.3V,所以STM32 ADC的量程為 0~ 3.3V 。如果讀到 4095 的ADC 值,就表示讀到的電壓為 3.3V 。
至于12位分辨率是除 4095 還是 4096 ,這個(gè)其實(shí)網(wǎng)上各有說法,用 4095 的可能占大多數(shù),實(shí)際上結(jié)果相差不大。
1.3 ADC 采樣計(jì)算
我們 ADC 讀取到的是數(shù)字量,數(shù)字量表示并不直觀,所以一般我們最終還是要轉(zhuǎn)化成模擬量,轉(zhuǎn)化的公式在以前 STM32 使用記錄文章中也有過,如下圖:
根據(jù)上文說明,只要在電路設(shè)計(jì)的時(shí)候 STM32 的 VDDA 引腳是直接與3.3V 連接的,就可以用如下公式計(jì)算:
最終讀出的電壓值 = VDDA(一般來說是3.3V)* 讀到的 ADC 的值(理解為實(shí)際讀到了多少份)/ 4095 (12位分辨率)。
二、ADC 設(shè)備操作函數(shù)
從本文開始我們就不分析設(shè)備的驅(qū)動(dòng)實(shí)現(xiàn)原理了,前面的 UART 和 PIN 設(shè)備已經(jīng)很透徹了,感興趣大家都可以自己查看源碼分析。
ADC設(shè)備操作函數(shù),還是比較簡(jiǎn)單的,就4個(gè):
2.1 查找 ADC 設(shè)備
rt_device_find
以前就見過的,I/O 設(shè)備模型通用的查找函數(shù):
/*
參數(shù) 描述
name ADC 設(shè)備名稱
返回 ——
設(shè)備句柄 查找到對(duì)應(yīng)設(shè)備將返回相應(yīng)的設(shè)備句柄
RT_NULL 沒有找到設(shè)備
*/
rt_device_t rt_device_find(const char* name);
但是這里需要額外說明的是,使用此函數(shù)查找 ADC 設(shè)備需要強(qiáng)制轉(zhuǎn)換一下,我們定義用來接收的設(shè)備句柄不是使用rt_device_t
,而應(yīng)該使用rt_adc_device_t
:
2.2 使能/關(guān)閉 ADC 通道
根據(jù)自己使用的 GPIO 引腳(對(duì)應(yīng)上文 ADC 通道表格),對(duì) ADC 通道進(jìn)行使能和關(guān)閉。
使能 ADC 通道:
/*
參數(shù) 描述
dev ADC 設(shè)備句柄
channel ADC 通道
返回 ——
RT_EOK 成功
-RT_ENOSYS 失敗,設(shè)備操作方法為空
其他錯(cuò)誤碼 失敗
*/
rt_err_t rt_adc_enable(rt_adc_device_t dev, rt_uint32_t channel)
關(guān)閉 ADC 通道:
/*
參數(shù) 描述
dev ADC 設(shè)備句柄
channel ADC 通道
返回 ——
RT_EOK 成功
-RT_ENOSYS 失敗,設(shè)備操作方法為空
其他錯(cuò)誤碼 失敗
*/
rt_err_t rt_adc_disable(rt_adc_device_t dev, rt_uint32_t channel)
2.3 讀取采樣值
/*
參數(shù) 描述
dev ADC 設(shè)備句柄
channel ADC 通道
返回 ——
讀取的數(shù)值
*/
rt_uint32_t rt_adc_read(rt_adc_device_t dev, rt_uint32_t channel)
三、ADC 設(shè)備示例
ADC的原理以及操作函數(shù)都比較簡(jiǎn)單,我們?cè)?RT-Thread Studio 使用 ADC 設(shè)備,反倒是他的使用步驟需要稍微注意一下:
3.1 ADC 設(shè)備使用步驟
我們以前講過,在 RT-Thread 工程中,所有的外設(shè)的配置都是在 board.h
文件中,我們可以查看其中關(guān)于 ADC 使用步驟的注釋:
1、首先,在 RT-Thread Studio 工程中,打開 RT-Thread Settings,使能 ADC 驅(qū)動(dòng),如下圖所示:
接著上圖的操作,通過組件欄目打開 ADC 驅(qū)動(dòng),退出保存:
2、 宏定義 #define BSP_USING_ADC1
(這里需要確定自己準(zhǔn)備使用哪一個(gè) ADC):
3、找一個(gè) ADC 初始化的代碼,通過STM32CubeMX 配置:
我們按照系列文章第一篇:RT-Thread記錄(一、RT-Thread 版本、RT-Thread Studio開發(fā)環(huán)境 及 配合CubeMX開發(fā)快速上手) 來使用STM32CubeMX 進(jìn)行配置:
設(shè)置完成后記得看一下 ADC 時(shí)鐘部分:
完成后直接生成代碼(不要打開,回到 RT-Thread Studio 如果彈出界面點(diǎn)擊確認(rèn))然后可以發(fā)現(xiàn)工程中已經(jīng)更新了 adc.h
:
到這一步,我們已經(jīng)能夠找到我們需要的 HAL_ADC_MspInit
文件了,通過 adc.h
頭文件找到 adc.c
文件中的這個(gè)函數(shù):
4、 把HAL_ADC_MspInit
函數(shù)復(fù)制到 board.c
文件最后面,如下圖:
5. 修改 stm32xxxx_hal_config.h
文件,使能 ADC 模塊:
這里我們要注意下一下,我們使用過 STM32CubeMX ,所以這個(gè)文件的位置發(fā)生了變化,這個(gè)在以前講過,具體看圖:
其實(shí)我們使用 STM32CubeMX 設(shè)置過 ADC 以后,這最后一步我們不需要修改,因?yàn)樵谖募?CubeMX已經(jīng)修改好了:
到這里,ADC 的配置就算全部完成了,我們可以直接在應(yīng)用程序中,使用 ADC 設(shè)備操作函數(shù)實(shí)現(xiàn)ADC 的讀取。
3.2 測(cè)試
基于上面的步驟,我們直接在應(yīng)用層調(diào)用接口,直接放一張圖說明:
測(cè)試結(jié)果:
開發(fā)板的供電不是標(biāo)準(zhǔn)的3.3V,而是3.28V,所以最終結(jié)果計(jì)算出來有點(diǎn)誤差= =!
結(jié)語
本文學(xué)習(xí)的 ADC 設(shè)備操作使用比較簡(jiǎn)單,反倒是他的使用配置相對(duì)來說復(fù)雜一點(diǎn)。
寫完 ADC 設(shè)備,計(jì)劃再測(cè)試一個(gè) SPI 設(shè)備,就要做設(shè)備驅(qū)動(dòng)小結(jié)了,I/O 設(shè)備模型部分其實(shí)前面幾篇博文學(xué)會(huì)了,也就會(huì)了,其他的只不過是需要花時(shí)間看一看。
-
adc
+關(guān)注
關(guān)注
97文章
6300瀏覽量
542460 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4237瀏覽量
61971 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1239瀏覽量
39442
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論