首页 > 解决方案 > 在 STM32F4 中收集从脉冲上升沿到下降沿的 ADC 值(设置 ADC 转换次数)

问题描述

我正在使用 DMA 收集 STM32F4 微控制器中的 ADC 数据。ADC 数据现在配置为单一模式,ADC 在脉冲的上升沿触发(我使用 TIM8 进行脉冲生成,脉冲可以设置为 10us 到 400us,我也使用相同的 TIM8 进行上升边沿 ADC 触发)。

ADC 的转换时间约为 3us。所以在 10us 脉冲期间,我大约得到 3 个 ADC 值,所以如果我设置 10us 脉冲,那么 ADC 值收集应该在脉冲的下降沿停止,这样对于 10us 脉冲我将有大约 3 个 ADC 值。

那么是否可以将 ADC 配置为在脉冲的上升沿开始并在脉冲的下降沿停止。

注意:-代码现在在上升沿触发的单模式下工作正常,其中仅捕获一次 ADC 值,而与脉冲持续时间无关,但是在连续模式下,我希望它从上升沿转换和收集数据直到脉冲的下降沿,然后停止 ADC

// this is my ADC and DMA initialization code.

void cADCReadout::initialize(sADCInitStruct init)

{

   m_sInitStruct = init;

 

   ADC_InitTypeDef      ADC_InitStructure;

   ADC_CommonInitTypeDef ADC_CommonInitStructure;

   DMA_InitTypeDef      DMA_InitStructure;

 

   //DMA

   DMA_InitStructure.DMA_Channel = init.DMAChannel;

   DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(init.ADCChannel->DR);

   DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)(&m_aRecBuffer);

   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;

   DMA_InitStructure.DMA_BufferSize = 0;

   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_Word;

   DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

   DMA_InitStructure.DMA_Priority = DMA_Priority_High;

   DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;

   DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;

   DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;

   DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;

   DMA_Init(init.DMAStream, &DMA_InitStructure);

   DMA_Cmd(init.DMAStream, ENABLE);

 

   //ADC

   ADC_CommonInitStructure.ADC_Mode = ADC_TripleMode_RegSimult;

   ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;

   ADC_CommonInitStructure.ADC_DMAAccessMode =ADC_DMAAccessMode_1;

   ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;

   ADC_CommonInit(&ADC_CommonInitStructure);

 

   ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;

   ADC_InitStructure.ADC_ScanConvMode = ENABLE;                       

   ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;                        

   ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising ;  

   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T8_TRGO;            

   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

   ADC_InitStructure.ADC_NbrOfConversion =1;

   ADC_Init(init.ADCChannel, &ADC_InitStructure);

 

   ADC_EOCOnEachRegularChannelCmd(init.ADCChannel, DISABLE);

 

   /* Enable DMA request after last transfer (Single-ADC mode) */

   ADC_DMARequestAfterLastTransferCmd(init.ADCChannel, ENABLE);

}

标签: timerdmaadcstm32f4

解决方案


推荐阅读