cancel
Showing results for 
Search instead for 
Did you mean: 

STM32H743 ADC sample x steps and each step sample y points,but the datas of first step are diffeternt from other steps

LH S
Associate

The ADC is trigggered by TIM,the sampling rate is 2M and TIM period is also 2M.I want to sample X steps, and each step samples Y points so that I could get wave figure with these data. However,I found the question that described as my question title.The wave figure is as shown in next figure.The one that sticks out is the first step with 64 points.It is so different with others but its tendency is the same as others. Next I list my code that initialize ADC.

/* ADC3 init function */

static void MX_ADC3_Init(void)

{

  ADC_ChannelConfTypeDef sConfig;

  /**Common config 

  */

  hadc3.Instance = ADC3;

  if (HAL_ADC_DeInit(&hadc3) != HAL_OK)

  {

    /* ADC initialization error */

    Error_Handler();

  }

  hadc3.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;

  hadc3.Init.Resolution = ADC_RESOLUTION_12B;

  hadc3.Init.ScanConvMode = ADC_SCAN_DISABLE;

  hadc3.Init.EOCSelection = ADC_EOC_SINGLE_CONV;

  hadc3.Init.LowPowerAutoWait = DISABLE;

  hadc3.Init.ContinuousConvMode = DISABLE;

  hadc3.Init.NbrOfConversion = 1;

  hadc3.Init.DiscontinuousConvMode = DISABLE;

  hadc3.Init.NbrOfDiscConversion = 1;

  hadc3.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T3_TRGO;

  hadc3.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;

  hadc3.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_ONESHOT;

  hadc3.Init.Overrun = ADC_OVR_DATA_PRESERVED;

  hadc3.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;

  hadc3.Init.BoostMode = ENABLE;

  hadc3.Init.OversamplingMode = DISABLE;

  if (HAL_ADC_Init(&hadc3) != HAL_OK)

  {

    Error_Handler();

  }

  /**Configure Regular Channel 

  */

  sConfig.Channel = ADC3_I1_CHANNEL;

  sConfig.Rank = ADC_REGULAR_RANK_1;

  sConfig.SamplingTime = ADC_SAMPLETIME_8CYCLES_5;

  sConfig.SingleDiff = ADC_SINGLE_ENDED;

  sConfig.OffsetNumber = ADC_OFFSET_NONE;

  sConfig.Offset = 0;

  if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK)

  {

    Error_Handler();

  }

  /* Run the ADC calibration in single-ended mode */

  if (HAL_ADCEx_Calibration_Start(&hadc3, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED) != HAL_OK)

  {

    /* Calibration Error */

    Error_Handler();

  }

}

void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)

{

 GPIO_InitTypeDef GPIO_InitStruct;

 if(adcHandle->Instance==ADC1)

 {

  /* ADC1 clock enable */

  HAL_RCC_ADC12_CLK_ENABLED++;

  if(HAL_RCC_ADC12_CLK_ENABLED==1){

   __HAL_RCC_ADC12_CLK_ENABLE();

  }

  

  /**ADC1 GPIO Configuration   

  PB1   ------> ADC1_INP5 

  */

  GPIO_InitStruct.Pin = ADC1_I3_GPIO_PIN;

  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  HAL_GPIO_Init(ADC1_I3_GPIO_PORT, &GPIO_InitStruct);

//  GPIO_InitStruct.Pin = POWER_VCC_DETECT_PIN;

//  HAL_GPIO_Init(POWER_VCC_DETCET_GPIO_PORT, &GPIO_InitStruct);

  /* ADC1 DMA Init */

  /* ADC1 Init */

  hdma_adc1.Instance = DMA1_Stream1;

  hdma_adc1.Init.Request = DMA_REQUEST_ADC1;

  hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;

  hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;

  hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;

  hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;

  hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;

  hdma_adc1.Init.Mode = DMA_NORMAL;

  hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH;

  if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)

  {

   Error_Handler();

  }

  __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);

  HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 0, 1);

  HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);

 }

 else if(adcHandle->Instance==ADC2)

 {

  /* ADC2 clock enable */

  HAL_RCC_ADC12_CLK_ENABLED++;

  if(HAL_RCC_ADC12_CLK_ENABLED==1){

   __HAL_RCC_ADC12_CLK_ENABLE();

  }

  

  /**ADC2 GPIO Configuration   

  PA6   ------> ADC2_INP3 

  */

  GPIO_InitStruct.Pin = ADC2_I2_GPIO_PIN;

  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  HAL_GPIO_Init(ADC2_I2_GPIO_PORT, &GPIO_InitStruct);

   

  hdma_adc2.Instance = DMA1_Stream5;

  hdma_adc2.Init.Request = DMA_REQUEST_ADC2;

  hdma_adc2.Init.Direction = DMA_PERIPH_TO_MEMORY;

  hdma_adc2.Init.PeriphInc = DMA_PINC_DISABLE;

  hdma_adc2.Init.MemInc = DMA_MINC_ENABLE;

  hdma_adc2.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;

  hdma_adc2.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;

  hdma_adc2.Init.Mode = DMA_NORMAL;

  hdma_adc2.Init.Priority = DMA_PRIORITY_HIGH;

  if (HAL_DMA_Init(&hdma_adc2) != HAL_OK)

  {

   Error_Handler();

  }

  __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc2);

  HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 0, 1);

  HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn);

 }

 else if(adcHandle->Instance==ADC3)

 {

  /* ADC3 clock enable */

  __HAL_RCC_ADC3_CLK_ENABLE();

  

  /**ADC3 GPIO Configuration   

  PC3_C   ------> ADC3_INP1 

  */

  HAL_SYSCFG_AnalogSwitchConfig(SYSCFG_SWITCH_PC3, SYSCFG_SWITCH_PC3_OPEN);

  /* ADC3 DMA Init */

  /* ADC3 Init */

GPIO_InitStruct.Pin = ADC3_I1_GPIO_PIN;

  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  HAL_GPIO_Init(ADC3_I1_GPIO_PORT, &GPIO_InitStruct);

  

  hdma_adc3.Instance = DMA1_Stream2;

  hdma_adc3.Init.Request = DMA_REQUEST_ADC3;

  hdma_adc3.Init.Direction = DMA_PERIPH_TO_MEMORY;

  hdma_adc3.Init.PeriphInc = DMA_PINC_DISABLE;

  hdma_adc3.Init.MemInc = DMA_MINC_ENABLE;

  hdma_adc3.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;

  hdma_adc3.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;

  hdma_adc3.Init.Mode = DMA_NORMAL;

  hdma_adc3.Init.Priority = DMA_PRIORITY_HIGH;

  hdma_adc3.Init.FIFOMode = DMA_FIFOMODE_DISABLE;

  if (HAL_DMA_Init(&hdma_adc3) != HAL_OK)

  {

   Error_Handler();

  }

  __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc3);

  HAL_NVIC_SetPriority(DMA1_Stream2_IRQn, 0, 1);

  HAL_NVIC_EnableIRQ(DMA1_Stream2_IRQn);

 }

}

Thank you for your help!

0690X000006CUAOQA4.jpg

0 REPLIES 0