ADC
ADC示例实现了ADC的两种采样模式:单端采样和差分采样。
- 单端采样时,用户需将有效信号连接至MSIO1引脚,单端输入信号幅值范围在0 ~ 2*Vref,且不大于VBAT;
- 差分采样时,用户需输入差分信号至MSIO0与MSIO1,差分输入信号幅值范围在-2*Vref ~ +2*Vref,共模值大于0.8 V。
ADC示例源代码和工程文件位于SDK_Folder\projects\peripheral\adc\adc,其中工程文件在文件夹Keil_5下。
代码理解
示例工程流程图如图 2所示:
- 配置ADC模块。
g_adc_handle.init.channel_p = ADC_INPUT_SRC_IO0; g_adc_handle.init.channel_n = ADC_INPUT_SRC_IO1; g_adc_handle.init.input_mode = ADC_INPUT_SINGLE; g_adc_handle.init.ref_source = ADC_REF_SRC_BUF_INT; g_adc_handle.init.ref_value = ADC_REF_VALUE_1P6; g_adc_handle.init.clock = ADC_CLK_1P6M;- init.channel_p、init.channel_n:通道P(channel_p)和通道N(channel_n)设置,可选择ADC_INPUT_SRC_IO0 ~ ADC_INPUT_SRC_IO4、ADC_INPUT_SRC_TMP、ADC_INPUT_SRC_BAT。此处选择ADC_INPUT_SRC_IO0与ADC_INPUT_SRC_IO1,即映射至MSIO0与MSIO1脚。用户可修改映射至其他MSIO引脚。
- init.input_mode:输入模式设置,可选择ADC_INPUT_SINGLE、ADC_INPUT_DIFFERENTIAL。此处选择ADC_INPUT_SINGLE即单端模式,表示只采样N通道。用户可修改为差分模式。
- init.ref_source:参考源设置,可选择ADC_REF_SRC_BUF_INT、ADC_REF_SRC_IO0 ~ ADC_REF_SRC_IO3。此处选择ADC_REF_SRC_BUF_INT即内部参考源。
- init.ref_value:内部参考源参考电压设置,可选择ADC_REF_VALUE_0P8、ADC_REF_VALUE_1P2、ADC_REF_VALUE_1P6。此处选择ADC_REF_VALUE_1P6即1.6 V,输入量程为0 ~ 3.2 V。
- init.clock:ADC时钟设置,可选择ADC_CLK_16M、ADC_CLK_1P6M、ADC_CLK_8M、ADC_CLK_4M、ADC_CLK_2M、ADC_CLK_1M。此处选择ADC_CLK_1P6M 即1.6 MHz,用户可修改为其他频率。
- 本示例中ADC转换采用DMA方式读取数据。
- 调用hal_adc_start_dma()接口用DMA方式进行ADC采样。
采样结果通过DMA读取至内存中,代码如下所示:
hal_adc_start_dma(&g_adc_handle, conversion, TEST_CONV_LENGTH);由于为非阻塞方式,需等待ADC状态恢复。在本示例中,ADC采样结果通过hal_adc_conv_cplt_callback()接口返回,在该回调函数内用户可自定义可执行操作。
代码如下所示:
void hal_adc_conv_cplt_callback(adc_handle_t *hadc) { printf("DMA conversion is done.\r\n"); } - 调用hal_gr551x_adc_voltage_intern()接口将得到的ADC数值转换为电压值,代码如下所示:
hal_gr551x_adc_voltage_intern(&g_adc_handle, conversion, voltage, TEST_CONV_LENGTH); - 如果参考源采用外部参考时,可调用如下接口将得到ADC的数值转换为电压值:
void hal_gr551x_adc_voltage_extern(adc_handle_t *hadc, double vref, uint16_t *inbuf, double *outbuf, uint32_t buflen)
- 调用hal_adc_start_dma()接口用DMA方式进行ADC采样。
测试验证
- 用GProgrammer下载adc.bin至开发板。
- 将开发板串口连接至PC端,打开并设置GRUart。
- 串口输出ADC等模块的开机信息等日志。
- 在GRUart的Receive Data窗口中显示计算后的ADC电压值。