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; } }
 
                    
                 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号