STM32如何实现输入捕获功能

发布时间:2021-12-27 11:35:18 作者:小新
来源:亿速云 阅读:787
# STM32如何实现输入捕获功能

## 1. 输入捕获功能概述

输入捕获(Input Capture)是STM32定时器的重要功能之一,主要用于精确测量外部信号的脉冲宽度、周期或频率。其工作原理是:当检测到输入引脚上的特定边沿(上升沿或下降沿)时,定时器会立即将当前计数器的值捕获到特定的寄存器中,同时可以触发中断或DMA请求。

### 1.1 典型应用场景
- 测量PWM信号占空比
- 红外遥控信号解码
- 旋转编码器信号处理
- 超声波测距(测量回波时间)

## 2. STM32定时器的输入捕获架构

### 2.1 相关寄存器
1. **TIMx_CCMR1/2**:输入捕获模式配置
2. **TIMx_CCER**:捕获/比较使能
3. **TIMx_CCRx**:捕获/比较寄存器
4. **TIMx_DIER**:中断使能寄存器
5. **TIMx_SR**:状态寄存器

### 2.2 硬件连接原理
```c
[外部信号] --> [GPIO引脚] --> [定时器输入通道]
                      ↑
               [边沿检测电路]
                      ↓
           [捕获寄存器(TIMx_CCRx)]

3. 输入捕获配置步骤详解

3.1 GPIO初始化

以TIM2_CH1(PA0)为例:

GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();

GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

3.2 定时器基础配置

TIM_HandleTypeDef htim2;

htim2.Instance = TIM2;
htim2.Init.Prescaler = 71;                // 72MHz/(71+1)=1MHz计数频率
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 0xFFFF;               // 16位最大值
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_IC_Init(&htim2);

3.3 输入捕获通道配置

TIM_IC_InitTypeDef sConfigIC;

sConfigIC.ICPolarity = TIM_ICPOLARITY_RISING; // 上升沿捕获
sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;      // 不分频
sConfigIC.ICFilter = 0x0;                    // 不滤波
HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1);

3.4 中断配置(可选)

HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM2_IRQn);
__HAL_TIM_ENABLE_IT(&htim2, TIM_IT_CC1);

3.5 启动捕获

HAL_TIM_IC_Start(&htim2, TIM_CHANNEL_1);
// 或使用中断模式
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);

4. 输入捕获模式详解

4.1 单边沿捕获模式

仅捕获一种边沿(上升沿或下降沿),适合测量低频信号周期。

测量周期公式

周期 = (第二次捕获值 - 第一次捕获值) * (1/定时器时钟频率)

4.2 双边沿捕获模式(PWM输入模式)

// 配置两个通道协同工作
sConfigIC.ICPolarity = TIM_ICPOLARITY_RISING;
HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1);

sConfigIC.ICPolarity = TIM_ICPOLARITY_FALLING;
HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_2);

占空比计算

占空比 = (下降沿捕获值 - 上升沿捕获值) / 周期值 * 100%

5. 高级应用技巧

5.1 捕获溢出处理

当信号周期超过定时器自动重装载值时:

// 在中断处理中添加溢出计数
void TIM2_IRQHandler(void) {
    if(__HAL_TIM_GET_FLAG(&htim2, TIM_FLAG_UPDATE)) {
        overflowCount++;
        __HAL_TIM_CLEAR_FLAG(&htim2, TIM_FLAG_UPDATE);
    }
    // ...其他中断处理
}

5.2 数字滤波配置

通过TIMx_CCMRx寄存器中的ICF位可配置数字滤波器:

sConfigIC.ICFilter = 0x6; // 6个时钟周期滤波

5.3 使用DMA传输捕获数据

HAL_TIM_IC_Start_DMA(&htim2, TIM_CHANNEL_1, (uint32_t*)captureBuffer, BUFFER_SIZE);

6. 实际应用示例:测量PWM频率和占空比

6.1 硬件连接

6.2 完整代码实现

// 变量定义
volatile uint32_t IC_Value1 = 0, IC_Value2 = 0;
volatile uint32_t DutyCycle = 0, Frequency = 0;

// 中断处理
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) {
    if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) {
        if(Is_First_Captured == 0) {
            IC_Value1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
            Is_First_Captured = 1;
            // 切换为下降沿捕获
            __HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_ICPOLARITY_FALLING);
        } else {
            IC_Value2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
            __HAL_TIM_SET_COUNTER(htim, 0);
            
            if(IC_Value2 > IC_Value1) {
                DutyCycle = (IC_Value2 - IC_Value1) * 100 / htim->Instance->ARR;
                Frequency = HAL_RCC_GetPCLK1Freq() / (htim->Instance->PSC * htim->Instance->ARR);
            }
            Is_First_Captured = 0;
            // 恢复上升沿捕获
            __HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_ICPOLARITY_RISING);
        }
    }
}

7. 常见问题与解决方案

7.1 捕获值不准确

7.2 无法触发捕获中断

7.3 高频信号测量误差大

8. 性能优化建议

  1. 时钟源选择:使用内部时钟同步模式提高精度
  2. DMA应用:对于高频采样,使用DMA减少CPU开销
  3. 定时器级联:超长周期测量时可级联多个定时器
  4. 硬件滤波:配合外部RC电路提高信号质量

9. 不同STM32系列的差异说明

特性 F1系列 F4/F7系列 H7系列
最大捕获频率 72MHz 168MHz 480MHz
滤波器级数 4位 8位 8位
专用PWM输入模式 仅高级定时器 所有定时器 所有定时器

10. 总结

STM32的输入捕获功能为精确时间测量提供了灵活的硬件解决方案。通过合理配置定时器和相关外设,开发者可以实现从简单脉冲测量到复杂PWM分析的各种应用。掌握输入捕获技术将大大增强嵌入式系统对外部信号的处理能力。

关键点回顾: 1. 正确配置GPIO复用功能是基础 2. 定时器时钟配置直接影响测量精度 3. 中断/DMA处理可提高系统效率 4. 结合溢出处理可扩展测量范围 “`

注:本文约2950字,采用Markdown格式编写,包含代码示例、配置步骤和实用技巧。实际使用时可根据具体STM32型号调整寄存器配置。

推荐阅读:
  1. MongoDB 实现currentOp定时捕获
  2. java实现输入数据功能

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

stm32

上一篇:STM32触摸按键的示例分析

下一篇:C语言怎么绘制圣诞水晶球

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》