多通道adc

由于目前手头的开发板刚刚烧掉,无法验证如下程序,请官方查看如下程序,看是否有问题,003芯片,三通道,使用dma adc采集,开启转换后使用 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC))判断转换完毕,后期会将while中的程序放置在TIM中断中,周期采集

#include "debug.h"


u16 TxBuf[10];

void ADC_Function_Init(void)

{

    ADC_InitTypeDef  ADC_InitStructure = {0};

    GPIO_InitTypeDef GPIO_InitStructure = {0};


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

    RCC_ADCCLKConfig(RCC_PCLK2_Div8);


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

    GPIO_Init(GPIOC, &GPIO_InitStructure);


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

    GPIO_Init(GPIOD, &GPIO_InitStructure);


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

    GPIO_Init(GPIOD, &GPIO_InitStructure);


    ADC_DeInit(ADC1);

    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

    ADC_InitStructure.ADC_ScanConvMode = ENABLE;//多通道需要使能,扫描模式

    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//连续转换

    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//没有外部触发

    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

    ADC_InitStructure.ADC_NbrOfChannel = 3;//转换三个通道

    ADC_Init(ADC1, &ADC_InitStructure);


    ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_241Cycles);

    ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 2, ADC_SampleTime_241Cycles);

    ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 3, ADC_SampleTime_241Cycles);


    ADC_Calibration_Vol(ADC1, ADC_CALVOL_50PERCENT);

    ADC_DMACmd(ADC1, ENABLE);

    ADC_Cmd(ADC1, ENABLE);


    ADC_ResetCalibration(ADC1);

    while(ADC_GetResetCalibrationStatus(ADC1));

    ADC_StartCalibration(ADC1);

    while(ADC_GetCalibrationStatus(ADC1));

}

u16 Get_ADC_Val(u8 ch)

{

    u16 val;


    ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_241Cycles);

    ADC_SoftwareStartConvCmd(ADC1, ENABLE);


    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));

    val = ADC_GetConversionValue(ADC1);


    return val;

}


void DMA_Tx_Init(DMA_Channel_TypeDef *DMA_CHx, u32 ppadr, u32 memadr, u16 bufsize)

{

    DMA_InitTypeDef DMA_InitStructure = {0};


    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);


    DMA_DeInit(DMA_CHx);

    DMA_InitStructure.DMA_PeripheralBaseAddr = ppadr;

    DMA_InitStructure.DMA_MemoryBaseAddr = memadr;

    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

    DMA_InitStructure.DMA_BufferSize = bufsize;

    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

    DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;

    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

    DMA_Init(DMA_CHx, &DMA_InitStructure);

}


int main(void)

{

    u16 i;

    SystemCoreClockUpdate();

    Delay_Init();

#if (SDI_PRINT == SDI_PR_OPEN)

    SDI_Printf_Enable();

#else

    USART_Printf_Init(115200);

#endif

    printf("SystemClk:%d\r\n", SystemCoreClock);

    printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );

    ADC_Function_Init();

    DMA_Tx_Init(DMA1_Channel1, (u32)&ADC1->RDATAR, (u32)TxBuf,3);

    while(1)

    {



        DMA_Cmd(DMA1_Channel1, ENABLE);

        ADC_SoftwareStartConvCmd(ADC1, ENABLE);

        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));

        ADC_SoftwareStartConvCmd(ADC1, DISABLE);

        DMA_Cmd(DMA1_Channel1, DISABLE);

        for(i = 0; i < 3; i++)

        {

            printf("%04d\r\n", TxBuf[i]);

            Delay_Ms(10);

        }

    }

}


您好,针对你的例程做了一下修改,参考附件例程,测试应该是没问题的

icon_rar.gifADC DMA.zip



嗯,如果我想在需要时才开始转换,不用就停止,只转换一次,那么可以用while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));判断转换是否完成?


您好,可以的,若只转换一次,这种情况下不用DMA也可以,ADC可以关闭连续转换。


只有登录才能回复,可以选择微信账号登录