1.0 ADC簡(jiǎn)介
ADC(Analog-to-Digital Converter) 指模數(shù)轉(zhuǎn)換器。是指將連續(xù)變化的模擬信號(hào)轉(zhuǎn)換為離散的數(shù)字信號(hào)的器件。真實(shí)世界的模擬信號(hào),例如溫度、壓力、聲音或者圖像等,需要轉(zhuǎn)換成更容易儲(chǔ)存、處理和發(fā)射的數(shù)字形式。模數(shù)轉(zhuǎn)換器可以實(shí)現(xiàn)這個(gè)功能,在各種不同的產(chǎn)品中都可以找到它的身影。與之相對(duì)應(yīng)的 DAC(Digital-to-Analog Converter),它是 ADC 模數(shù)轉(zhuǎn)換的逆向過(guò)程。ADC 最早用于對(duì)無(wú)線信號(hào)向數(shù)字信號(hào)轉(zhuǎn)換。如電視信號(hào),長(zhǎng)短播電臺(tái)發(fā)射接收等。
1.1 I/O 設(shè)備模型框架
如下圖所示模數(shù)轉(zhuǎn)換一般要經(jīng)過(guò)采樣、保持和量化、編碼這幾個(gè)步驟。在實(shí)際電路中,有些過(guò)程是合并進(jìn)行的,如采樣和保持,量化和編碼在轉(zhuǎn)換過(guò)程中是同時(shí)實(shí)現(xiàn)的。
1.2 訪問(wèn) ADC 設(shè)備
應(yīng)用程序通過(guò) RT-Thread 提供的 ADC 設(shè)備管理接口來(lái)訪問(wèn) ADC 硬件,相關(guān)接口如下所示:
函數(shù) | 描述 |
---|---|
rt_device_find() | 根據(jù) ADC 設(shè)備名稱查找設(shè)備獲取設(shè)備句柄 |
rt_adc_enable() | 使能 ADC 設(shè)備 |
rt_adc_read() | 讀取 ADC 設(shè)備數(shù)據(jù) |
rt_adc_disable() | 關(guān)閉 ADC 設(shè)備 |
2. RT-theard配置
2.1 硬件需求
實(shí)現(xiàn)功能:
板載Arduino拓展口六處模擬信號(hào)讀取。
1、RA6M4開發(fā)板
2、USB下載線,ch340串口和附帶2根母母線,rx---p613;tx---p614
實(shí)驗(yàn)中J13六處模擬信號(hào)需要焊接插針,方便調(diào)試
2.2 軟件配置
Renesas RA6M4開發(fā)板環(huán)境配置參照:【基于 RT-Thread Studio的CPK-RA6M4 開發(fā)板環(huán)境搭建】
1、新建項(xiàng)目RA6M4-ADC工程
2、在RT-theard Setting 硬件下開啟ADC,使能ADC0
3、打開RA Smart Congigurator,在Stacks中New Stack添加r_adc
4、在Property的Module的Channel中勾選Channel0~5
5、確認(rèn)端口一一對(duì)應(yīng)P000~P005
6、然后Generate Project Content 同步更新剛剛配置的文件
圖形化配置已經(jīng)完成,接下來(lái)配置相關(guān)代碼
3. 代碼分析
在src文件下新建test_adc.c和test_adc.h文件,其他不變。
test_adc.c
/*
* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2022-07-11 Asus the first version
*/
#include
#include
#define ADC_NAME "adc0" /* ADC 設(shè) 備 名 稱 */
#define ADC_CHANNEL 6 /* ADC 通 道個(gè)數(shù) */
#define REFER_VOLTAGE 330 /* 參 考 電 壓 3.3V,數(shù) 據(jù) 精 度 乘 以100保 留2位 小 數(shù)
*/
#define CONVERT_BITS (1 << 12) /* 轉(zhuǎn) 換 位 數(shù) 為12位 */
static int adc_sample(int argc, char *argv[])
{
rt_adc_device_t adc_dev;
rt_uint32_t value, vol;
rt_err_t ret = RT_EOK;
/* 查 找 設(shè) 備 */
adc_dev = (rt_adc_device_t)rt_device_find(ADC_NAME);
if (adc_dev == RT_NULL)
{
rt_kprintf("adc sample run failed! can't find %s device!
", ADC_NAME);
return RT_ERROR;
}
for (int var = 0; var < ADC_CHANNEL; ++var) {
/* 使 能 設(shè) 備 */
ret = rt_adc_enable(adc_dev, var);
/* 讀 取 采 樣 值 */
value = rt_adc_read(adc_dev, var);
rt_kprintf("the value is :%d
", value);
/* 轉(zhuǎn) 換 為 對(duì) 應(yīng) 電 壓 值 */
vol = value * REFER_VOLTAGE / CONVERT_BITS;
rt_kprintf("the voltage is :%d.%02d
", vol / 100, vol % 100);
/* 關(guān) 閉 通 道 */
ret = rt_adc_disable(adc_dev, var);
}
return ret;
}
/* 導(dǎo) 出 到 msh 命 令 列 表 中 */
MSH_CMD_EXPORT(adc_sample, adc voltage convert sample);
test_adc.h
/*
* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2022-07-11 Asus the first version
*/
#ifndef TEST_ADC_H_
#define TEST_ADC_H_
static int adc_sample(int argc, char *argv[]);
#endif /* TEST_ADC_H_ */
保存完是灰色,沒(méi)有保存是藍(lán)色。
adc_sample
導(dǎo) 出 到 msh 命 令 列 表 中,采樣1次
4. 下載驗(yàn)證
1、編譯重構(gòu)
編譯成功
2、下載程序
下載成功
3、CMD串口調(diào)試
然后板載復(fù)位,輸入:adc_sample
效果如下
這樣我們就可以天馬行空啦!
審核編輯:湯梓紅
-
adc
+關(guān)注
關(guān)注
98文章
6498瀏覽量
544640 -
Renesas
+關(guān)注
關(guān)注
0文章
1757瀏覽量
22756 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
5050瀏覽量
97468 -
Arduino
+關(guān)注
關(guān)注
188文章
6469瀏覽量
187063 -
RA6M4
+關(guān)注
關(guān)注
0文章
51瀏覽量
450
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論