STM32上的电压测量

时间:2019-06-20 19:28:28

标签: c microcontroller stm32 ansi measurement

我是ANSI C @ STM32的新手,但我尝试使用分压器和模拟GPIO来测量电压(〜12V)。

我尝试过:

value = HAL_GPIO_ReadPin(VOLTAGE_GPIO_Port, VOLTAGE_Pin);

但是它总是返回0

然后我尝试使用ADC(我不知道那是必需的)

value = HAL_ADC_GetValue(&hadc1);

但仍为0。

在Arduino上,您可以轻松使用:

value = analogRead(1);

它有效。

这是ADC通道的初始化:

    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 */

}

我真的需要ADC通道吗,没有像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,更改电压不会产生任何影响

2 个答案:

答案 0 :(得分:2)

如果要尝试使用它们,则需要阅读STM32 HAL函数的文档。
您缺少诸如HAL_ADC_Start之类的一些函数调用。
HAL_ADC_GetValue仅在您告诉ADC模块开始转换然后等待其完成之后才返回新的ADC读数。

所有这些类型的操作也都在Arduino环境中发生-它们只是对您隐藏而使事情变得简单。

答案 1 :(得分:0)

brhans 是对的,但是对于来的人来说,说明有点令人困惑,例如来自 Arduino 或其他库或更简单的微控制器。

因为有很多,甚至是复杂的可能性,所以简单的转换需要更多的函数。

例如,您可以定期扫描 10 个模拟输入,将结果存储到存储器阵列中,并在整个扫描准备好唤醒您的评估例程时生成中断 - 只需从少数设置进行,无需大量代码。

在 STM32L476 上,我成功使用了以下序列(应该适用于大多数其他 STM32):

int voltsRaw;   // raw value as measured by ADC
...
HAL_ADC_Start(&hadc1);
while(HAL_ADC_GetState(&hadc1) & HAL_ADC_STATE_BUSY);
voltsRaw = HAL_ADC_GetValue(&hadc2);

如果您不需要更复杂的操作,只需编写自己的包含上述命令的“analogRead()”函数即可。我还使用数组和索引来摆脱函数调用中引脚引用的讨厌(端口/位)对。