OpenHarmony平臺驅動使用(一)
ADC
概述
功能簡介
ADC(Analog to Digital Converter),即模擬-數字轉換器,可將模擬信號轉換成對應的數字信號,便于存儲與計算等操作。除電源線和地線之外,ADC只需要1根線與被測量的設備進行連接,其物理連線如圖1所示:
ADC接口定義了完成AD轉換的通用方法集合,包括:
-
ADC設備管理:打開或關閉ADC設備。
-
ADC讀取轉換結果:讀取AD轉換結果。
基本概念
-
分辨率
分辨率指的是ADC模塊能夠轉換的二進制位數,位數越多分辨率越高。
-
轉換誤差
轉換誤差通常是以輸出誤差的最大值形式給出。它表示A/D轉換器實際輸出的數字量和理論上的輸出數字量之間的差別。常用最低有效位的倍數表示。
-
轉換時間
轉換時間是指A/D轉換器從轉換控制信號到來開始,到輸出端得到穩定的數字信號所經過的時間。
運作機制
在HDF框架中,同類型設備對象較多時(可能同時存在十幾個同類型配置器),如果采用獨立服務模式則需要配置更多的設備節點,且相關服務會占據更多的內存資源。相反,采用統一服務模式可以使用一個設備服務作為管理器,統一處理所有同類型對象的外部訪問(這會在配置文件中有所體現),實現便捷管理和節約資源的目的。ADC模塊接口適配模式采用統一服務模式。
約束與限制
ADC模塊僅支持輪詢方式讀取數據。
使用指導
場景介紹
ADC設備通常用于將模擬電壓或電流轉換為數字量,例如與NTC電阻搭配進行溫度測量,或者將其他模擬傳感器的輸出量轉換為數字量的場景。
接口說明
ADC模塊提供的主要接口如表1所示,具體API詳見。
表 1?ADC驅動API接口功能介紹
接口名 | 接口描述 |
---|---|
DevHandle AdcOpen(uint32_t number) | 打開ADC設備 |
void AdcClose(DevHandle handle) | 關閉ADC設備 |
int32_t AdcRead(DevHandle handle, uint32_t channel, uint32_t *val) | 讀取AD轉換結果值 |
開發步驟
使用ADC設備的一般流程如圖2所示。
打開ADC設備
在進行AD轉換之前,首先要調用AdcOpen打開ADC設備。
DevHandle AdcOpen(int16_t number);
表 2?AdcOpen參數和返回值描述
參數 | 參數描述 |
---|---|
number | int16_t類型,ADC設備號 |
返回值 | 返回值描述 |
NULL | 打開ADC設備失敗 |
設備句柄 | 打開的ADC設備句柄 |
假設系統中存在2個ADC設備,編號從0到1,那么我們現在打開1號設備。
DevHandle adcHandle = NULL; // ADC設備句柄// 打開ADC設備
adcHandle = AdcOpen(1);
if (adcHandle == NULL) {HDF_LOGE("AdcOpen: fail\n");return NULL;
}
讀取AD轉換結果
int32_t AdcRead(DevHandle handle, uint32_t channel, uint32_t *val);
表 3?AdcRead參數和返回值描述
參數 | 參數描述 |
---|---|
handle | DevHandle類型,ADC設備句柄 |
channel | uint32_t類型,ADC設備通道號 |
val | uint32_t類型指針,AD轉換結果 |
返回值 | 返回值描述 |
HDF_SUCCESS | 讀取成功 |
負數 | 讀取失敗 |
讀取轉換結果示例(以通道1為例):
uint32_t value;
int32_t ret;ret = AdcRead(adcHandle, 1, &value);
if (ret != HDF_SUCCESS) {HDF_LOGE("ADC read fail!\n");return ret;
}
關閉ADC設備
ADC通信完成之后,需要關閉ADC設備。
void AdcClose(DevHandle handle);
表 4?AdcClose參數和返回值描述
參數 | 參數描述 |
---|---|
handle | DevHandle類型,ADC設備句柄 |
返回值 | 返回值描述 |
無 | 無 |
關閉ADC設備示例:
AdcClose(adcHandle); // 關閉ADC設備
使用實例
本例擬對Hi3516DV300開發板上ADC設備進行簡單的讀取操作,基本硬件信息如下:
-
SOC:hi3516dv300。
-
硬件連接:電位器掛接在0號ADC設備1通道下。
本例程對測試ADC進行連續讀取操作,測試ADC功能是否正常。
示例如下:
#include "adc_if.h" // ADC標準接口頭文件
#include "hdf_log.h" // 標準日志打印頭文件/// 設備號0,通道號1
#define ADC_DEVICE_NUM 0
#define ADC_CHANNEL_NUM 1
#define ADC_TEST_NUM 30// ADC例程總入口
static int32_t TestCaseAdc(void)
{int32_t i;int32_t ret;DevHandle adcHandle = NULL;uint32_t readBuf[ADC_TEST_NUM] = {0};// 打開ADC設備adcHandle = AdcOpen(ADC_DEVICE_NUM);if (adcHandle == NULL) {HDF_LOGE("%s: Open ADC%u fail!", __func__, ADC_DEVICE_NUM);return -1;}// 連續進行30次AD轉換并讀取轉換結果for (i = 0; i < ADC_TEST_NUM; i++) {ret = AdcRead(adcHandle, ADC_CHANNEL_NUM, &readBuf[i]);if (ret != HDF_SUCCESS) {HDF_LOGE("%s: ADC read fail!:%d", __func__, ret);AdcClose(adcHandle);return -1;}}HDF_LOGI("%s: ADC read successful!", __func__);// 訪問完畢關閉ADC設備AdcClose(adcHandle);return 0;
}