CH585_ADC SCAN快速采集

实现功能:

例如采集5通道ADC数据,BUF配置20,则实现channel0数据放在BUF[0],channel1=BUF[1]...channel0=BUF[5]...

可以实现快速采集数据。

注意:不需要使用中断。

实际使用场景:例如高上报率手柄需要快速ADC采样,可采用该方式

代码(配合蓝牙从机使用)

volatile uint8_t i = 0;
volatile uint8_t PRINT_flag = 0;
#define	ADC_PBUFFER_LENGTH				20//(96*15)
__attribute__ ((aligned(4)))  uint16_t adc_buffer[ADC_PBUFFER_LENGTH] ;

/* 注意当使用ADC扫描功能时,例程默认打印脚由PA14更改为PB7*/
#define ADC_SCAN_MODE_EXAM          1
#define ADC_SCAN_CH_NUM            5//14

#define ADC_SCAN1_CH_IDX_1 (0)
#define ADC_SCAN1_CH_IDX_2 (4)
#define ADC_SCAN1_CH_IDX_3 (8)
#define ADC_SCAN1_CH_IDX_4 (12)
#define ADC_SCAN1_CH_IDX_5 (16)
#define ADC_SCAN1_CH_IDX_6 (20)
#define ADC_SCAN1_CH_IDX_7 (24)
#define ADC_SCAN1_CH_IDX_8 (28)
#define ADC_SCAN2_CH_IDX_9 (0)
#define ADC_SCAN2_CH_IDX_10 (4)
#define ADC_SCAN2_CH_IDX_11 (8)
#define ADC_SCAN2_CH_IDX_12 (12)
#define ADC_SCAN2_CH_IDX_13 (16)


const uint32_t ADC_PIN[14] = {
    0x00000010,                                           // PA4,AIN0
    0x00000020,                                           // PA5,AIN1
    0x00001000,                                           // PA12,AIN2
    0x00002000,                                           // PA13,AIN3
    0x00004000,                                           // PA14,AIN4
    0x00008000,                                           // PA15,AIN5
    0x00000008,                                           // PA3,AIN6
    0x00000004,                                           // PA2,AIN7
    0x00000002,                                           // PA1,AIN8
    0x00000001,                                           // PA0,AIN9
    0x00000040,                                           // PA6,AIN10
    0x00000080,                                           // PA7,AIN11
    0x00000100,                                           // PA8,AIN12
    0x00000200                                            // PA9,AIN13
};

const uint8_t adc_ch_seq[14] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};

#define  printLen  80
volatile uint16_t adcBuff[printLen];

volatile uint8_t adclen;
volatile uint8_t DMA_end = 0;

__HIGH_CODE
void adc_scan_test()
{    
    uint32_t temp = 0;
    GPIOA_ModeCfg(  ADC_PIN[adc_ch_seq[0]] |
                    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;                      //7个采样周期
    ADC_ChannelCfg(adc_ch_seq[0]);

    temp = (adc_ch_seq[1] << ADC_SCAN1_CH_IDX_1) |
           (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;

    temp = 0;
    temp = (adc_ch_seq[9] << ADC_SCAN2_CH_IDX_9) |
           (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);
    ADC_AutoConverCycle(192);
    // temp |= RB_ADC_SCAN_SEL | ((ADC_SCAN_CH_NUM - 1) << 24);
    temp |= RB_ADC_SCAN_SEL | RB_ADC_IE_SCAN_END | ((ADC_SCAN_CH_NUM - 1) << 24);
    R32_ADC_SCAN_CFG2 = temp;
    ADC_DMACfg(ENABLE, (uint32_t)&adcBuff[0] , (uint32_t)&adcBuff[printLen] , ADC_Mode_LOOP);
    // PFIC_EnableIRQ(ADC_IRQn);
    ADC_StartAutoDMA();
}

__HIGH_CODE
__attribute__((noinline))
void Main_Circulation()
{   
    while(1)
    {
        TMOS_SystemProcess();
        if(PRINT_flag == 1){
            PRINT_flag = 0;
            for (i = 0; i < 10; i++)
            {
                PRINT("%02d:%04d ",i, adcBuff[i]);
                adcBuff[i] = 0;
            }PRINT("\n");PRINT("\n");
        }
    }
}

VOID TMR_TEST(){
    TMR0_TimerInit(FREQ_SYS / 10);         // 设置定时时间 100ms
    TMR0_ITCfg(ENABLE, TMR0_3_IT_CYC_END); // 开启中断
    PFIC_EnableIRQ(TMR0_IRQn);
}

int main(void)
{
#if(defined(DCDC_ENABLE)) && (DCDC_ENABLE == TRUE)
    PWR_DCDCCfg(ENABLE);
#endif
    HSECFG_Capacitance(HSECap_18p);
    SetSysClock(SYSCLK_FREQ);
#if(defined(HAL_SLEEP)) && (HAL_SLEEP == TRUE)
    GPIOA_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);
    GPIOB_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);
#endif
#ifdef DEBUG
    GPIOB_SetBits(GPIO_Pin_7);
    GPIOB_ModeCfg(GPIO_Pin_4, GPIO_ModeIN_PU);
    GPIOB_ModeCfg(GPIO_Pin_7, GPIO_ModeOut_PP_5mA);
    UART0_DefInit();
    UART0_BaudRateCfg(2000000);
#endif

    GPIOB_SetBits(GPIO_Pin_0|GPIO_Pin_1);
    GPIOB_ModeCfg(GPIO_Pin_0|GPIO_Pin_1, GPIO_ModeOut_PP_5mA);

    PRINT("%s\n", VER_LIB);
    CH58x_BLEInit();
    HAL_Init();
    GAPRole_PeripheralInit();
    Peripheral_Init();
    TMR_TEST();
    R32_PIN_IN_DIS |= RB_PAx_IN_DIS; // 关闭数字输入
    adc_scan_test();
    mDelaymS(100);
    Main_Circulation();
}
__INTERRUPT
__HIGH_CODE
void TMR0_IRQHandler(void) // TMR0 定时中断
{
    if(TMR0_GetITFlag(TMR0_3_IT_CYC_END))
    {
        TMR0_ClearITFlag(TMR0_3_IT_CYC_END); // 清除中断标志
        PRINT_flag = 1;
    }
}

 

posted @ 2026-02-10 13:33  SweetTea_lllpc  阅读(42)  评论(0)    收藏  举报