示例代码
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)
重要函数
- 初始化函数
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;
- 通道N:ADC_INPUT_SRC_BAT(通道为BAT,测量的信号来自内部的分压电路)
- 参考电压:ADC_REF_VALUE_0P8(0.85 V)
可检测的VBAT范围在2.0 V ~ 3.8 V,当选择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;
- 通道N:ADC_INPUT_SRC_TMP(通道为TMP,测量的信号来自内部的分压电路)
- 参考电压: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