ADC
简介
ADC(Analog-to-Digital Converter,模数转换器)是一种将模拟信号转换为数字信号的硬件模块。在嵌入式系统和微控制器中,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请参考: