二、STM32F103C8T6-定时器

news/2024/10/18 20:25:15

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 kHzTimHandle.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 MHzTimHandle.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 MHzTimHandle.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 变量}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/73196.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Sparse Table

Sparse Table 可用于解决这样的问题:给出一个 \(n\) 个元素的数组 \(a_1, a_2, \cdots, a_n\),支持查询操作计算区间 \([l,r]\) 的最小值(或最大值)。这种问题被称为区间最值查询问题(Range Minimum/Maximum Query,简称 RMQ 问题)。预处理的时间复杂度为 \(O(n \log n)\…

MinIO

1.概述一个开源的用于存储文件的分布式文件存储系统2.官网http://docs.minio.org.cn/docs/3.相关概念bucket – 类比于文件系统的目录 Object – 类比文件系统的文件 Keys – 类比文件名4.搭建 docker run -p 9000:9000 --name minio -d --restart=always -e "MINIO_ACCES…

计量经济学(十一)——联立方程模型的估计

img { display: block; margin-left: auto; margin-right: auto } table { margin-left: auto; margin-right: auto } 联立方程模型(Simultaneous Equations Model, SEM)是一类包含多个相互依赖变量的统计模型,用来描述这些变量之间的相互关系。在传统的单一方程模型中,通常…

数据结构与算法 课程随记

数据结构与算法 课程随记因为有时候需要在不同设备编辑同一份文档,本地不太方便了,先在放着博客园比较省事吧。 但是博客园是不是快要四了啊,没事再整一个个人博客吧。 内容非常杂,因为不想去上课所以还是有点东西不会,就记录一下查不会东西的时候学会的东西。没什么参考价…

Freemarker

什么是FreemarkerFreeMarker 是一种基于模板的 Java 模板引擎,通常用于生成动态网页、配置文件、电子邮件内容等。它通过将数据模型(如 Java 对象、Map、List 等)与模板相结合来生成最终的输出。FreeMarker 使用简单的语法和指令来处理动态内容,非常适合与 Java Web 应用程…

pve安装后删除local-lvm并把其空间全部分给local

在安装pve的时候,系统默认分配给local的空间非常小,我们可以通过以下方法把local-lvm删除,并将其空间还给local。 在webui的pve节点的磁盘选项中找到LVM-Thin,删除data卷。删除后此处为空。 接着打开终端执行以下命令: lvresize --extents +100%FREE --resizefs pve/root此…

PYNQ Z2 读取xadc外部通道电压

使用XADC 或者JTAG只能读取XADC的内部电压, 而无法读取外部通道的电压 现在使用xsysmon.h库里面的函数进行XADC外部通道的电压 为了方便观察,增加了PL GPIO KEY LED进行观察 1. 配置ZYNQ7000 勾选FCLK_RESET0勾选UART0, 这是BANK电压勾选PS给PL提供的时钟, 设置PS的输入时钟配置…

10.18 模拟赛

炼石计划 10 月 04 日 NOIP 模拟赛 #8【补题】 - 比赛 - 梦熊联盟 (mna.wang) 复盘 T1 有种 div.2 B 的风格,没秒,想看题。 T2。只判是否无解?\(k \le 100\)?把 \(200\) 个关键连通块拿出来建图跑传递闭包不就做完了。 一遍过大样例?简直不可思议,但还是把 T2 关了吧。 用…