Я новичок в 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, изменяя напряжение, чтобы не иметь никакого эффекта