这是最新(主)开发分支的文档。如果您正在查找以前版本的文档,使用左侧的下拉菜单选择所需的版本。

ADC

简介

ADC(Analog-to-Digital Converter,模数转换器)是一种将模拟信号转换为数字信号的硬件模块。在嵌入式系统和微控制器中,ADC用于将传感器或其他模拟输入信号转换为数字数据,以便进行进一步的处理和分析。

功能列表

  1. 初始化——初始化ADC驱动。

  2. 配置ADC——配置ADC通道和参数。

  3. 注册中断回调——注册定时器中断回调函数。

  4. 获取单次ADC结果——获取单次ADC转换结果。

  5. 获取轮询ADC结果——获取轮询模式下的ADC转换结果。

  6. 启动ADC中断——启动ADC中断模式。

  7. 停止ADC中断——停止ADC中断模式。

  8. 获取芯片内部温度——读取芯片内部温度。

  9. 获取芯片电压——读取芯片电压。

  10. 计算电压值——根据ADC结果计算实际电压值。

功能概述

资源管理: W800 有 4 个 ADC 独立的输入通道,以及 2 个差分通道,用户可以根据具体情况来管理不同通道。

灵活的参数配置:ADC支持配置通道数量、采样增益等参数,以适应不同的应用需求。

高精度:ADC具有高精度的信号转换能力,适用于各种精确测量应用。

中断和回调:ADC支持中断和回调函数,可以在转换完成时触发回调函数,方便实时处理数据。

温度传感:内置温度传感器,可以通过ADC读取芯片内部的温度值。

电压检测:可以通过ADC检测芯片的供电电压,方便进行电源管理。

主要功能

初始化ADC

使用ADC前需要调用 wm_drv_adc_init() 函数为ADC分配资源,利用 wm_device_t 结构体接收ADC设备标识符。示例:

wm_device_t *adc_dev;
adc_dev = wm_drv_adc_init("adc");

第一个参数指定设备名称,名称在设备表中定义。

警告

ADC初始化后,如果没有调用 wm_drv_adc_deinit ,再次调用 wm_drv_adc_init 会返回 NULL

配置ADC

调用函数 wm_drv_adc_cfg() 配置ADC设备的参数。示例如下:

wm_device_t *adc_dev;
adc_dev = wm_drv_adc_init("adc");

wm_drv_adc_cfg_t adc_cfg;
adc_cfg.adc_channel_count = 1;
/* set cfg */
...

wm_drv_adc_cfg(adc_dev, &adc_cfg);

第一个参数是一个指向ADC设备的指针,类型为 wm_device_t*

第二个参数是一个指向包含ADC配置参数的结构体的指针,类型为 wm_drv_adc_cfg_t

注册回调

调用函数 wm_drv_adc_register_callback() 注册ADC中断回调函数。adc_callback 是一个回调函数,当ADC中断触发时会被调用。arg 是一个传递给回调函数的参数,在这个例子中没有具体使用。示例如下:

wm_device_t *adc_dev;
adc_dev = wm_drv_adc_init("adc");

void adc_callback(void *arg) {
    printf("ADC interrupt triggered!\n");
}

wm_drv_adc_register_callback(adc_dev, WM_ADC_INTR_TYPE_ADC, adc_callback, NULL);

第一个参数是一个指向ADC设备的指针,类型为 wm_device_t*

第二个参数是中断类型,用于表示不同类型的ADC中断,示例中 WM_ADC_INTR_TYPE_ADC 表示ADC转换结束时触发中断,还可设置为 WM_ADC_INTR_TYPE_DMA ,表示DMA(直接存储器访问)中断, 需要注意,w800暂不支持adc dma的传输。 WM_ADC_INTR_TYPE_COMP ,表示比较器中断。 WM_ADC_INTR_TYPE_MAX ,枚举类型的最大值,用于边界检查。类型为 wm_adc_intr_type_t

第三个参数是回调函数,类型为 wm_drv_adc_callback_t

第四个参数是传递给回调函数的私有数据,类型为 void *

生成单次转换结果

调用函数 wm_drv_adc_oneshot() 进行单次ADC转换,并返回结果。示例如下:

wm_device_t *adc_dev;
adc_dev = wm_drv_adc_init("adc");

int32_t result;
wm_drv_adc_oneshot(adc_dev, 0, &result);

第一个参数是一个指向ADC设备的指针,类型为 wm_device_t*

第二个参数是ADC通道号,类型为 wm_adc_channel_t

第三个参数是指向 int32_t 类型变量 result 的指针,用于存储ADC转换的结果。

生成连续转换结果

调用函数 wm_drv_adc_polling() 进行ADC连续转换,并将结果存储到缓冲区。示例如下:

wm_device_t *adc_dev;
adc_dev = wm_drv_adc_init("adc");

int buf[10];
wm_drv_adc_polling(adc_dev, 0, buf, 10, 1000);

第一个参数是一个指向ADC设备的指针,类型为 wm_device_t*

第二个参数是ADC通道号,类型为 wm_adc_channel_t

第三个参数是指向存储转换结果的缓冲区,用于存储轮询得到的ADC数据,类型为 int*

第四个参数是缓冲区大小,类型为 uint16_t

第五个参数是超时时间,单位为毫秒,指定在超过此时间后停止轮询,类型为 uint32_t

启动ADC中断

调用函数 wm_drv_adc_start_it() 启动ADC中断,开始中断模式下的转换。示例如下:

wm_device_t *adc_dev;
adc_dev = wm_drv_adc_init("adc");

wm_drv_adc_start_it(adc_dev, 0);

第一个参数是一个指向ADC设备的指针,类型为 wm_device_t*

第二个参数是ADC通道号,类型为 wm_adc_channel_t

警告

中断模式会快速的输出adc采集数据,请在对应的中断回调中不要做耗时操作,并且调用 wm_drv_adc_cal_voltage() 来计算采集电压。

停止ADC中断

调用函数 wm_drv_adc_stop_it() 停止ADC中断,结束中断模式下的转换。示例如下:

wm_device_t *adc_dev;
adc_dev = wm_drv_adc_init("adc");

wm_drv_adc_stop_it(adc_dev, 0);

第一个参数是一个指向ADC设备的指针,类型为 wm_device_t*

第二个参数是ADC通道号,类型为 wm_adc_channel_t

读取温度

调用函数 wm_drv_thermal_sensor_read_temperature() 读取芯片内的温度值。示例如下:

wm_device_t *adc_dev;
adc_dev = wm_drv_adc_init("adc");

int temperature_val;
wm_drv_thermal_sensor_read_temperature(adc_dev, &temperature_val);

第一个参数是一个指向ADC设备的指针,类型为 wm_device_t*

第二个参数是一个指向存储温度值的指针,用于存储读取的温度值,类型为 int*

读取电压

调用函数 wm_drv_adc_chip_voltage_read_vdd() 读取芯片的供电电压。示例如下:

wm_device_t *adc_dev;
adc_dev = wm_drv_adc_init("adc");

uint32_t voltage;
wm_drv_adc_chip_voltage_read_vdd(adc_dev, &voltage);

第一个参数是一个指向ADC设备的指针,类型为 wm_device_t*

第二个参数是一个指向存储电压值的指针,用于存储读取的芯片电压值,类型为 uint32_t*

校准电压

调用函数 wm_drv_adc_cal_voltage() 计算芯片电压。示例如下:

wm_device_t *adc_dev;
adc_dev = wm_drv_adc_init("adc");

wm_drv_adc_cal_voltage(adc_dev, 3300);

第一个参数是一个指向ADC设备的指针,类型为 wm_device_t*

第二个参数是一个表示从adc中断中获取的原始值,类型为 int。这里设置了原始值为3300。

应用实例

使用ADC基本示例请参考: examples/peripheral/adc

API参考

查找ADC相关API请参考:

ADC API 参考