STM32单片机中ADC模块的常规序列和注入序列

目录

一、常规序列(Regular Sequence)

1)特性

2)工作原理

3)配置步骤示例(伪代码)

二、注入序列(Injected Sequence)

1)特性

2)工作原理

3)配置步骤示例(伪代码)

三、总结


       常规序列和注入序列共用同一个结构体给成员赋值,注入序列需要额外单独设置的参数比较多,需额外设置注入序列的长度、选择外部触发来源外部触发开关的状态和配置通道两者都需要单独配置。

       在STM32单片机中,ADC(模数转换器)模块用于将模拟信号转化为数字信号。ADC模块支持两种主要的采样模式:常规序列(Regular Sequence)注入序列(Injected Sequence)。下面将详细介绍这两种序列的特性、工作原理以及配置方法。

一、常规序列(Regular Sequence)

常规序列用于常规的多通道采样,适合于需要定期监测多个输入信号的应用。

1)特性
  • 通道选择:可以配置多个输入通道,最多支持16个通道。
  • 触发方式:支持多种触发源(软件触发、外部触发、定时器触发等)。
  • 数据存储:转换后结果存储在一个FIFO寄存器数组中,用户需要从中读取数据。
  • 转换模式:支持单次转换和连续转换模式,每次触发会将所有配置的通道按顺序进行转换。
2)工作原理
  1. 初始化ADC:设置ADC的时钟源、分辨率、数据对齐方式等。
  2. 配置通道:选择和设置常规通道以及转换顺序。
  3. 启动ADC:根据触发条件开始转换,ADC按照配置的顺序对每个通道进行采样。
  4. 读取数据:通过轮询或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)工作原理
  1. 初始化ADC:设置ADC的基本参数(时钟、分辨率、对齐方式)。
  2. 配置注入通道:配置需要注入的通道,并设置每个通道的采样时间。
  3. 设置触发源:可以设置外部中断或定时器作为注入序列的触发源。
  4. 启动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);  
}  

三、总结

  • 常规序列主要用于定期、周期性的多通道采样,适合大多数实时监测应用。
  • 注入序列则用于优先级高响应时间要求严格的应用,如电池电压监测、环境变化快的情况等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你好,奋斗者!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值