STM32F407 ADC——电压采集和温度测量

本文详细解释了STM32F4的ADC电压采集过程,涉及参数设置(如分辨率、扫描模式、转换顺序等)、软件触发、温度测量计算方法,并介绍了如何在Keil中编写实现代码。同时讨论了ADC的工作原理,包括数据处理和中断机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ADC——电压采集

初始化参数解析

首先在CubeMx当中新建工程,设置一些初始化的参数,具体如下图所示。

在这里插入图片描述
下面具体解释一下。
ADC_Resolution:配置ADC的分辨率,可选的分辨率有12位、10位、8位和6位。分辨率越高,AD转换数据精度越高,转换时间也越长;分辨率越低,AD转换数据精度越低,转换时间也越短。
ScanConvMode:可选参数为ENABLE和DISABLE,配置是否使用扫描。如果是单通道AD转换使用DISABLE,如果是多通道AD转换使用ENABLE。
ADC_ContinuousConvMode:可选参数为ENABLE和DISABLE,配置是启动自动连续转换还是单次转换。如果设置为DISABLE,则是单次转换。两者的区别在于连续转换直到所有的数据转换完成后才停止转换,而单次转换则只转换一次数据就停止,要再次触发转换才可以。所以如果需要一次性采集1024个数据或者更多,则采用连续转换。
ADC_ExternalTrigConvEdge:外部触发极性选择,如果使用外部触发,可以选择触发的极性,可选有禁止触发检测、上升沿触发检测、下降沿触发检测以及上升沿和下降沿均可触发检测。
ADC_ExternalTrigConv:外部触发选择。可根据项目需求配置触发来源。实际上,我们一般使用软件自动触发。软件触发当设置开始转换时ADC会立即启动转换,硬件触发则需要等待指定的外部事件发生时ADC才会启动转换。
ADC_DataAlign:转换结果数据对齐模式,可选右对齐ADC_DataAlign_Right或者左对齐ADC_DataAlign_Left。一般我们选择右对齐模式。
ADC_NbrOfChannel:AD转换通道数目。
ADC_Mode:ADC工作模式选择,有独立模式、双重模式以及三重模式。
ADC_Prescaler:ADC时钟分频系数选择,ADC时钟是有PCLK2分频而来,分频系数决定ADC时钟频率,可选的分频系数为2、4、6和8。
ADC_DMAAccessMode:DMA模式设置,只有在双重或者三重模式才需要设置,可以设置三种模式,具体可参考参考手册说明。
ADC_TwoSamplingDelay:2个采样阶段之前的延迟,仅适用于双重或三重交错模式。

一般过程

在CubeMx当中设置完初始参数之后,在keil当中编写代码。

 while (1)
  {
   
   
	HAL_ADC_Start(&hadc1);  //开启ADC转换
	HAL_ADC_PollForConversion(&hadc1,50);  //等待ADC转换结束
	if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC)) //获取转换状态
		{
   
   
			Voltage = ((float
### 使用 STM32F407 HAL 库实现 ADC 光照强度采集 #### 配置 CubeMX 工具 为了简化硬件初始化过程,推荐使用 ST 提供的CubeMX工具来配置外设参数。对于光照传感器的应用场景,在CubeMX中设置如下: - **ADC模块**:选择所需的ADC通道用于连接光敏电阻或其他类型的光照传感器。 - **采样时间**:根据具体需求调整采样时间长度,通常建议至少为默认值以上以获得更稳定的读数[^3]。 #### 初始化函数生成 完成上述配置后,点击“Generate Code”,CubeMX会自动生成必要的初始化代码片段以及中断服务程序框架。这些文件包含了对所选设备资源的基础设定。 #### 编写应用层逻辑 接下来是在`main.c`或者其他合适位置加入实际业务处理部分。下面给出一段简单的例子展示如何利用HAL库获取来自指定ADC通道上的模拟量输入并将其转化为代表光照强度数值的形式。 ```c #include "stm32f4xx_hal.h" // 声明全局变量保存测量结果 uint32_t adc_raw_value; float light_intensity; int main(void){ /* MCU Configuration */ // 系统时钟初始化 SystemClock_Config(); // GPIO初始化 MX_GPIO_Init(); // ADC初始化 MX_ADC1_Init(); while (1){ // 启动一次转换 HAL_ADC_Start(&hadc1); // 等待转换结束 if(HAL_OK == HAL_ADC_PollForConversion(&hadc1, 10)){ // 获取原始AD值 adc_raw_value = HAL_ADC_GetValue(&hadc1); // 将AD值映射到物理单位(这里假设满量程对应最大亮度) light_intensity = ((float)adc_raw_value / 4095.0)*100; // 百分比表示 // 执行其他操作... // 插入延时保持循环节奏稳定 HAL_Delay(1000); } } } ``` 这段代码展示了基本的工作流程——启动ADC转换、等待其完成、取得结果并将之转换成易于理解的形式(如百分比),最后还可以在此基础上添加更多功能比如通过串口发送数据给PC端显示等。 #### 注意事项 当涉及到具体的电路设计时,请务必查阅相关器件手册确认供电电压范围、接口电平兼容性等问题;另外考虑到环境因素可能带来的影响,适当增加滤波措施也是有益处的。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值