stm32f4ADC读取电压
时间: 2025-02-08 20:54:02 浏览: 31
### 使用STM32F4进行ADC电压读取
对于使用STM32F4微控制器执行ADC电压读取的任务,可以采用DMA方式来高效处理多通道的数据采集。下面是一个完整的例子,展示了如何配置并实现这一功能。
#### 配置HAL库初始化函数
首先,在`main.c`文件中的`MX_ADC_Init()`函数里完成ADC模块的基础设定:
```c
static void MX_ADC1_Init(void)
{
ADC_ChannelConfTypeDef sConfig = {0};
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.ScanConvMode = ENABLE; // Enable scan to convert multiple channels
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 2; // Number of conversions in the sequence
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}
/** Configure Regular Channel */
sConfig.Channel = ADC_CHANNEL_1; // Select channel for first conversion
sConfig.Rank = 1; // Position within group regular sequencer
sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
sConfig.Channel = ADC_CHANNEL_2; // Second channel configuration
sConfig.Rank = 2;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
}
```
这段代码设置了ADC的工作参数,并指定了要使用的模拟输入通道[^1]。
#### DMA传输回调函数
为了提高效率,利用DMA自动将转换后的数据转移到内存缓冲区中。当一次完整的DMA传输完成后会触发回调事件,可以在该事件处理器内获取最新的测量结果:
```c
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
static uint32_t DataBuffer[2];
uint32_t Volt1, Volt2;
/* Copy data from buffer into variables */
memcpy(DataBuffer, AdcDmaBuffer, sizeof(uint32_t)*2);
/* Calculate voltages based on reference voltage Vref+ which is typically 3.3V or 3300mV */
Volt1 = ((uint32_t)(DataBuffer[0]) * 3300UL) >> 12;
Volt2 = ((uint32_t)(DataBuffer[1]) * 3300UL) >> 12;
printf("Volt1:%lu mV, Volt2:%lu mV\r\n", Volt1, Volt2);
}
```
这里假设系统的参考电压为3.3伏特(即3300毫伏),通过移位操作简化了除法运算过程以获得更精确的结果[^2]。
#### 主循环逻辑
最后,在主程序的无限循环部分启动ADC转换流程即可:
```c
int main(void)
{
...
while (1)
{
if(HAL_ADC_Start_DMA(&hadc1, (uint32_t*)AdcDmaBuffer, 2)!= HAL_OK){
Error_Handler();
}
// Wait until next trigger condition occurs...
}
}
```
上述方法能够有效地从两个不同的传感器上连续不断地收集信号强度信息,并将其转化为易于理解的形式输出给用户查看。
阅读全文
相关推荐


















