STM32F407 ADC简介
ADC框图
ADC电压输入范围
(开发板通过跳线帽将VREF+与VDDA相连) (从原理图上得:
V
D
D
V_{DD}
VDD? = 3.3V)
ADC通道
每个ADC有2个通道组:规则通道组及注入通道组
规则通道组最多 16 个转换,必须在 ADC_SQRx 寄存器中选择转换序列的规则通道及其顺序
注入通道组最多 4 个转换
- 注入通道的转换可以打断规则通道的转换(相当于中断), 在注入通道被转换完成之后,规则通道才得以继续转换
-
触发注入
要使用触发注入,必须将 ADC_CR1 寄存器中的 JAUTO 位清零。
- 通过外部触发或将 ADC_CR2 寄存器中的 SWSTART 位置 1 来启动规则通道组转换。
- 如果在规则通道组转换期间出现外部注入触发或者 JSWSTART 位置 1,则当前的转换会复位,并且注入通道序列会切换为单次扫描模式。
- 然后,规则通道组的规则转换会从上次中断的规则转换处恢复。 如果在注入转换期间出现规则事件,注入转换不会中断,但在注入序列结束时会执行规 则序列。
注意: 使用触发注入时,必须确保触发事件之间的间隔长于注入序列。例如,如果序列长度为 30 个 ADC 时钟周期(即,采样时间为 3 个时钟周期的两次转换),则触发事件的最小间隔不能小于 31 个 ADC 时钟周期。
自动注入
? 如果将 JAUTO 位置 1,则注入组中的通道会在规则组通道之后自动转换。这可用于转换最多由 20 个转换构成的序列,这些转换在 ADC_SQRx 和 ADC_JSQR 寄存器中编程。 在此模式下,必须禁止注入通道上的外部触发。 如果 CONT 位和 JAUTO 位均已置 1,则在转换规则通道之后会继续转换注入通道。
注意: 不能同时使用自动注入和不连续采样模式
采样时间和转换时间
- 总转换时间 = 采样时间 + 转换时间
- 最小采样时间:3个周期
- 转换时间 = 12周期
- 例如:12位ADC,ADCCLK = 36MHz;则转换时间
t
=
1
36
?
1
0
6
?
12
t =\frac{1}{36*10^6}*12
t=36?1061??12
采样模式
单次转换模式
ADC仅执行一次转换
连续转换模式
ADC 结束一个转换后立即启动一个新的转换
扫描模式
此模式用于扫描一组模拟通道。
为组中的每个通道都执行一次转换。每次转换结束后,会自动转换该组中的下一 个通道
不连续采样
该模式可用于转换含有 n (n <= 8) 个转换的短序列,该短序列是在 ADC_SQRx 寄存器中选择的转换序列的一部分。可通过写入 ADC_CR1 寄存器中的 DISCNUM[2:0] 位来指定 n 的值。
出现外部触发时,将启动在 ADC_SQRx 寄存器中选择的接下来 n 个转换,直到序列中的所有转换均完成为止。
示例: n = 3,要转换的通道 = 0、1、2、3、6、7、9、10
? 第 1 次触发:转换序列 0、1、2
? 第 2 次触发:转换序列 3、6、7
? 第 3 次触发:转换序列 9、10 并生成 EOC 事件
? 第 4 次触发:转换序列 0、1、2
数据管理
使用DMA
在使能DMA模式后,每完成规则通道组中的一个通道的转换后,都会生成一个DMA请求。
进入实战
一、单通道 阻塞(轮询)模式
- 不建议用阻塞模式进行多通道采集 通道序列可能出现问题(可打开不连续模式解决)
cubemx配置
添加代码
float ADC_Value = 0;
while(1){
ADC_Value = get_adc_value_zuse();
HAL_Delay(0);
}
float get_adc_value_zuse(void){
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,50);
if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1),HAL_ADC_STATE_REG_EOC)){
return (float)HAL_ADC_GetValue(&hadc1)/4096.0*3.3;
}
else return 0;
}
运行效果
在开发板上用杜邦线将PB0与输出3.3V的I/O口相连
使用ST-Link调试,查看ADC_Value的值
二、多通道 ADC模式
多通道必须使用扫描模式
cubemx配置
添加代码
main.c
uint16_t adc_value[40];
float ad_voltage[40];
HAL_ADC_Start_DMA(&hadc1,(uint32_t *)adc_value,40);
uint16_t i;
for(i = 0;i<40;i++){
ad_voltage[i] = (float)adc_value[i]/4096.0*3.3;
HAL_Delay(0);
运行效果
使用ST-Link调试,查看ad_voltage数组的值
后记
感谢大家的阅读 如有不当或错误之处,欢迎指出
|