6626 ADC快速多通道转换实现方法

eddy wen · 23次点击 · 3天前
  1. 需要替换drv_adc.c文件,附件中有提供


  2. 在main.c中定义了跟快速转换有关的设置和参数


     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,代码参考如下:

     image.png

   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.测试结果如下截图:

   image.png


  7.附件是对应的drv_adc.c文件和main.c里面有功能实现的参考例子

ADC快速转换例子-202501144308.rar
被收藏 0  ∙  0 赞  
加入收藏
点赞
0 回复  
善言善语 (您需要 登录 后才能回复 没有账号 ?)

请先登录网站