Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

STM32F030 ADC

Вт авг 24, 2021 12:51:05

Народ помогите разобраться с АЦП, я с этой проблемой сталкиваюсь регулярно в разных проектах.

Проблема в сканирование нескольких каналов, не могу разобраться как реализовать.
Проблема в том что ацп сканирует только с одного входа.

Проект в кубе:
СпойлерИзображение

пишу в Keil
в 103 использовал пере инициализацию
Код:
static void MX_ADC1_ReInit(uint32_t ADC_CHANNEL){
  ADC_ChannelConfTypeDef sConfig;
  sConfig.Channel = ADC_CHANNEL;
  sConfig.Rank = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
   if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
}

в 030 не работает
юзал так:
Код:
    MX_ADC1_ReInit(ADC_CHANNEL_0);
    HAL_ADC_Start(&hadc);
    HAL_ADC_PollForConversion(&hadc,100);
    ADC_Data0 = (uint32_t) HAL_ADC_GetValue(&hadc);
    HAL_ADC_Stop(&hadc);
      
    MX_ADC1_ReInit(ADC_CHANNEL_1);
    HAL_ADC_Start(&hadc);
    HAL_ADC_PollForConversion(&hadc,100);
    ADC_Data1 = (uint32_t) HAL_ADC_GetValue(&hadc);
    HAL_ADC_Stop(&hadc);
      
   MX_ADC1_ReInit(ADC_CHANNEL_2);
   HAL_ADC_Start(&hadc);
   HAL_ADC_PollForConversion(&hadc,100);
   ADC_Data2 = (uint32_t) HAL_ADC_GetValue(&hadc);
   HAL_ADC_Stop(&hadc);

Код инициализации ADC
Спойлер
Код:
static void MX_ADC_Init(void)
{

  /* USER CODE BEGIN ADC_Init 0 */

  /* USER CODE END ADC_Init 0 */

  ADC_ChannelConfTypeDef sConfig = {0};

  /* USER CODE BEGIN ADC_Init 1 */

  /* USER CODE END ADC_Init 1 */
  /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
  */
  hadc.Instance = ADC1;
  hadc.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
  hadc.Init.Resolution = ADC_RESOLUTION_12B;
  hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
  hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  hadc.Init.LowPowerAutoWait = DISABLE;
  hadc.Init.LowPowerAutoPowerOff = DISABLE;
  hadc.Init.ContinuousConvMode = DISABLE;
  hadc.Init.DiscontinuousConvMode = DISABLE;
  hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc.Init.DMAContinuousRequests = DISABLE;
  hadc.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  if (HAL_ADC_Init(&hadc) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure for the selected ADC regular channel to be converted.
  */
  sConfig.Channel = ADC_CHANNEL_0;
  sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
  sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure for the selected ADC regular channel to be converted.
  */
  sConfig.Channel = ADC_CHANNEL_1;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure for the selected ADC regular channel to be converted.
  */
  sConfig.Channel = ADC_CHANNEL_2;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN ADC_Init 2 */

  /* USER CODE END ADC_Init 2 */

}




Где использую
СпойлерИзображение
Изображение

Re: STM32F030 ADC

Пт сен 24, 2021 12:22:40

Когда тестил это дело (если правильно всё помню) continious всегда должны быть enabled.
Если что есть лекции на YT, всегда можно подсмотреть.
Ответить