ADC(Analog to Digital) 模拟转数字是经常使用的外设,本章节将通过两个示例讲解如何使用CSK6 SDK的ADC接口实现外部电压的检测。
CSK6 ADC驱动具有如下特性:
int adc_channel_setup(const struct device *dev, const struct adc_channel_cfg *channel_cfg);
采样通道配置,成功返回0,失败返回非0。
参数说明
字段 | 说明 |
---|---|
dev | 指向ADC Device的指针 |
channel_cfg | 采样通道配置 |
uint16_t adc_ref_internal(const struct device *dev);
获取内部参考电压,返回与ADC_REF_INTERNAL相对应的电压,以毫伏(mV)为单位。
返回大于0的正值则是参考电压值,返回0表示参考电压信息不可用。
参数说明
字段 | 说明 |
---|---|
dev | 指向ADC Device的指针 |
int adc_read(const struct device *dev, const struct adc_sequence *sequence);
获取采样值,如果从用户模式调用,回调的sequence.options都必须是NULL。
adc_read的函数返回值见下述说明。
参数说明
字段 | 说明 |
---|---|
dev | 指向ADC Device的指针 |
sequence | 指定请求的采样序列的结构 |
返回值说明
返回值 | 说明 |
---|---|
0 | 成功 |
-EINVAL | 传入的参数有误 |
-ENOMEM | 用于采样的buf定义太小,无法保存所有请求的采样结果 |
-ENOTSUP | 请求的操作模式不支持 |
-EBUSY | 在前一个采样仍在进行时触发了另一个采样,则返回-EBUSY |
int adc_raw_to_millivolts(int32_t ref_mv, enum adc_gain gain, uint8_t resolution, int32_t *valp);
将原始ADC采样值转换为以毫伏(mV)为单位的电压,返回0表示成功,非0表示失败。
参数说明
字段 | 说明 |
---|---|
ref_mv | 测量的参考电压,单位为毫伏,该值可能是从adc_ref_internal()函数调用获取,或者从外部获取的参考电压值。 |
gain | 用于采样输入的ADC增益配置 |
resolution | 样本绝对值中的位数,对于差分采样,该值必须小于adc_sequence结构体里面的resolution值 |
valp | 输入时指向原始采样值的指针,成功转换后指向相应的毫伏值。如果转换失败,则存储值保持不变。 |
更多ADC driver API接口可查看Zephyr官网ADC driver API。
SDK 中提供了 ADC 的示例。
{SDK}\.sdk\csk\samples\driver\adc
演示使用adc读取模拟信号。通过采集gpio-b8,gpio-b9两个通道的模拟信号,然后将其转换为数字信号并通过串口打印出来。
适用开发板:大模型开发套件
编译版型:csk6_duomotai_devkit
使用引脚:
在 SDK 根目录(duomotai_ap
)下可通过执行以下指令进行对该示例工程的编译:
lisa zep build -b csk6_duomotai_devkit .sdk\csk\samples\driver\adc -p
编译完成后,编译产物二进制文件位于 build\zephyr\zephyr.bin
使用 Type-C 数据线连接开发套件的 DAP_USB
接口,选中以下其中一种方式对固件进行烧录:
cskburn desktop
是一款聆思推出的桌面烧录工具,在下载并安装 cskburn desktop 烧录工具后,双击图标运行软件:
1.点击串口下拉框,选择连接开发套件后识别到的串口编号;
2.将编译输出的.bin
文件拖拽进烧录区域;
3.点击开始烧录,等待烧录完成。
若您已按照 《环境搭建》 教程完成开发环境的安装,可在编译完成后执行 lisa zep exec cskburn
指令完成烧录。
lisa zep exec cskburn -s \\.\COMxx -C 6 -b 1500000 0x000000 --verify-all .\build\zephyr\zephyr.bin
请将命令行中的的 COMx 替换为开发套件在 PC 上对应的串口号(可通过设备管理器查看)。例如:
COM3
。
lisa zep exec cskburn -s PORT -C 6 0x000000 --verify-all ./build/zephyr/zephyr.bin -b 1500000
请将命令行中的 PORT 替换为开发套件连接在 PC 上对应的串口号。例如:
/dev/ttyUSB0
。
以下代码与注释已省略一部分非关键接口代码,主要呈现示例的主业务流程与主要接口的使用。
…
// 获取 ADC 设备的句柄
const struct device *dev_adc = DEVICE_DT_GET(ADC_NODE);
// 遍历配置每个 ADC 通道的配置信息
for (uint8_t i = 0; i < ADC_NUM_CHANNELS; i++) {
channel_cfg.channel_id = channel_ids[i];
// 设置ADC通道的配置信息
adc_channel_setup(dev_adc, &channel_cfg);
sequence.channels |= BIT(channel_ids[i]);
}
// 获取内部参考电压
int32_t adc_vref = adc_ref_internal(dev_adc);
while (1) {
// 读取每个ADC通道的模拟信号
err = adc_read(dev_adc, &sequence);
…
for (uint8_t i = 0; i < ADC_NUM_CHANNELS; i++) {
int32_t raw_value = sample_buffer[i];
if (adc_vref > 0) {
int32_t mv_value = raw_value - 2048;
// 将读取的模拟电压信号转换为毫伏值
adc_raw_to_millivolts(adc_vref, ADC_GAIN_1, ADC_RESOLUTION,
&mv_value);
// 通过串口打印每个ADC通道的模拟信号
printk(" adc(%d)= %d mV ", raw_value, mv_value);
}
}
printk("\n");
k_sleep(K_MSEC(500));
}
}