多路ADC同时测量示例

yangzh · 26次点击 · 2天前

    我们实际中会用到多路ADC采样,这边举例说明多路ADC使用方法及注意事项

  1. 定义初始化函数  

  2. user_adc_init();

    函数实现内容

  3. void user_adc_init(void)
    {
        int16_t out5[4];
     
        //drv_adc_config_t adc_config;
        adc_config.channel = ADC_CH_GPIO7 | ADC_CH_GPIO8 | ADC_CH_GPIO11| 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;//0
        drv_pin_init(adc_pin_config, sizeof(adc_pin_config) / sizeof(adc_pin_config[0]));
        drv_adc_init(&adc_config);
        // 初始化配置就完了,不需要在这里做读取,也不需要要中断,读取再1000ms定时器中断回调函数里面执行
      
        drv_adc_read(adc_config.channel, &out5[0], 4);
     
        drv_adc_control(ADC_CONTROL_DISABLE_CLOCK, NULL);
      
        uint32_t bat = 0;
        uint32_t vol7 = 0;  
        uint32_t vol8 = 0;
        uint32_t vol11 = 0;

      
        for (size_t i = 0; i < 1; i++)
        {
            // printf("%d ", out[i]);
            bat += out5[0+i*4];
            vol7 += out5[1+(i)*4];
            vol8 += out5[2+(i)*4];      
            vol11 += out5[3+(i)*4];
         
        }
       
    //    bat /= 1;
    //    vol8 /= 1;
    //    vol12 /= 1;
    //    vol14 /= 1;
    //    vol15 /= 1;  
        //OM_LOG_DEBUG("vol08: %d,%d,%d,%d\n", bat,vol7,vol8,vol11);
     
       
    }

其中:adc_config.channel = ADC_CH_GPIO7 | ADC_CH_GPIO8 | ADC_CH_GPIO11| ADC_CH_VBAT;

分别代表VBAT ,GPIO7,GPIO8,GPIO11这4路,顺序如下

/// ADC channels
typedef enum {
    /// temperature channel
    ADC_CH_TEMPERATURE = (1<<0U),
    /// VBAT channel
    ADC_CH_VBAT        = (1<<1U),
    /// GPIO2 channel
    ADC_CH_GPIO2       = (1<<4U),
    /// GPIO3 channel
    ADC_CH_GPIO3       = (1<<5U),
    /// GPIO7 channel
    ADC_CH_GPIO7       = (1<<6U),
    /// GPIO8 channel
    ADC_CH_GPIO8       = (1<<7U),
    /// GPIO11 channel
    ADC_CH_GPIO11      = (1<<8U),
    /// GPIO12 channel
    ADC_CH_GPIO12      = (1<<9U),
    /// GPIO14 channel
    ADC_CH_GPIO14      = (1<<10U),
    /// GPIO15 channel
    ADC_CH_GPIO15      = (1<<11U),
} drv_adc_channel_t;

out5[4]数组分别采集到的数据是VBAT 、GPIO7、GPIO8、GPIO11


  1.   其中影响读ADC速率的参数有如下

    adc_config.sum_num = ADC_SUM_NUM_32; //表示采集次数总和

  2. 采样周期

    adc_config.sampling_cycles = ADC_SAMPLING_CYCLES_0;//0

  3. 他们的配比关系如下(Maximum Rin是输入阻抗)


    image.png


为降低功耗,代码都放在RAM里运行,修改如下

image.png


此处修改如下:(都加*)

    ER_RAM_CODE +0 ALIGN 32 {

        *.o(RAM_CODE*)

        *.o(RAM_RODATA*)

    }


 4. 工程默认主频是32MHZ,这边测试32M比64M主频的平均功耗会低

 5. ADC采样测试在入口和出口测试采样时间,这边验证在32M主频下的时间是400us左右





main-202501208345.c
被收藏 0  ∙  0 赞  
加入收藏
点赞
0 回复  
善言善语 (您需要 登录 后才能回复 没有账号 ?)

请先登录网站