APP ADC驱动
结构体
app_adc_params_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| app_adc_pin_cfg_t pin_cfg |
配置ADC模块输入通道 |
参考app_adc_pin_cfg_t结构体 |
| app_adc_dma_cfg_t dma_cfg |
ADC DMA参数配置 |
参考app_adc_dma_cfg_t结构体 |
| adc_init_t init |
ADC需要的初始化配置 |
参考adc_init_t结构体 |
| adc_env_t adc_env | 仅用于记录初始化设备的句柄、相关参数等,不需要配置 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_adc.h。
app_adc_pin_cfg_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| app_adc_pin_t channel_p |
通道P引脚 |
参考app_adc_pin_t结构体 |
| app_adc_pin_t channel_n |
通道N引脚 |
参考app_adc_pin_t结构体 |
| app_adc_pin_t extern_ref |
外部参考源引脚 |
参考app_adc_pin_t结构体 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_adc.h。
app_adc_dma_cfg_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| dma_regs_t * dma_instance |
ADC模块ID |
参考app_adc_params_t中DMA支持的外设 |
| dma_channel_t dma_channel |
ADC配置DMA通道 |
参考app_adc_params_t中通道描述 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_adc.h。
app_adc_pin_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| app_io_type_t type |
IO类型 |
APP_IO_TYPE_MSIO |
| app_io_mux_t mux |
设置IO映射功能 |
APP_IO_MUX |
| uint32_t pin |
IO引脚 |
GR551x:
GR5526/GR5x25/GR533x/GR5405:
|
详细信息请参考文件:SDK_Folder\drivers\inc\app_adc.h。
adc_init_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| uint32_t channel_p |
配置通道P映射 |
GR551x取值选项:
GR5526/GR5x25/GR533x/GR5405取值选项:
说明: 与通道P配置结构体app_adc_pin_t的pin引脚对应,例如:通道P配置为MSIO0,则该参数为ADC_INPUT_SRC_IO0。 |
| uint32_t channel_n |
配置通道N映射 |
GR551x取值选项:
GR5526/GR5x25/GR533x/GR5405取值选项:
说明: ADC_INPUT_SRC_BAT表示测量芯片的供电电压,ADC_INPUT_SRC_TMP表示测量芯片内部温度,除此之外该参数与通道N配置结构体app_adc_pin_t的pin引脚对应,例如:通道N配置为MSIO0,则该参数为ADC_INPUT_SRC_IO0。 |
| uint32_t input_mode |
输入模式设置 |
该参数的取值可以是下列值中的任意一个:
|
| uint32_t ref_source |
参考源设置 |
该参数的取值可以是下列值中的任意一个:
|
| uint32_t ref_value |
内部参考源参考电压设置(外部参考,该参数无意义) |
该参数的取值可以是下列值中的任意一个:
|
| uint32_t clock |
ADC时钟设置 |
该参数的取值可以是下列值中的任意一个: GR5526/GR5x25/GR533x/GR5405:
GR551x:
|
- GR551x/GR5526/GR5x25:SDK_Folder\drivers\inc\hal\gr55xx_ll_adc.h
- GR533x:SDK_Folder\drivers\inc\hal\gr533x_ll_adc.h
- GR5405:SDK_Folder\hal_drv\include\ll_adc.h
枚举
app_adc_evt_t
枚举定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| app_adc_evt_type_t type |
ADC事件结构体 |
APP_ADC_EVT_CONV_CPLT转换完成 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_adc.h。
app_adc_sample_node_t
该枚举仅适用于GR551x。
枚举定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| uint32_t channel |
ADC采样通道 |
该参数的取值可以是下列值中的任意一个:
|
| uint16_t *p_buf |
采样得到的原始数据,由用户分配空间。 |
无 |
| uint32_t len |
采样的原始数据个数,由用户指定个数。 |
无 |
| struct link_node *next |
用于多通道采样的输入参数,采完一个通道后,自动采样下一个节点对应的通道。 |
无 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_adc.h。
app_adc_evt_type_t
枚举定义如下:
| 成员 | 描述 |
|---|---|
| APP_ADC_EVT_CONV_CPLT |
ADC转换完成 |
app_adc_dma_state_t
枚举定义如下:
| 成员 | 描述 |
|---|---|
| APP_ADC_DMA_INVALID | ADC DMA模式不可用 |
| APP_ADC_DMA_ACTIVITY | ADC DMA模式激活 |
app_adc_state_t
枚举定义如下:
| 成员 | 描述 |
|---|---|
| APP_ADC_INVALID = 0 |
ADC不可用 |
| APP_ADC_ACTIVITY |
ADC激活 |
| APP_ADC_SLEEP |
ADC睡眠 |
接口函数
| API | 芯片 | ||||
|---|---|---|---|---|---|
| GR551x | GR5526 | GR5x25 | GR533x | GR5405 | |
| app_adc_init |
Y |
Y |
Y |
Y |
Y |
| app_adc_deinit |
Y |
Y |
Y |
Y |
Y |
| app_adc_conversion_sync |
Y |
Y |
Y |
Y |
Y |
| app_adc_conversion_async |
Y |
Y |
Y |
Y |
Y |
| app_adc_voltage_intern |
Y |
Y |
Y |
Y |
Y |
| app_adc_voltage_extern |
Y |
Y |
Y |
Y |
Y |
| app_adc_temperature_conv |
N |
Y |
Y |
Y |
Y |
| app_adc_vbat_conv |
N |
Y |
Y |
Y |
Y |
| app_adc_get_handle |
Y |
Y |
Y |
Y |
Y |
| app_adc_multi_channel_conversion_async |
Y |
N |
N | N | N |
app_adc_init
| 函数原型 | uint16_t app_adc_init(app_adc_params_t *p_params, app_adc_evt_handler_t evt_handler) |
|---|---|
| 功能说明 | 初始化ADC |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 | 回调函数形式参照typedef void (*app_adc_evt_handler_t)(app_adc_evt_t *p_evt); HAL层已经实现中断标志位的清理,用户不用关心中断标志的清理。 |
app_adc_deinit
| 函数原型 | uint16_t app_adc_deinit(void) |
|---|---|
| 功能说明 | 反初始化ADC |
| 输入参数 | |
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_adc_conversion_sync
| 函数原型 | uint16_t app_adc_conversion_sync(uint16_t *p_data, uint32_t length, uint32_t timeout) |
|---|---|
| 功能说明 | 开启ADC同步转换 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_adc_conversion_async
| 函数原型 | uint16_t app_adc_conversion_async(uint16_t *p_data, uint32_t length) |
|---|---|
| 功能说明 | 开启ADC异步转换 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_adc_voltage_intern
| 函数原型 | uint16_t app_adc_voltage_intern(uint16_t *inbuf, double *outbuf, uint32_t buflen) |
|---|---|
| 功能说明 | 将使用内部参考源的ADC数值转换为电压值 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 | 参考源采用内部参考时调用该函数 |
app_adc_voltage_extern
| 函数原型 | uint16_t app_adc_voltage_extern(double ref, uint16_t *inbuf, double *outbuf, uint32_t buflen) |
|---|---|
| 功能说明 | 将使用外部参考源的ADC数值转化为电压值 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 | 参考源采用外部参考时使用 |
app_adc_temperature_conv
| 函数原型 | uint16_t app_adc_temperature_conv(uint16_t *inbuf, double *outbuf, uint32_t buflen) |
|---|---|
| 功能说明 | ADC数值转换为内部芯片温度 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_adc_vbat_conv
| 函数原型 | uint16_t app_adc_vbat_conv(uint16_t *inbuf, double *outbuf, double *outbuf, uint32_t buflen) |
|---|---|
| 功能说明 | ADC数值转换为电池电压 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_adc_get_handle
| 函数原型 | adc_handle_t *app_adc_get_handle(void) |
|---|---|
| 功能说明 | 获取ADC句柄 |
| 输入参数 | |
| 返回值 |
adc句柄,详见
|
| 备注 |
app_adc_multi_channel_conversion_async
| 函数原型 | uint16_t app_adc_multi_channel_conversion_async(app_adc_samle_node_t *p_begin_node, uint32_t total_nodes) |
|---|---|
| 功能说明 | 开启ADC多通道异步转换 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
DMA接口函数
| API | 芯片 | ||||
|---|---|---|---|---|---|
| GR551x | GR5526 | GR5x25 | GR533x | GR5405 | |
| app_adc_dma_init |
Y |
Y |
Y |
Y |
Y |
| app_adc_dma_deinit |
Y |
Y |
Y |
Y |
Y |
| app_adc_dma_conversion_async |
Y |
Y |
Y |
Y |
Y |
app_adc_dma_init
| 函数原型 | uint16_t app_adc_dma_init(app_adc_params_t *p_params) |
|---|---|
| 功能说明 | 初始化DMA方式传输的ADC模块 |
| 输入参数 | p_params:初始化参数的结构体指针 |
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_adc_dma_deinit
| 函数原型 | uint16_t app_adc_dma_deinit(void) |
|---|---|
| 功能说明 | 反初始化DMA方式传输的ADC模块 |
| 输入参数 | |
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_adc_dma_conversion_async
| 函数原型 | uint16_t app_adc_dma_conversion_async(uint16_t *p_data, uint32_t length) |
|---|---|
| 功能说明 | 开启ADC异步DMA转换 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
示例工程
ADC实现DMA方式对输入电压测量
ADC有两种采样模式:单端采样和差分采样。
- 单端采样时,用户需将有效信号连接至MSIO其中的一个引脚,单端输入信号幅值范围在0 ~ 2*Vref,且不大于VBAT。
- 差分采样时,用户需输入差分信号至MSIO中的两个引脚,差分输入信号幅值范围在-2*Vref ~ +2*Vref,共模值大于0.8 V。
示例工程实现ADC单端DMA采样,工程路径:SDK_Folder\projects\peripheral\adc\adc。
流程图
示例工程初始化ADC模块,采样单端采样,仅通道N为有效输入信号,配置通道N为MSIO1;用户将有效信号接入MSIO1引脚,开启ADC采样后将采集MSIO1有效信号,最后将有效信号的值转换为内部电压值并打印。
初始化参数
app_adc_params_t adc_params = {
.pin_cfg = {
.channel_p = {
.type = APP_IO_TYPE_MSIO,
.mux = APP_IO_MUX_7,
.pin = APP_ADC_P_INPUT_PIN,
},
.channel_n = {
.type = APP_IO_TYPE_MSIO,
.mux = APP_IO_MUX_7,
.pin = APP_ADC_N_INPUT_PIN,
},
},
.dma_cfg = {
.dma_instance = DMA0,
.dma_channel = DMA_Channel0,
},
.init = {
.channel_p = ADC_INPUT_SRC_IO0,
.channel_n = ADC_INPUT_SRC_IO1,
.input_mode = ADC_INPUT_SINGLE,
.ref_source = ADC_REF_SRC_BUF_INT,
.ref_value = ADC_REF_VALUE_1P6,
.clock = ADC_CLK_1M,
},
};
- pin_cfg:引脚配置
- pin_cfg.channel_p:ADC通道p引脚配置
- pin_cfg.channel_n:ADC通道n引脚配置
- dma_cfg:DMA参数配置
- dma_cfg.dma_instance:DMA实例使用DMA0
- dma_cfg.dma_channel:DMA实例使用DMA0通道0
- init.channel_p:配置通道P映射,选择ADC_INPUT_SRC_IO0(和通道P引脚配置对应,MSIO0对应ADC_INPUT_SRC_IO0)
- init.channel_n:配置通道N映射,选择ADC_INPUT_SRC_IO1(和通道N引脚配置对应,MSIO1对应ADC_INPUT_SRC_IO1)
- init:ADC采集参数配置
- init.input_mode:采样模式选择ADC_INPUT_SINGLE(单端采样)
- init.ref_source:参考源选择ADC_REF_SRC_BUF_INT(选择内部参考源)
- init.ref_value:内部参考源参考电压:ADC_REF_VALUE_1P6(选择1.6 V,输入量程为0 V~3.2 V)
- init.clock:ADC时钟设置:ADC_CLK_1M(1 MHz)
重要函数
- 初始化ADC
app_adc_init(&adc_params, app_adc_evt_handler) - 配置DMA方式
app_adc_dma_init(&adc_params) - 开启ADC DMA采集
app_adc_dma_conversion_async(conversion, TEST_CONV_LENGTH)- conversion:采集的ADC数值集合
- TEST_CONV_LENGTH:采集ADC数据的个数
- 转换成内部电压
app_adc_voltage_intern(conversion, voltage, TEST_CONV_LENGTH)- voltage:转换后电压值集合
- TEST_CONV_LENGTH:数据个数
测试验证
外部输入电压到MSIO1,连接开发板到PC端,打开串口助手,连接串口,查看串口日志,观察串口打印,ADC 测量的电压等于输入电压,表明ADC采集电压准确。
电源输出0.5 V电压,将电源输出接到MSIO1,连接开发板到PC端,串口打印如下,测量电压为0.5 V左右。
Start single sampling.
DMA conversion is done.
Conversion value:
0.503V 0.506V 0.498V 0.490V 0.469V 0.498V 0.503V 0.501V 0.506V 0.502V 0.505V 0.495V 0.501V 0.497V 0.500V 0.495V 0.496V 0.492V 0.484V 0.504V 0.490V 0.501V 0.489V 0.493V 0.495V 0.499V 0.509V 0.498V 0.502V 0.501V 0.497V 0.494V 0.500V 0.510V 0.500V 0.485V 0.506V 0.499V 0.493V 0.502V 0.498V 0.499V 0.497V 0.503V 0.496V 0.502V 0.503V 0.498V 0.496V 0.503V 0.501V 0.500V 0.495V 0.504V 0.498V 0.503V 0.497V 0.494V 0.506V 0.500V 0.493V 0.501V 0.490V 0.500V 0.498V 0.493V 0.501V 0.486V 0.495V 0.495V 0.493V 0.506V 0.501V 0.491V 0.494V 0.494V 0.496V 0.498V 0.498V 0.492V 0.499V 0.492V 0.498V 0.495V 0.495V 0.497V 0.496V 0.508V 0.506V 0.522V 0.506V 0.500V 0.501V 0.501V 0.495V 0.500V 0.500V 0.502V 0.493V 0.499V 0.497V 0.492V 0.497V 0.503V 0.498V 0.492V 0.492V 0.495V 0.492V 0.492V 0.489V 0.495V 0.498V 0.492V 0.492V 0.493V 0.489V 0.491V 0.496V 0.489V 0.500V 0.501V 0.501V 0.506V 0.505V 0.500V 0.494V 0.505V
ADC电池电压的测量
工程路径:SDK_Folder\projects\peripheral\adc\adc。
流程图
ADC能实现电池电压的测量,通道应该选择ADC_INPUT_SRC_BAT,开启采样求取采样平均值,将平均采样值转换成电池电压。
初始化参数
实现对电池电压的采集,主要修改如下参数,其它参数参考ADC实现DMA方式对输入电压测量。
adc_params_t.init.channel_n = ADC_INPUT_SRC_BAT;
adc_params_t.init.ref_value = ADC_REF_VALUE_0P8;
- init.channel_n:ADC_INPUT_SRC_BAT(通道为BAT,测量的信号来自内部的分压电路)
- init.ref_value:ADC_REF_VALUE_0P8(0.85 V)
可检测的VBAT范围请参考对应芯片系列Datasheet,当选择ADC的通道为BAT时,测量的信号来自内部的分压电路(确保输入在0 ~ 1.6 V),所以参考电压应选择0.85 V,以提升测量精度。
重要函数
采集值转换成电池电压:
app_adc_vbat_conv((uint16_t *)&aver, &vbat, 1)
测试验证
连接开发板到PC端,打开串口助手,连接串口,查看串口日志,串口将打印电池电压值。
Start Vbattery sampling.
DMA conversion is done.
Average Vbattery cocdes = 4000
Vbattery= 3.307 V
ADC实现DMA方式对芯片内部温度测量
工程路径:SDK_Folder\projects\peripheral\adc\adc。
流程图
ADC能实现芯片内部温度的测量,通道应选择ADC_INPUT_SRC_TMP,开启采样求取采样平均值,将平均采样值转换成芯片内部温度。
初始化参数
实现对芯片内部温度的采集,主要修改如下参数,其他参数参考ADC实现DMA方式对输入电压测量。
adc_params_t.init.channel_n = ADC_INPUT_SRC_TMP;
adc_params_t.init.ref_value = ADC_REF_VALUE_0P8;
- init.channel_n:ADC_INPUT_SRC_TMP(通道为TMP,测量的信号来自内部的分压电路)
- init.ref_value:ADC_REF_VALUE_0P8(0.85 V)
重要函数
采样值转换成芯片内部温度:
app_adc_temperature_conv((uint16_t *)&aver, &temp, 1)
测试验证
连接开发板到PC端,打开串口助手,连接串口,查看串口日志,串口将打印芯片内部温度。
Start temperature sampling.
DMA conversion is done.
Average Temperature cocdes = 1594
Temperature value= 26.6 C