STM32ADC采集规则组和注入组

规则组和注入组简介

在 STM32 的 ADC 模块中,规则组(Regular Group)和 注入组(Injected Group)是两种不同的 ADC 转换模式,分别用于处理不同优先级和触发条件下的 ADC 转换需求。

规则组(Regular Group)

定义

规则组用于 常规的 ADC 转换任务。规则组可以包含多个通道(从通道 0 到 18,具体通道数量取决于 STM32 的型号),并按预先配置的顺序依次完成这些通道的转换。

特点
  • 低优先级
    • 相对于注入组,规则组的优先级较低。当注入组被触发时,规则组的转换会被暂停。
  • 支持多通道转换
    • 规则组可以按照用户配置的序列(ADC_SQRx 寄存器)依次完成多个通道的转换。
  • 触发方式灵活
    • 规则组支持软件触发(手动启动转换)和硬件触发(例如定时器、外部事件等)。
  • 支持连续转换
    • 规则组支持循环模式(Continuous Conversion Mode),可以不断循环采样。
  • 数据读取
    • 每次转换结果存储在 ADC_DR 寄存器中,可以通过 EOC(End of Conversion)标志或 DMA 传输读取数据。

规则组的配置
  1. 选择规则组通道数量
    • 配置规则组序列的通道数量(L[3:0],位于 ADC_SQR1 寄存器中)。
    • L 决定规则组中通道的数量。例如 L = 2 表示规则组包含 3 个通道(通道编号从 0 开始计数)。
  2. 设置规则组序列
    • 配置每个通道的顺序,使用 ADC_SQR1ADC_SQR2ADC_SQR3 寄存器。
    • 每个通道编号占用 5 位(支持 0 到 18 通道)。
  3. 选择触发方式
    • 软件触发:通过设置 ADC_CR 寄存器中的 ADSTART 位启动规则组转换。
    • 硬件触发:配置 ADC_CFGR 寄存器的触发源(例如定时器或外部事件)。
  4. 选择采样时间
    • 每个通道的采样时间可以单独配置,使用 ADC_SMPRx 寄存器。
  5. 启用 DMA(可选)
    • 如果规则组是多通道转换,建议使用 DMA 将转换结果传输到内存。

规则组的数据读取
  • 每次通道转换完成后,转换结果存储在 ADC_DR 寄存器中。
  • 如果是多通道序列,DMA 会自动将每次转换结果存储到内存。
  • 在中断模式下,可以通过 EOC(End of Conversion)或 EOS(End of Sequence)中断读取数据。

规则组的应用场景
  • 处理周期性或低优先级的 ADC 转换任务。
  • 使用定时器或软件触发来采集传感器数据,例如温度传感器、光线传感器等。
  • 多通道采集时,通过规则组进行顺序采样并配合 DMA 自动处理数据。

注入组(Injected Group)

定义

注入组是一种 高优先级的 ADC 转换任务,通常用于实时性要求较高的场景。注入组可以包含多个通道,但优先级高于规则组,在触发时可以立即中断规则组的转换。

特点
  • 高优先级
    • 相对于规则组,注入组具有更高的优先级。当注入组被触发时,会立即中断规则组的转换。
  • 支持多通道转换
    • 注入组同样支持多通道(最多 4 个通道),可以按用户配置的顺序依次采样。
  • 独立的触发源
    • 注入组需要单独配置触发源,支持外部触发和软件触发。
  • 单独的数据存储
    • 注入组的转换结果存储在独立的 ADC_JDRx 寄存器中。
  • 无连续模式
    • 注入组只支持单次转换,不支持循环模式(不能像规则组那样自动重复转换)。

注入组的配置
  1. 选择注入组通道数量
    • 注入组最多支持 4 个通道,配置方式通过 JSQR 寄存器(注入序列寄存器)。
  2. 设置注入组序列
    • 使用 ADC_JSQR 配置注入组的通道顺序和数量。
  3. 选择触发方式
    • 软件触发:通过设置 JADSTART 位启动注入组转换。
    • 硬件触发:通过外部事件(如定时器、GPIO 中断)触发。
  4. 采样时间配置
    • 注入组的采样时间与规则组共享(通过 ADC_SMPRx 配置)。
  5. 启用自动注入(可选):
    • 如果需要规则组和注入组同时工作,可以开启自动注入模式(在规则组转换时插入注入组转换)。

注入组的数据读取
  • 每个通道的转换结果存储在独立的 ADC_JDRx 寄存器中(x 表示通道序号)。
  • 注入组的转换完成后,会触发 JEOC(注入通道转换完成)或 JEOS(注入序列完成)中断。

注入组的应用场景
  • 处理实时性要求较高的 ADC 转换任务,例如电机控制中的电流采样。
  • 在规则组转换过程中,插入紧急或高优先级的采样任务。
  • 需要外部触发的特殊采样任务,例如检测某个信号达到特定阈值时的采样。

规则组和注入组的对比

属性规则组(Regular Group)注入组(Injected Group)
优先级
触发方式软件触发或硬件触发软件触发或外部触发
转换序列支持多通道(最多 16 个)支持多通道(最多 4 个)
连续模式支持连续转换不支持连续转换
转换结果寄存器ADC_DRADC_JDRx
中断EOC(单次完成),EOS(序列完成)JEOC(单次完成),JEOS(序列完成)
采样时间配置独立配置每个通道与规则组共享
主要应用场景常规采样任务,如传感器数据采集实时性强的任务,如电机电流采样

规则组与注入组的结合使用

在某些复杂的场景中,可以将规则组和注入组结合使用:

  • 规则组:处理周期性或低优先级任务,采集传感器数据。
  • 注入组:处理紧急或高优先级任务,例如外部触发的信号采集。
    结合使用时,注入组可以在规则组转换过程中被触发,并插入转换任务。转换完成后,规则组会继续执行未完成的转换。

总结

  • 规则组 是常规任务的首选,适合需要多通道连续转换或定期采样的场景。
  • 注入组 是高优先级任务的首选,适合实时性要求高、需要外部事件触发的采样任务。
  • 它们各自独立又可以协同工作,通过合理配置,可以满足复杂应用中的各种 ADC 转换需求。

如有侵权,联系删除

### STM32 ADC 注入配置与使用 STM32ADC 模块支持两种工作模式:常规模式注入模式。注入模式主要用于高优先级的任务,可以在不影响常规转换的情况下执行额外的转换操作。 #### 1. 原理概述 ADC 注入模式允许用户定义一独立于常规通道的特殊通道进行转换。这些通道可以被触发并中断处理,而不会干扰常规通道的操作流程[^1]。通过设置相应的寄存器,可以指定哪些通道属于注入以及它们的采样时间序列位置。 #### 2. 配置过程 为了启用配置 ADC注入功能,通常需要完成以下几个方面的设定: - **选择 ADC 模块**: 确定要使用的具体 ADC 实例 (如 `ADC1`, `ADC2` 等)[^2]。 - **选择注入通道**: 定义哪个物理输入端口作为注入通道的一部分。 - **排列顺序与采样时间**: 设置每个注入通道在其序列中的排名 (`Rank`) 所需的采样周期长度(`Sample Time`)[^2]。 以下是基于 HAL 库的一个典型初始化函数片段来展示如何配置上述参数: ```c // 初始化结构体变量声明 ADC_HandleTypeDef hadc; void MX_ADC_Init(void){ // ADC 结构体成员赋初值... // 启用时钟信号给对应外设 __HAL_RCC_ADC_CLK_ENABLE(); // 调整分辨率、数据对齐方式等全局属性 hadc.Instance = ADC1; hadc.Init.Resolution = ADC_RESOLUTION_12B; hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc.Init.ScanConvMode = DISABLE; // 单次转换而非扫描多个通道 hadc.Init.ContinuousConvMode = ENABLE;// 连续转换开启 hadc.Init.NbrOfConversion = 1; // 只有一个常规通道待测 hadc.Init.DiscontinuousConvMode = DISABLE; hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc.Init.DMAContinuousRequests = DISABLE; hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV; if(HAL_ADC_Init(&hadc)!= HAL_OK){ // 如果失败则错误处理} } /* 添加注入通道 */ void AddInjectedChannel(){ /* 参数解释: - &hadc: 已经初始化完毕的目标对象指针; - ADC_CHANNEL_xxx: 表明实际硬件连接所对应的模拟量入口编号; - RANK_INJECTED_Y: 插槽Y处安排此新加入项; - SAMPLING_TIME_ZZZus: 设定采集持续时间段为Z毫秒级别单位*/ HAL_StatusTypeDef status= HAL_ADC_ConfigChannel(&hadc, &(ADC_ChannelConfTypeDef ){ .Channel = ADC_CHANNEL_TEMPSENSOR , .Rank = ADC_RANK_INJECTED_SEQ1 , .SamplingTime = ADC_SAMPLETIME_28CYCLES }); if(status != HAL_OK ) { /* 错误管理 */} } ``` 以上代码展示了如何利用 HAL 函数接口去增加一个新的注入型测量路径至现有的 ADC 架构之中。 #### 3. 测试验证 最后一步就是编写应用程序逻辑部分来进行测试确认整个系统的正常运作状况。这可能涉及到启动一次性的手动请求或者绑定外部事件源自动激发机制等等不同策略的选择应用上。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Flocx

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

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

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

打赏作者

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

抵扣说明:

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

余额充值