RTT(RT-Thread)ADC設備(RTT保姆級介紹)

目錄

ADC設備

前言

ADC相關參數說明

訪問ADC設備

配置ADC設備

ADC實例

硬件設計?

軟件設計


ADC設備

前言

ADC(Analog-to-Digital Converter) 指模數轉換器。是指將連續變化的模擬信號轉換為離散的數字信號的器件。

對于ADC的詳細介紹和在STM32中的裸機應用可參考以下博客

ADC電壓采集(基于STM32hal庫)(詳細介紹)_竹煙淮雨的博客-CSDN博客

ADC電壓采集(基于STM32hal庫)(保姆級應用)_竹煙淮雨的博客-CSDN博客

ADC相關參數說明

  • 分辨率:

分辨率以二進制(或十進制)數的位數來表示,一般有 8 位、10 位、12 位、16 位等,它說明模數轉換器對輸入信號的分辨能力,位數越多,表示分辨率越高,恢復模擬信號時會更精確。

比如電壓訪問在0-3.3V,如果使用12Bit的分辨率的話,最大表示的數字量為2^11-1=4095(范圍為0-4095),也就是把3.3V分為4096份,實際電壓值=模擬電壓值/4095*3.3V

  • 精度:

精度表示 ADC 器件在所有的數值點上對應的模擬值和真實值之間的最大誤差值,也就是輸出數值偏離線性最大的距離。

  • 轉換速率:

轉換速率是指 A/D 轉換器完成一次從模擬到數字的 AD 轉換所需時間的倒數。例如,某 A/D 轉換器的轉換速率為 1MHz,則表示完成一次 AD 轉換時間為 1 微秒。

訪問ADC設備

應用程序通過 RT-Thread 提供的 ADC 設備管理接口來訪問 ADC 硬件,相關接口如下所示:

  • 查找 ADC 設備

rt_device_t rt_device_find(const char* name);

  • 使能 ADC 通道

rt_err_t rt_adc_enable(rt_adc_device_t dev, rt_uint32_t channel)

@dev ADC 設備句柄

@channel ADC 通道

  • 讀取 ADC 通道采樣值(讀取到的是模擬量轉成數字量后的值)

rt_uint32_t rt_adc_read(rt_adc_device_t dev, rt_uint32_t channel);

@dev ADC 設備句柄

@channel ADC 通道

  • 關閉 ADC 通道

rt_err_t rt_adc_disable(rt_adc_device_t dev, rt_uint32_t channel);

僅僅有這些函數接口,并不能夠實現ADC設備的功能,我們還需要進行相應的配置。

配置ADC設備

打開我們的工程源碼中的board.h,關于芯片的一些外設的配置基本上都在board.h中去配置,關于我們之前的時鐘、串口配置,以及IIC、SPI、PWM等等的配置。

打開board.h找到ADC的相關配置步驟描述

/** if you want to use adc you can use the following instructions.** STEP 1, open adc driver framework support in the RT-Thread Settings file** STEP 2, define macro related to the adc*                 such as     #define BSP_USING_ADC1** STEP 3, copy your adc init function from stm32xxxx_hal_msp.c generated by stm32cubemx to the end of board.c file*                 such as     void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)** STEP 4, modify your stm32xxxx_hal_config.h file to support adc peripherals. define macro related to the peripherals*                 such as     #define HAL_ADC_MODULE_ENABLED**/
  • 步驟一:開啟ADC驅動框架的支持

  • 步驟二:定義一個ADC設備相關的宏

共有三種選擇

根據我們的STM32開發板公有三個ADC外設,這里選擇使用ADC1

  • 步驟三:拷貝ADC初始化函數,通過CubeMX生成stm32xxxx_hal_msp.c后,將相應的初始化函數拷貝到board.c中
  • 步驟四:修改hal層配置文件,使其支持ADC外設

ADC實例

我們在這里以ADC的獨立模式單通道采集模式為例,來使用我們RTT的ADC設備。

硬件設計?

我們的霸道開發板板載了一個貼片滑動變阻器,滑動變阻器的滑片端連接到了 STM32 的 PC1 引腳。

貼片滑動變阻器的動觸點通過連接至 STM32 芯片的 ADC 通道引腳。當我們旋轉滑動變阻器調 節旋鈕時,其動觸點電壓也會隨之改變,電壓變化范圍為 0~3.3V,亦是開發板默認的 ADC 電壓 采集范圍。

軟件設計

我們接著前面配置ADC設備的步驟進行。

1.首先尋找ADC1設備句柄

2.接著如果查找到ADC,則打開我們的ADC設備,這里使用專屬的使能函數,注意我們需要對dev進行類型轉換為rt_adc_device_t

3.使能完成之后,我們就可以繼續數據讀取了。這里我們開啟一個線程來讀取ADC1的通道11。

(1)動態創建線程

(2)設置入口函數

(3)開啟線程

4.在線程處理函數中,通過rt_adc_read函數進行ADC通道數據的讀取

5.此外要注意在線程處理中加上延時,這樣可以讓線程主動釋放CPU資源,讓CPU去調度其它線程

6.完善打印結果

7.將我們的CubeMX生成的代碼復制到board.c中

void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};if(adcHandle->Instance==ADC1){/* USER CODE BEGIN ADC1_MspInit 0 *//* USER CODE END ADC1_MspInit 0 *//* ADC1 clock enable */__HAL_RCC_ADC1_CLK_ENABLE();__HAL_RCC_GPIOC_CLK_ENABLE();/**ADC1 GPIO ConfigurationPC1     ------> ADC1_IN11*/GPIO_InitStruct.Pin = GPIO_PIN_1;GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);/* ADC1 interrupt Init */HAL_NVIC_SetPriority(ADC1_2_IRQn, 0, 0);HAL_NVIC_EnableIRQ(ADC1_2_IRQn);/* USER CODE BEGIN ADC1_MspInit 1 *//* USER CODE END ADC1_MspInit 1 */}
}

?8.編譯下載,注意要加上adc.h頭文件

運行結果,調節電壓旋鈕,模擬量正常輸出,但數字量輸出是%f???

(這個問題琢磨半天尚未解決,rt_kprintf("Analog val:%.3f\n\r\n",(float)val/4096.0*3.3);輸出的結果是%f???,同樣我將%.3f換成%d或%u輸出的結果卻是很大的隨機數,希望有大佬可以幫忙解決!!)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/40089.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40089.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40089.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

pandas數據分析38——數據框表格拓展以及縮回對齊

案例背景 需求是這個樣的: 把這個表格進行拓展。 代碼實現: df pd.DataFrame(np.array([[1, 2, 3,4], [a,b, c,d], [小明,小紅, 小馬,小天]])) df 方法一:自定義函數: def expand_dataframe(df):m, n df.shapenew_df pd.Dat…

linux系統中設置服務開機自啟動

1:背景描述 最近根據工作需要,需要服務實現開機自啟動的效果,因為平時只使用過nohup的后臺掛起操作,很少接觸開機,鏡像裝機服務自啟動的功能,因此,這里簡單記錄一下。 注意,開機自…

解鎖數據潛力:信息抽取、數據增強與UIE的完美融合

解鎖數據潛力:信息抽取、數據增強與UIE的完美融合 1.信息抽取(Information Extraction) 1.1 IE簡介 信息抽取是 NLP 任務中非常常見的一種任務,其目的在于從一段自然文本中提取出我們想要的關鍵信息結構。 舉例來講&#xff0…

從NLP到聊天機器人

一、說明 今天,當打電話給銀行或其他公司時,聽到電話另一端的機器人向你打招呼是很常見的:“你好,我是你的數字助理。請問你的問題。是的,機器人現在不僅可以說人類語言,還可以用人類語言與用戶互動。這是由…

windows權限維持—黃金白銀票據隱藏用戶遠控RustDeskGotoHttp

windows權限維持—黃金白銀票據&隱藏用戶&遠控&RustDesk&GotoHttp 1. 前置1.1. 初始問題1.1.1. 解決辦法 2. 隱藏用戶2.1. 工具原理2.2. 案例操作2.2.1. 單機添加用戶2.2.1.1. 工具添加用戶2.2.1.2. 工具查看隱藏用戶2.2.1.3. 本地查看隱藏用戶 2.2.2. 域內添加…

CentOS系統環境搭建(二)——Centos7設置時間為網絡時間

centos系統環境搭建專欄🔗點擊跳轉 Centos7設置時間為網絡時間 安裝ntpdate工具 yum -y install ntp ntpdate關閉ntpd service ntpd stop設置系統時間與網絡時間同步 ntpdate 0.asia.pool.ntp.org將系統時間寫入硬件時間 hwclock --systohc查看和設置時區 使…

NeuralNLP-NeuralClassifier的使用記錄(二),訓練預測自己的【中文文本多分類】

NeuralNLP-NeuralClassifier的使用記錄,訓練預測自己的【中文文本多分類】 數據準備: ? 與英文的訓練預測一致,都使用相同的數據格式,將數據通過代碼處理為JSON格式,以下是我使用的一種,不同的原數據情況…

java+springboot+mysql理發會員管理系統

項目介紹: 使用javaspringbootmysql開發的理發會員管理系統,系統包含超級管理員,系統管理員、客戶、發型師角色,功能如下: 超級管理員:管理員管理;會員管理;發型師管理&#xff1b…

如何保證數據庫的數據和Redis的數據一致性

實際項目中有可能會使用Redis緩存數據,那么在更新數據的時候如何保證數據庫中的數據和Redis緩存的數據一致,緩存同步策略的選擇是一個很重要的問題。網上有各種說法,大概總結有以下幾種,看看每種方案是否可行以及存在的問題和適用…

安裝軟件包

安裝軟件包 創建一個名為 /home/curtis/ansible/packages.yml 的 playbook : 將 php 和 mariadb 軟件包安裝到 dev、test 和 prod 主機組中的主機上 將 RPM Development Tools 軟件包組安裝到 dev 主機組中的主機上 將 dev 主機組中主機上的所有軟件包更新為最新版本 vim packa…

關于Firmae缺失binwalk模塊

問題 david707:~/FirmAE$ sudo ./run.sh -c weyow ./WAM_9900-20.06.03V.trx [*] ./WAM_9900-20.06.03V.trx emulation start!!! Traceback (most recent call last):File "./sources/extractor/extractor.py", line 19, in <module>import binwalk ModuleNot…

Android Studio調試的時候Logcat不顯示日志了

文章目錄 問題描述解決方案 問題描述 使用Log輸出日志的時候&#xff0c;Logcat窗口并沒有顯示日志。 去除所有的過濾條件之后&#xff0c;Logcat窗口仍然沒有一條消息。 解決方案 關閉Android Studio&#xff0c;重啟Android Studio即可。

Docker容器:docker基礎概述、安裝、網絡及資源控制

文章目錄 一.docker容器概述1.什么是容器2. docker與虛擬機的區別2.1 docker虛擬化產品有哪些及其對比2.2 Docker與虛擬機的區別 3.Docker容器的使用場景4.Docker容器的優點5.Docker 的底層運行原理6.namespace的六項隔離7.Docker核心概念 二.Docker安裝 及管理1.安裝 Docker1.…

【k8s】基于Prometheus監控Kubernetes集群安裝部署

目錄 基于Prometheus監控Kubernetes集群安裝部署 一、環境準備 二、部署kubernetes集群 三、部署Prometheus監控平臺 四、部署Grafana服務 五、grafana web操作 基于Prometheus監控Kubernetes集群安裝部署 一、環境準備 IP地址 主機名 組件 192.168.100.131 k8s-ma…

時序預測 | MATLAB實現WOA-CNN-GRU鯨魚算法優化卷積門控循環單元時間序列預測

時序預測 | MATLAB實現WOA-CNN-GRU鯨魚算法優化卷積門控循環單元時間序列預測 目錄 時序預測 | MATLAB實現WOA-CNN-GRU鯨魚算法優化卷積門控循環單元時間序列預測預測效果基本介紹模型描述程序設計參考資料 預測效果 基本介紹 時序預測 | MATLAB實現WOA-CNN-GRU鯨魚算法優化卷積…

PrefetchParameters

Windows XP重新設置預讀對象是允許的。具體方法是&#xff1a;打開注冊表編輯器&#xff0c;依次展開 HKEY_LOCAL_MACHINE&#xff3c;SYSTEM&#xff3c;CurrentControlSet&#xff3c;Control&#xff3c;Session Manager&#xff3c;Memory Management&#xff3c;PrefetchP…

基于LVQ神經網絡的人臉朝向識別

1案例背景 1.1人臉識別概述 人臉識別作為一個復雜的模式識別問題,近年來受到了廣泛的關注,識別領域的各種方法在這個問題上各顯所長,而且發展出了許多新方法,大大豐富和拓寬了模式識別的方向。人臉識別、檢測,跟蹤、特征定位等技術近年來一直是研究的熱點。人臉識別是人臉應用…

【制作npm包1】申請npm賬號、認識個人包和組織包

概述 在開發當中經常有一種現象&#xff0c;重復代碼寫了N多遍&#xff0c;再次寫同樣的邏輯就再次翻查以前的代碼邏輯。效率低下且容易出錯&#xff0c;封裝一個npm包的價值也不僅僅是給別人用&#xff0c;封裝一套屬于自己或者本部門的npm包也是相當有必要。 也許經常看到一…

RabbitMQ的5種消息隊列

RabbitMQ的5種消息隊列 1、七種模式介紹與應用場景 1.1 簡單模式(Hello World) 一個生產者對應一個消費者&#xff0c;RabbitMQ 相當于一個消息代理&#xff0c;負責將 A 的消息轉發給 B。 應用場景&#xff1a;將發送的電子郵件放到消息隊列&#xff0c;然后郵件服務在隊列…

【JS學習】Object.assign 用法介紹

Object.assign 是ES6中的一個方法。該方法能夠實現對象的淺復制以及對象合并。Object.assign 并不會修改目標對象本身&#xff0c;而是返回一個新的對象&#xff0c;其中包含了所有源對象的屬性。 例1 2個對象合并 const target { a: 1, b: 2 }; const source { b: 3, c: 4…