1.6 ADC - 实验篇
1.6 ADC - 实验篇
Sarzn使用 ADC 模块测电压
接线
既然是ADC有关实验, 那么我们不可避免的要使用电源进行测电压的操作
如果你在实验室, 你可以直接使用实验室的可调电源作为测量对象, 同理, 你也可以直接选用干电池
CubeMX
- 老动作来一套之后, 在 CubeMX 中选择开启 ADC1 的 IN4 通道,
这时你会发现 PA4
亮起
来到时钟树, 配置 ADC 的预分频器 PSC, 选择分频 6 倍, 因为这个 ADC
设备最高接受 14MHz
频率
| 选项 | 含义 | |
|---|---|---|
| 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






