首页 > 其他分享 >二、STM32F103C8T6-定时器

二、STM32F103C8T6-定时器

时间:2024-10-18 20:22:27浏览次数:1  
标签:TIM3 定时器 HAL TIM Init STM32F103C8T6 TimHandle

STM32F103C8T6 定时器概述
STM32F103C8T6 作为一款广泛使用的微控制器,内置多个定时器,能够支持多种计时和控制功能,如精确延时、脉冲宽度调制(PWM)、捕获比较(Capture/Compare)、输入捕获 和 输出比较 等。这些功能在电机控制、信号测量、周期性事件触发等应用中非常常用。

STM32F103C8T6 的定时器分类

一、高级定时器(TIM1):高级定时器不仅具有基本的定时和计数功能,还支持高级功能,如死区控制(dead-time generation)、互补输出、刹车功能和自动重装载预加载(ARR preload),这些功能使其特别适合用于复杂的电机控制和电源管理应用。

  • 提供增强的功能,特别适合 PWM 控制、电机控制。
  • 支持多通道 PWM 输出,具有丰富的捕获/比较功能。

高级定时器互补输出:互补输出是通过定时器的多个输出通道生成一对相反的 PWM 信号,即一个信号为高电平时,另一个信号为低电平。互补输出常用于控制 全桥电路 或 半桥电路,从而驱动 MOSFET 或 IGBT 等开关器件。

互补输出的基本原理:

  • 主通道(主输出):高级定时器生成的 PWM 信号,用于驱动负载或开关。

  • 互补通道(互补输出):与主通道相反的信号(即互补信号),用于驱动相反极性的开关器件,确保系统中不会同时导通同一条导通路径的两个开关,避免短路。

  • 死区时间(Dead Time):为了避免主通道和互补通道的开关在某一瞬间同时导通(造成短路),可以引入死区时间。死区时间是指主通道关闭后,互补通道延迟一定时间才开始导通,反之亦然。这是电机控制和开关电源中非常关键的一项保护功能。

    互补输出控制电机正反转例子图:(H桥)

    扩展:IGBT与MOSFET对比:

二、通用定时器

在 STM32F103C8T6 微控制器中,通用定时器提供了丰富的功能,适合于基本计时、输入捕获、输出比较、PWM 输出等多种应用。STM32F103C8T6 配备了多个通用定时器,包括 TIM2、TIM3、TIM4。

  • TIM2:32 位通用定时器,支持基本定时、中断、捕获/比较、PWM 输出等功能。
  • TIM3、TIM4:16 位通用定时器,支持类似功能,主要区别在于计数器的位宽较小。

    应用实例:
    1、定时器中断
    使用定时器2(TIM2),每隔1秒产生一次中断,时钟频率为72MHZ
void TIM2_Init(void)
{
    // 开启 TIM2 时钟
    __HAL_RCC_TIM2_CLK_ENABLE();
    
    TIM_HandleTypeDef TimHandle = {0};
    TimHandle.Instance = TIM2;
    
    // 预分频器配置,计数频率为 10 kHz
    TimHandle.Init.Prescaler = 7200 - 1;  // 72 MHz / 7200 = 10 kHz
    // 自动重装载值,1 秒定时
    TimHandle.Init.Period = 10000 - 1;    // 10 kHz / 10000 = 1 秒
    TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
    HAL_TIM_Base_Init(&TimHandle);
    
    // 启用定时器中断
    HAL_TIM_Base_Start_IT(&TimHandle);
}

// 定时器中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim->Instance == TIM2)
    {
        // 每 1 秒触发一次中断
        HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);  // 切换 GPIO 状态
    }
}
代码中,TIM2 配置为每秒产生一次中断,计数频率为 10 kHz,周期为 1 秒。每次中断发生时,GPIO 引脚状态发生翻转。
定时器中断回调函数:用于处理定时器产生的中断事件。STM32 使用 HAL 库时,定时器中断发生后,HAL_TIM_PeriodElapsedCallback() 函数会被自动调用,这是一个通用的定时器中断回调函数,负责处理定时器的计时溢出或更新事件。
(参数 htim:传入的 TIM_HandleTypeDef 结构体用于标识是哪一个定时器产生了中断)

2、使用TIM3生成PWM信号
假设我们使用TIM3生成一个1KHZ的PWM信号,占空比50%

void TIM3_PWM_Init(void)
{
    // 开启 TIM3 时钟
    __HAL_RCC_TIM3_CLK_ENABLE();

    TIM_HandleTypeDef TimHandle = {0};
    TIM_OC_InitTypeDef sConfigOC = {0};  //输出比较的结构体,任务句柄

    // 基本时基配置
    TimHandle.Instance = TIM3;
    TimHandle.Init.Prescaler = 72 - 1;  // 预分频器,计数频率 1 MHz
    TimHandle.Init.Period = 1000 - 1;   // 自动重装载值,1 kHz PWM 频率
    TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
    HAL_TIM_PWM_Init(&TimHandle);  // 初始化 PWM

    // 配置 PWM 输出通道
    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 500;  // 50% 占空比
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfigOC, TIM_CHANNEL_1);

    // 启动 PWM 输出
    HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_1);
}

3、使用 TIM4 捕获输入信号
假设我们使用 TIM4 捕获输入信号的上升沿,并测量输入信号的频率。

void TIM4_InputCapture_Init(void)
{
    // 开启 TIM4 时钟
    __HAL_RCC_TIM4_CLK_ENABLE();

    TIM_HandleTypeDef TimHandle = {0};
    TIM_IC_InitTypeDef sConfigIC = {0};

    // 基本时基配置
    TimHandle.Instance = TIM4;
    TimHandle.Init.Prescaler = 72 - 1;  // 计数频率为 1 MHz
    TimHandle.Init.Period = 0xFFFF;     // 最大计数值
    TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
    HAL_TIM_IC_Init(&TimHandle);

    // 输入捕获配置
    sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;  //上升沿捕获
    sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
    sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
    sConfigIC.ICFilter = 0;
    HAL_TIM_IC_ConfigChannel(&TimHandle, &sConfigIC, TIM_CHANNEL_1);

    // 启动输入捕获
    HAL_TIM_IC_Start_IT(&TimHandle, TIM_CHANNEL_1);
}

输入捕获,计算输入信号周期

#include "stm32f1xx_hal.h"

// 定义全局变量
uint32_t capture1 = 0;
uint32_t capture2 = 0;
uint32_t difference = 0;
uint32_t frequency = 0;

// 初始化 TIM3 的输入捕获功能
void TIM3_InputCapture_Init(void)
{
    __HAL_RCC_TIM3_CLK_ENABLE();
    
    TIM_HandleTypeDef TimHandle = {0};
    TIM_IC_InitTypeDef sConfigIC = {0};

    TimHandle.Instance = TIM3;
    TimHandle.Init.Prescaler = 72 - 1;  // 1 MHz 计数频率
    TimHandle.Init.Period = 0xFFFF;
    TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
    HAL_TIM_IC_Init(&TimHandle);

    sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
    sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
    sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
    sConfigIC.ICFilter = 0;
    HAL_TIM_IC_ConfigChannel(&TimHandle, &sConfigIC, TIM_CHANNEL_1);

    HAL_TIM_IC_Start_IT(&TimHandle, TIM_CHANNEL_1);
}

// 定时器输入捕获回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    if(htim->Instance == TIM3 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
    {
        if (capture1 == 0)
        {
            capture1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
        }
        else
        {
            capture2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);

            if (capture2 > capture1)
            {
                difference = capture2 - capture1;
            }
            else
            {
                difference = (0xFFFF - capture1) + capture2 + 1;
            }

            frequency = 1000000 / difference;

            capture1 = 0;
        }
    }
}

void TIM3_NVIC_Config(void)
{
    HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(TIM3_IRQn);
}

// 主函数
int main(void)
{
    HAL_Init();

    TIM3_InputCapture_Init();
    TIM3_NVIC_Config();

    while(1)
    {
        // 可以在此处监控 frequency 变量
    }
}

标签:TIM3,定时器,HAL,TIM,Init,STM32F103C8T6,TimHandle
From: https://www.cnblogs.com/zmq-wj/p/18473983

相关文章

  • 一、STM32F103C8T6--GPIO
    STM32f103c8t632位Cortex-M3内核RISC处理器,最高主频72MHZ,Flash:64KB,SRAM:20KB片上外设:I/O端口:多达37个GPIO引脚(支持复用功能)。GPIO端口支持输入、输出、上拉/下拉功能。定时器:3个16位通用定时器(支持PWM输出)。********1个高级定时器(支持多通道PWM)。通信接口:......
  • STM32开发————定时器的基本配置
    一、将定时器相关的.c和.h添加到新建的工程中添加文件路径:二、对.c和.h文件进行代码编写打开timer.h文件,写一下防止重复包含的宏定义#ifndef__TIMER_H#define__TIMER_H#endif打开timer.c文件,包含一下STM32的头文件:“右键单机”--->Insert'#includefi......
  • TIM定时器(标准库)
    目录一.前言二.定时器的框图三.定时中断的基本结构 四.TIM定时器相关代码五.最终现象展示一.前言    什么是定时器?定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断。TIM定时器不仅具备基本的定时中断功能,而且还包含内外时钟源选择,输......
  • #STM32#定时器扫描按键消抖#按键控制LED灯亮灭#标准库
    一.机械按键抖动在按下按键后金属弹片会来回震动影响I/O口的电平变化,影响检测和判断操作。通常抖动时间为:5ms~10ms影响:在不加消除抖动的情况下按下按键LED灯可能会出现失灵的情况,因为这时的判断按键情况通常是判断电平的高低,由于电平不停的发转,所以呀很难判断此时是否是被......
  • 【STM32开发之寄存器版】(八)-定时器的编码器接口模式
    一、前言1.1编码器接口原理编码器模式主要用于检测旋转编码器的转动方向和转动速度。旋转编码器一般输出两路相位相差90度的脉冲信号(称为A相和B相),通过这两路信号,定时器可以判断编码器的旋转方向,并计数转动的脉冲数。1.2本次DEMO目标本次DEMO将使用STM32F103ZET6的PA6(......
  • QT定时器+事件捕获
    QT定时器类定时器类的使用主要包括定时和启动两个步骤。要使用OTimer类,需要引用头文件:#include<QTimer>QTimer类常用的成员函数有(1)voidstart(std::chrono::milisecondsmsec):启动定时器,参数为定时时间(单位为毫秒),如:        QTimermyTimer;        ......
  • STM32f103c8t6中PWM的配置
    1、PWM简介    PWM波形(PulseWidthModulation,脉冲宽度调制波形)是一种占空比可变的脉冲波形。这种调制方式通过改变脉冲的宽度来控制电路中的信号强度和频率。具体来说,PWM波形中的高电平持续时间和低电平持续时间可以根据需要进行调整,从而实现对模拟信号电平的数字......
  • 【WCH蓝牙系列芯片】-基于CH582开发板—利用定时器加DMA方式模拟串口输出
    ------------------------------------------------------------------------------------------------------------------------------------在使用CH582芯片开发测试中,有个实际的用途是利用串口输出日志的方式,来进行程序的调试。CH582芯片一共提供了4组全双工的异步串口......
  • 51单片机中断与定时器
    一.中断源  INT0  外部中断0    P3^2引脚低电平或者下降沿信号  INT1  外部中断1    P3^3引脚低电平或者下降沿信号  T0    定时器0中断   定时器/计数器0计数回0溢出  T1    定时器1中断   定时器/计数器1计数......
  • [米联客-XILINX-H3_CZ08_7100] FPGA_SDK入门篇连载-08PS 私有看门狗定时器实验
    软件版本:VIVADO2021.1操作系统:WIN1064bit硬件平台:适用XILINXA7/K7/Z7/ZU/KU系列FPGA实验平台:米联客-MLK-H3-CZ08-7100开发板板卡获取平台:https://milianke.tmall.com/登录“米联客”FPGA社区http://www.uisrc.com视频课程、答疑解惑!目录1概述2系统框图3中断资......