目录
常规序列和注入序列共用同一个结构体给成员赋值,注入序列需要额外单独设置的参数比较多,需额外设置注入序列的长度、选择外部触发来源。外部触发开关的状态和配置通道两者都需要单独配置。
在STM32单片机中,ADC(模数转换器)模块用于将模拟信号转化为数字信号。ADC模块支持两种主要的采样模式:常规序列(Regular Sequence)和注入序列(Injected Sequence)。下面将详细介绍这两种序列的特性、工作原理以及配置方法。
一、常规序列(Regular Sequence)
常规序列用于常规的多通道采样,适合于需要定期监测多个输入信号的应用。
1)特性
- 通道选择:可以配置多个输入通道,最多支持16个通道。
- 触发方式:支持多种触发源(软件触发、外部触发、定时器触发等)。
- 数据存储:转换后结果存储在一个FIFO寄存器数组中,用户需要从中读取数据。
- 转换模式:支持单次转换和连续转换模式,每次触发会将所有配置的通道按顺序进行转换。
2)工作原理
- 初始化ADC:设置ADC的时钟源、分辨率、数据对齐方式等。
- 配置通道:选择和设置常规通道以及转换顺序。
- 启动ADC:根据触发条件开始转换,ADC按照配置的顺序对每个通道进行采样。
- 读取数据:通过轮询或DMA等方式读取转换后的结果。
3)配置步骤示例(伪代码)
// 步骤1: 初始化ADC
ADC_InitTypeDef ADC_InitStruct;
ADC_CommonInitTypeDef ADC_CommonInitStruct;
ADC_CommonInit(&ADC_CommonInitStruct);
ADC_Init(&ADC_InitStruct);
// 步骤2: 配置常规通道
ADC_ChannelConfig(ADC1, ADC_CHANNEL_1, ADC_SAMPLETIME_1_5); // 配置通道1的采样时间
ADC_ChannelConfig(ADC1, ADC_CHANNEL_2, ADC_SAMPLETIME_1_5); // 配置通道2的采样时间
// 步骤3: 启动ADC
ADC_Start(ADC1);
// 步骤4: 读取数据
if (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) != RESET) {
uint32_t adcValue = ADC_GetConversionValue(ADC1);
}
二、注入序列(Injected Sequence)
注入序列用于优先级高的、需要快速响应的采样,适合敏感的信号监测。
1)特性
- 优先级:注入序列具有比常规序列更高的优先级,可在常规转换期间中断并快速执行。
- 通道数量:支持最多4个注入通道。
- 独立触发:注入序列可以由独立的触发源激活(例如外部中断)。
- 数据存储:注入序列的结果与常规序列的数据分开存储。
2)工作原理
- 初始化ADC:设置ADC的基本参数(时钟、分辨率、对齐方式)。
- 配置注入通道:配置需要注入的通道,并设置每个通道的采样时间。
- 设置触发源:可以设置外部中断或定时器作为注入序列的触发源。
- 启动ADC:开始常规转换,并在特定事件触发时执行注入转换。
3)配置步骤示例(伪代码)
// 步骤1: 初始化ADC
ADC_InitTypeDef ADC_InitStruct;
ADC_CommonInitTypeDef ADC_CommonInitStruct;
ADC_CommonInit(&ADC_CommonInitStruct);
ADC_Init(&ADC_InitStruct);
// 步骤2: 配置注入通道
ADC_ChannelConfig(ADC1, ADC_CHANNEL_3, ADC_SAMPLETIME_1_5); // 配置通道3的采样时间
ADC_ChannelConfig(ADC1, ADC_CHANNEL_4, ADC_SAMPLETIME_1_5); // 配置通道4的采样时间
// 步骤3: 设置注入触发源
ADC_SetTrigger(ADC1, EXTERNAL_TRIGGER);
// 步骤4: 启动常规ADC
ADC_Start(ADC1);
// 步骤5: 触发注入序列
if (external_event_triggered) {
ADC_StartInject(ADC1); // 启动注入序列
}
// 步骤6: 读取数据
if (ADC_GetFlagStatus(ADC1, ADC_FLAG_JEOC) != RESET) {
uint32_t injectedValue = ADC_GetInjectedConversionValue(ADC1);
}
三、总结
- 常规序列主要用于定期、周期性的多通道采样,适合大多数实时监测应用。
- 注入序列则用于优先级高、响应时间要求严格的应用,如电池电压监测、环境变化快的情况等。