我是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返回值,但看起来像是随机数...输入电压不变,并返回各种数据。
尝试1:1,但始终品脱0x3E,更改电压不会产生任何影响
答案 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()”函数即可。我还使用数组和索引来摆脱函数调用中引脚引用的讨厌(端口/位)对。