1.6 ADC - 实验篇

使用 ADC 模块测电压


接线

既然是ADC有关实验, 那么我们不可避免的要使用电源进行测电压的操作

如果你在实验室, 你可以直接使用实验室的可调电源作为测量对象, 同理, 你也可以直接选用干电池


CubeMX

  • 老动作来一套之后, 在 CubeMX 中选择开启 ADC1 的 IN4 通道, 这时你会发现 PA4 亮起Pasted image 20260703210847

来到时钟树, 配置 ADC 的预分频器 PSC, 选择分频 6 倍, 因为这个 ADC 设备最高接受 14MHz 频率Pasted image 20260703233651 ## ADCs_Common_Settings

选项 含义
Mode 选择是否与其他 ADC 相互联系 Independent 表示这个 ADC1 单干不与 ADC2 联动

ADC_Settings

选项 含义
Data Alignment 数据对齐方式 DC 是 12 位,但数据寄存器 ADC_DR 是 16 位, 右对齐表示数据向右对齐, 常用右对齐.
如果左对齐, 表示数据要左移 4 位, 相当于乘 16 倍
Scan Conversion Mode 扫描模式 如果你只有一个通道直接 Disable 就行. 这里的扫描模式是指自动按顺序转换规则组里的多个通道
Continuous Conversion Mode 连续转换模式 这里我们使用代码控制每次采样, 选择关闭
关掉, 表示单次模式, 触发一次只转一次就停, 下一次再触发
打开,表示转完立刻自动开始下一次, 连续
Discontinuous Conversion Mode 把一长串通道序列拆成几个小组分别触发 这里单通道没有意义, 保持关闭即可

ADC_Regular_ConversionMode

这里有个概念: ADC 有两组转换序列, 规则组(Regular)注入组(Injected) 我们主要是用规则组

选项 含义
Enable Regular Conversions Enable / Number Of Conversion: 1 表示用规则组/序列里就 1 个通道
External Trigger Conversion Source Regular Conversion launched by software 表示转换由软件触发
如果你想使用硬件事件比如让定时器自动启用 ADC, 在这里配置
Rank 1, Channel 4 Rank 是通道在序列里的位置 这里表示第 1 位放 Channel 4
Sampling Time 采样时间 采样时间是采样保持电容充电的 ADC 时钟周期数, 越长对高阻抗信号越准但越慢

一次完整转换耗时 = 采样时间 + 12.5 个ADCCLK周期(12 位精度固定是 12.5周期), 所以这里是 1.5 + 12.5 = 14 个 ADCCLK 周期

Injected Conversions:

Disable 注入组能抢占规则组, 像 ADC 内部的中断一样, 用于必须在特定时刻插入的关键测量, 这里不用

Analog WatchDog:

不勾 模拟看门狗盯着转换值有没有超出你设的上下限阈值, 超了直接产生中断, 在做过压/欠压保护时才用, 这里不用

写代码

在CubeMX里面生成代码之后打开 Clion

在 PV 中声明 ADC 值获取变量

1
2
3
/* USER CODE BEGIN PV */  
uint16_t ADC_Val;
/* USER CODE END PV */

主程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/* Infinite loop */  
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 50);
if (HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))
{
ADC_Val = HAL_ADC_GetState(&hadc1);
}
HAL_Delay(500);
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */}
/* USER CODE END 3 */


效果

打上断点开始调试, 我们发现在PA4 接GND 的时候, ADC_Val的值稳定在 0 Pasted image 20260704001501 接上一节干电池, 数值稳定在1616 左右, 与 1.5v 的干电池相符Pasted image 20260704001617