CH585的ADC功能中有扫描功能,支持对多个adc通道扫描采集。

EVT例程包中已经包含了功能的展示,接下来我们跑下例程看看:

将ADC_SCAN_MODE_EXAM写1开启扫描功能,ADC_SCAN_CH_NUM为扫描通道的个数,默认值为14最大支持扫描14个通道。

  GPIOA_ModeCfg(ADC_PIN[adc_ch_seq[0]] |                             //将adc引脚配置为浮空输入
                      ADC_PIN[adc_ch_seq[1]] |
                      ADC_PIN[adc_ch_seq[2]] |
                      ADC_PIN[adc_ch_seq[3]] |
                      ADC_PIN[adc_ch_seq[4]] |
                      ADC_PIN[adc_ch_seq[5]] |
                      ADC_PIN[adc_ch_seq[6]] |
                      ADC_PIN[adc_ch_seq[7]] |
                      ADC_PIN[adc_ch_seq[8]] |
                      ADC_PIN[adc_ch_seq[9]] |
                      ADC_PIN[adc_ch_seq[10]] |
                      ADC_PIN[adc_ch_seq[11]] |
                      ADC_PIN[adc_ch_seq[12]] |
                      ADC_PIN[adc_ch_seq[13]],
                  GPIO_ModeIN_Floating);

    ADC_ExtSingleChSampInit(SampleFreq_4_or_2, ADC_PGA_0);        //4M采样频率,0db增益
    R8_ADC_CONVERT |= RB_ADC_SAMPLE_TIME;                      
    ADC_ChannelCfg(adc_ch_seq[0]);                                //配置起始通道

    temp = (adc_ch_seq[1] << ADC_SCAN1_CH_IDX_1) |                //配置后续8个通道
           (adc_ch_seq[2] << ADC_SCAN1_CH_IDX_2) |
           (adc_ch_seq[3] << ADC_SCAN1_CH_IDX_3) |
           (adc_ch_seq[4] << ADC_SCAN1_CH_IDX_4) |
           (adc_ch_seq[5] << ADC_SCAN1_CH_IDX_5) |
           (adc_ch_seq[6] << ADC_SCAN1_CH_IDX_6) |
           (adc_ch_seq[7] << ADC_SCAN1_CH_IDX_7) |
           (adc_ch_seq[8] << ADC_SCAN1_CH_IDX_8);
    R32_ADC_SCAN_CFG1 = temp;
    //      PRINT("R32_ADC_SCAN_CH_CFG1:%08X;\r\n temp:%08X\n", R32_ADC_SCAN_CH_CFG1,temp);
    temp = 0;
    temp = (adc_ch_seq[9] << ADC_SCAN2_CH_IDX_9) |                //继续配置剩余5个通道
           (adc_ch_seq[10] << ADC_SCAN2_CH_IDX_10) |
           (adc_ch_seq[11] << ADC_SCAN2_CH_IDX_11) |
           (adc_ch_seq[12] << ADC_SCAN2_CH_IDX_12) |
           (adc_ch_seq[13] << ADC_SCAN2_CH_IDX_13);
    temp |= RB_ADC_SCAN_SEL | RB_ADC_IE_SCAN_END | ((ADC_SCAN_CH_NUM - 1) << 24);  // RB_ADC_SCAN_NUM =  ADC_SCAN_CH_NUM - 1
    R32_ADC_SCAN_CFG2 = temp;

    R32_ADC_DMA_BEG = (uint32_t)&adcBuff[0] & 0x1FFFF;
    R32_ADC_DMA_END = (uint32_t)&adcBuff[40] & 0x1FFFF;
    R8_ADC_CTRL_DMA |= RB_ADC_DMA_ENABLE | RB_SCAN_AUTO_TYPE;          //| RB_ADC_IE_EOC| RB_ADC_IE_DMA_END |
    PFIC_EnableIRQ(ADC_IRQn);
    R8_ADC_CONVERT = RB_ADC_START;
    while (!DMA_end);
    DMA_end = 0;
    for (i = 0; i < ADC_SCAN_CH_NUM; i++)                      //一轮扫描结束,打印14个通道的采集数据
    {
        PRINT("%d:%d ",i, adcBuff[i]);
        PRINT("\n");
        adcBuff[i] = 0;
    }
    PRINT("\n");
    while(1);

中断处理:

__INTERRUPT
__HIGH_CODE
void ADC_IRQHandler(void) //adc中断服务程序
{
    if (R8_ADC_INT_FLAG & RB_ADC_IF_EOC)
    {
        uint8_t i = 0;
        i = R8_ADC_CONVERT;
        R8_ADC_CONVERT = i;
    }

    if (R32_ADC_SCAN_CFG2 & RB_ADC_IF_SCAN_END)
    {
        R32_ADC_SCAN_CFG2 |= RB_ADC_IF_SCAN_END;
        R32_ADC_DMA_BEG = (uint32_t)adcBuff & 0x1ffff;
        DMA_end = 1;
    }
}

 

posted on 2025-06-30 19:45  WCH蓝牙应用分享  阅读(79)  评论(0)    收藏  举报