STM32高级控制定时器之输入捕获模式

目录

概述

[1 输入捕获模式](#1 输入捕获模式)

[1.1 原理介绍](#1.1 原理介绍)

[1.2 实现步骤](#1.2 实现步骤)

[1.3 发生输入捕获流程](#1.3 发生输入捕获流程)

[2 使用STM32Cube配置工程](#2 使用STM32Cube配置工程)

[2.1 软件环境](#2.1 软件环境)

[2.2 配置参数](#2.2 配置参数)

[2.3 生成项目文件](#2.3 生成项目文件)

[3 功能实现](#3 功能实现)

[3.1 PWM调制占空比函数](#3.1 PWM调制占空比函数)

[3.2 应用函数库](#3.2 应用函数库)

[4 测试](#4 测试)

[4.1 功能框图](#4.1 功能框图)

[4.2 运行结果](#4.2 运行结果)


源代码下载地址:

stm32-f103-rct6-输入捕获测试代码资源-CSDN文库

概述

本文主要介绍STM32高级定时器的用法至输入捕获功能,该功能可用于捕捉外部输入信号的频率。笔者通过详细的案例介绍这个功能,包括理论知识,实现原理,以及如何使用STM32Cube配置基本的参数,编写实用代码,实现捕捉频率当的功能。

1 输入捕获模式

1.1 原理介绍

在输入捕获模式下,捕获/比较寄存器(TIMx_CCRx )用于锁存在由相应的ICx信号检测到的转变之后的计数器的值 。当发生捕获,相应的CCXIF 标志(TIMx_SR 寄存器)被设置,并且中断或

如果它们被启用,则可以发送DMA请求。如果在CCxIF标志为则过捕获标志CCxOF(TIMx_SR寄存器)被设置。CCxIF可以是软件通过将其写入"0"或读取存储在中的捕获数据来清除TIMx_CCRx寄存器。CCxOF在写入"0"时被清除。

1.2 实现步骤

以下示例显示如何在TI1时捕获TIMx_CCR1中的计数器值投入增加。要执行此操作,请使用以下步骤:

1) 选择激活输入:TIMx_CCR1必须连接到TI1输入,因此写入CC1S位到TIMx_ CCMR1寄存器中的01。一旦CC1S变得与00不同,通道被配置在输入端并且TIMx_ CCR1寄存器变为只读。

2) 针对连接到的信号编程所需的输入滤波器持续时间定时器(如果输入是TIx输入,则通过在TIMx_CCMRx寄存器中编程ICxF位)。让我们想象一下,当切换时,输入信号在at must five期间不稳定内部时钟周期。我们必须编程一个比这五个时钟更长的滤波器持续时间循环。当8个连续样本具有新的已经检测到电平(以fDTS频率采样)。然后将IC1F位写入中的0011

CCMR1寄存器。

3) 通过将CC1P位写入0,选择TI1通道上活动转换的边缘CCER寄存器(在这种情况下为上升沿)。

4) 对输入预分频器进行编程。在我们的示例中,我们希望捕获在每个有效转换,因此预分频器被禁用(将IC1PS位写入TIMx_CCMR1寄存器)

5 ) 通过在中设置CC1E位,启用从计数器到捕获寄存器的捕获TIMx_CCER寄存器。

6 ) 如果需要,通过在中设置CC1IE位来启用相关的中断请求TIMx_DIER寄存器和/或DMA请求,通过在TIMx_DIER寄存器。

1.3 发生输入捕获流程

为了处理过度捕获,建议在过度捕获标志。这是为了避免错过阅读后可能发生的过度捕获

标志和读取数据之前。

1) TIMx_CCR1寄存器在激活转换时获取计数器的值。

2)CC1IF标志被设置(中断标志)。如果至少有两次连续捕获,也会设置CC1OF发生,而标志未被清除。

3)根据CC1IE位生成中断

4)根据CC1DE位生成DMA请求

注意问题:

IC中断和/或DMA请求可以由软件通过设置EGR寄存器中相应的CCxG位。

2 使用STM32Cube配置工程

2.1 软件环境

软件名称 版本信息
STM32Cube STM32CubeMX 6.11
STM32 HAL STM32Cube_FW_F1_V1.8.5

2.2 配置参数

1)配置系统时钟:72M Hz,Timer的工作时钟为72M Hz

  1. 使用定时器1配置输入捕获功能

其对应的IO口配置

计数器时钟参数和捕获通道参数

3)配置PWM相关参数

选择定时器8作为控制PWM的输出

PWM波对应的IO接口

Timer-8定时器相关参数

和PWM相关的参数配置

2.3 生成项目文件

使用STM32FCube完成项目配置后,就可以生成工程文件。生成代码如下:

3 功能实现

3.1 PWM调制占空比函数

tim.c中实现一个函数,其用于实现调制PWM的占空比。函数原型如下:

cpp 复制代码
void HAL_TIM_SetPWM_Pulse( uint32_t Pulse, uint32_t Channel)
{
  TIM_OC_InitTypeDef sConfigOC = {0};
  
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = Pulse;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  if (HAL_TIM_PWM_ConfigChannel(&htim8, &sConfigOC, Channel) != HAL_OK)
  {
    Error_Handler();
  }
}

3.2 应用函数库

创建App/product目录,实现应用函数。

1)pwm_ctrl.c 实现pwm的功能控制

2)input_capture.c 实现捕捉功能

1) 在 pwm_ctrl.c文件中配置PWM的占空比

cpp 复制代码
void pwm_ctrl_Init( void )
{
    HAL_TIM_Base_Start( &htim8 );
    HAL_TIM_PWM_Start( &htim8, TIM_CHANNEL_1);  // PC6 
    HAL_TIM_PWM_Start( &htim8, TIM_CHANNEL_2);  // PC7
     
    HAL_TIM_SetPWM_Pulse( 500, TIM_CHANNEL_1);
    HAL_TIM_SetPWM_Pulse( 500, TIM_CHANNEL_2);
}

2)input_capture.c 实现捕捉功能

初始化捕捉功能参数:

cpp 复制代码
static void set_captureMode(  uint32_t Channel, uint32_t ICPolarity )
{
  TIM_IC_InitTypeDef sConfigIC = {0};
  
  if(HAL_TIM_IC_Stop_IT(&htim1, Channel) != HAL_OK)
  {
    /* Starting Error */
    Error_Handler();
  }
  
  sConfigIC.ICPolarity = ICPolarity;
  sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
  sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
  sConfigIC.ICFilter = 0;
  if (HAL_TIM_IC_ConfigChannel(&htim1, &sConfigIC, Channel) != HAL_OK)
  {
    Error_Handler();
  }
  
  if(HAL_TIM_IC_Start_IT(&htim1, Channel) != HAL_OK) 
  {
    /* Starting Error */
    Error_Handler();
  }
}

3)捕捉功能回调函数

cpp 复制代码
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
  uint32_t uwIC2Value0;
  static uint32_t uwIC2Value2_list[2];
  static uint8_t count = 0;
    
  if(htim->Instance == TIM1) 
  {
      if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
      {
          /* Get the 1st Input Capture value */
          uwIC2Value0 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
          uwIC2Value2_list[count] = uwIC2Value0;
            count++;
            if( count == 2 ){
               count = 0;
               if( uwIC2Value2_list[1] > uwIC2Value2_list[0])
                    printf(" cycle = %d us\r\n",  uwIC2Value2_list[1]- uwIC2Value2_list[0]);
            }
       }
  }
}

4 测试

4.1 功能框图

4.2 运行结果

1)使用逻辑分析仪测试,PWM的周期为10ms

2)使用捕捉功能测试的数据为:10000us = 10ms

相关推荐
启明云端wireless-tag6 分钟前
ESP32无线WiFi蓝牙SOC,设备物联网通信方案,启明云端乐鑫代理商
嵌入式硬件·物联网·wifi·esp32·乐鑫·wifi模组
小狗爱吃黄桃罐头30 分钟前
江协科技STM32学习- P14 示例程序(定时器定时中断和定时器外部时钟)
stm32·江科大stm32
@@庆1 小时前
stm32 PWR电源控制(修改主频&睡眠模式&停机模式&待机模式)
stm32·单片机·嵌入式硬件
JT灬新一1 小时前
STM32巡回研讨会总结(2024)
stm32·单片机·嵌入式硬件
爱桥代码的程序媛2 小时前
鸿蒙OpenHarmony【轻量系统芯片移植案例】标准系统方案之瑞芯微RK3568移植案例
嵌入式硬件·harmonyos·鸿蒙·鸿蒙系统·移植·openharmony·鸿蒙开发
Whappy0012 小时前
51单片机-DA(数字转模拟)
单片机·嵌入式硬件·51单片机
鸽子汤1972 小时前
想高效开发?从文件系统开始着手。。。
嵌入式硬件·物联网·硬件工程
Whappy0012 小时前
51单片机-AD(模拟信号转数字信号)-实验()
单片机·嵌入式硬件·51单片机
redcocal12 小时前
地平线秋招
python·嵌入式硬件·算法·fpga开发·求职招聘