Измерение напряжения на STM32 - PullRequest
0 голосов
/ 20 июня 2019

Я новичок в ANSI C @ STM32, но я попытался измерить напряжение (~ 12 В) с помощью делителя напряжения и аналогового GPIO.

Я пытался:

value = HAL_GPIO_ReadPin(VOLTAGE_GPIO_Port, VOLTAGE_Pin);

Но он всегда возвращает 0

Затем я пытался использовать АЦП (я не знаю, что это требуется)

value = HAL_ADC_GetValue(&hadc1);

Но все равно 0.

На Arduino вы можете просто использовать:

value = analogRead(1);

И это работает.

Вот инициализация канала АЦП:

    static void MX_ADC1_Init(void)
{

  /* USER CODE BEGIN ADC1_Init 0 */

  /* USER CODE END ADC1_Init 0 */

  ADC_ChannelConfTypeDef sConfig = {0};

  /* USER CODE BEGIN ADC1_Init 1 */

  /* USER CODE END ADC1_Init 1 */
  /** Common config 
  */
  hadc1.Instance = ADC1;
  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc1.Init.ContinuousConvMode = DISABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 1;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Regular Channel 
  */
  sConfig.Channel = ADC_CHANNEL_15;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN ADC1_Init 2 */

  /* USER CODE END ADC1_Init 2 */

}

Действительно ли мне нужен канал АЦП, нет ли «простого» аналогового входа, такого как Arduino?

Я знаю, что мне нужно разделить входящее значение, чтобы получить правильное напряжение, но в данный момент я не получаю никаких данных обратно.

MCU - это STM32F107VCT7

РЕДАКТИРОВАТЬ:

Теперь попробовал следующее:

HAL_ADC_Start(&hadc1);
  if (HAL_ADC_PollForConversion(&hadc1, 1000000) == HAL_OK)
          {
  g_ADCValue = HAL_ADC_GetValue(&hadc1);

          }
  HAL_Delay(500);

Теперь g_ADCValue возвращает значения, но выглядит как случайные числа ...Входное напряжение не изменяется и получает различные данные обратно.

Обнаружил, что код: https://hackaday.io/project/4277-stm32f030f4p6-breakout-board/log/13897-printing-adc-values-over-uart

Пробовал 1: 1, но он всегда пинта 0x3E, изменяя напряжение, чтобы не иметь никакого эффекта

1 Ответ

2 голосов
/ 20 июня 2019

Вам необходимо прочитать документацию по функциям STM32 HAL, если вы собираетесь их использовать.
Вам не хватает некоторых вызовов функций, таких как HAL_ADC_Start.
HAL_ADC_GetValue вернет тольконовое чтение АЦП после того, как вы сказали модулю АЦП начать преобразование, а затем ожидали его завершения.

Все эти виды операций также происходят в среде Arduino - они просто скрыты от вас, чтобы упростить задачу.

...