2.1 adc 的IO配置如下:例程使用了GPIO8,GPIO12,GPIO14,GPIO15和电源通道
static const pin_config_t adc_pin_config[] = { {PAD_ADC_CH_GPIO08, {MUX_ADC_CH_GPIO08}, PMU_PIN_MODE_FLOAT, PMU_PIN_DRIVER_CURRENT_NORMAL}, {PAD_ADC_CH_GPIO12, {MUX_ADC_CH_GPIO12}, PMU_PIN_MODE_FLOAT, PMU_PIN_DRIVER_CURRENT_NORMAL}, {PAD_ADC_CH_GPIO14, {MUX_ADC_CH_GPIO14}, PMU_PIN_MODE_FLOAT, PMU_PIN_DRIVER_CURRENT_NORMAL}, {PAD_ADC_CH_GPIO15, {MUX_ADC_CH_GPIO15}, PMU_PIN_MODE_FLOAT, PMU_PIN_DRIVER_CURRENT_NORMAL}, }; 2.2 adc 初始化配置如下:
void user_adc_init(void) { //drv_adc_config_t adc_config; adc_config.channel = ADC_CH_GPIO8 | ADC_CH_GPIO12 | ADC_CH_GPIO14 | ADC_CH_GPIO15 | ADC_CH_VBAT; adc_config.mode = ADC_MODE_SINGLE; adc_config.gain = ADC_GAIN_1_3; adc_config.sum_num = ADC_SUM_NUM_32; adc_config.sampling_cycles = ADC_SAMPLING_CYCLES_0; drv_pin_init(adc_pin_config, sizeof(adc_pin_config) / sizeof(adc_pin_config[0])); drv_adc_init(&adc_config); pm_sleep_prevent(PM_ID_USER0); adc_continue_flag = 1;//ADC转换标志,代码是一直有转换了,这里设置了一个标志 adc_first_read_cnt = 0;//过滤个数初始化 // 初始化配置就完了,不需要在这里做读取,也不需要要中断,读取再1000ms定时器中断回调函数里面执行 } 3.ADC转换的第一个数据不稳定,需要过滤前面一两个数据,对应的代码如下
if (adc_first_read_cnt < ADC_RESULE_FILTER_NUM) // 忽略掉前面不准确的adc的数据的个数默认设置了3个,根据应用可以可修改 { adc_first_read_cnt ++; // 第一次读取数据标志 } 4.进入睡眠后需要重新初始化ADC,代码参考如下:
5.转换结果存储在以下的变量中:
int16_t adc_resule_gpio8 = 0; int16_t adc_resule_gpio12 = 0; int16_t adc_resule_gpio14 = 0; int16_t adc_resule_gpio15 = 0; int16_t adc_ch_bat = 0; 6.测试结果如下截图:
7.附件是对应的drv_adc.c文件和main.c里面有功能实现的参考例子 |