STM32 ADC DMA 中斷模式多通道讀取ADC轉換值


因為做一個電機控制項目,其中需要用到用PWM觸發ADC,讀取ADC的轉換值。

這里有兩個關鍵問題:

第一,如何使PWM觸發ADC轉換?

第二,如何在ADC多通道掃描模式下,讀取各個channel的adc轉換值?

第三,如何使用DMA讀取多通道ADC轉換值?

 

第一個問題,首先需要將ADC設置成外部觸發轉換,第二需要選擇觸發是發生在Timer的上升沿還是下降沿。程序如下:

    adc.ADC_Resolution = ADC_Resolution_12b;        
    adc.ADC_ScanConvMode =ENABLE;     //¶àͨµÀת»»
    adc.ADC_ContinuousConvMode = ENABLE;   //Á¬Ðø×ª»»
    adc.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;
    adc.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T8_CC1;
    adc.ADC_DataAlign = ADC_DataAlign_Right;  //ÓÒ¶ÔÆë·½Ê½
    adc.ADC_NbrOfConversion = 2;
    ADC_Init(ADC1,&adc);
    ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_56Cycles);
    ADC_RegularChannelConfig(ADC1,ADC_Channel_2,2,ADC_SampleTime_56Cycles);
    ADC_Cmd(ADC1,ENABLE);
      //ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);   //ÉèÖô¥·¢ADCÖжϵÄÖжÏÔ´
    ADC_DMACmd(ADC1, ENABLE);
    ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);

第二個問題,如果是使用ADC1的多個通道進行轉換,那么使用DMA,使每個通道轉換成功的數據存入響應的內存位置中,會是一個很好的選擇,DMA選擇外設到內存,外設地址不增加,內存地址增加。

第三個問題,DMA的拓撲圖如下,記得使用對應的DMA請求,需要設置好對應的DMAy、streamx和channelz,否則沒法觸發DMA中斷。

這里使用的是ADCDMA請求,選擇了DMA2 stream0 channel0。 對應的DMA配置程序如下

//配置
        DMA_DeInit(DMA2_Stream0);
    dma.DMA_Channel= DMA_Channel_0;   // 
    dma.DMA_PeripheralBaseAddr = (uint32_t)&(ADC1->DR);
    dma.DMA_Memory0BaseAddr = (uint32_t)ad_buffer;
    dma.DMA_DIR = DMA_DIR_PeripheralToMemory;
    dma.DMA_BufferSize = 2;
    dma.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    dma.DMA_MemoryInc = DMA_MemoryInc_Enable;
    dma.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//DMA_PeripheralDataSize_Byte;
    dma.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//DMA_MemoryDataSize_Byte;
    dma.DMA_Mode = DMA_Mode_Circular;
    dma.DMA_Priority = DMA_Priority_High;
    dma.DMA_FIFOMode = DMA_FIFOMode_Disable;
    dma.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;
    dma.DMA_MemoryBurst = DMA_Mode_Normal;
    dma.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    DMA_Init(DMA2_Stream0,&dma);

    DMA_ITConfig(DMA2_Stream0,DMA_IT_TC,ENABLE);
    DMA_Cmd(DMA2_Stream0,ENABLE);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM