聊城市网站建设_网站建设公司_PHP_seo优化
2026/1/17 17:08:52 网站建设 项目流程

定时器归纳总页:



STM32——定时器-CSDN博客

四、高级定时器

4.1 高级定时器简介

4.2 高级定时器框图(熟悉)

4.3 高级定时器输出指定个数PWM实验

4.3.1 重复计数器特性

再同步:产生于一次更新事件后,RCR寄存器的值会再缓冲到它的影子寄存器中,相当于重置了影子寄存器。所以发生软件更新事件后,还要溢出四次,才能产生更新时间。

设置RCR为N,更新事件将在N+1次溢出时产生。

4.3.2 高级定时器输出指定个数PWM实验原理

输出原理参考 “通用定时器PWM输出实验”

步骤:

1.配置边沿对齐模式输出PWM(递增)

2.指定输出N个PWM,则把N-1写入RCR中

(RCR中 N 发生溢出需要 N+1, 需要N次就发生溢出,则存入N-1)

3.在更新中断内,关闭计数器

*.高级定时器通道输出必须把MOE位 置1

4.3.3 高级定时器输出指定个数PWM实验配置步骤

步骤HAL库函数备注
1.配置定时器基础工作参数HAL_TIM_PWM_Init()
2.定时器PWM输出MSP初始化HAL_TIM_PWM_MspInit()配置NVIC、CLOCK、GPIO等
3.配置PWM模式/比较值等HAL_TIM_PWM_ConfigChannel()
4.设置优先级,使能中断

HAL_NVIC_SetPeriority()

HAL_NVIC_EnableIRQ()

5.使能定时器更新中断__HAL_TIM_ENABLE_IT()
6.使能输出、主输出、计数器HAL_TIM_PWM_Start()主输出 只有高级定时器才有
7.编写中断服务函数TIMx_IRQHandler()等

会调用中断公共处理函数

HAL_TIM_IRQHandler()

8.编写更新中断回调函数HAL_TIM_PeriodElapsedCallback()

4.3.4 例程

【免费】Proj-11-TIM-高级定时器输出指定个数PWM实验资源-CSDN下载https://download.csdn.net/download/PinnsiR/92561274

硬件链接:

pin脚选择:

芯片手册 中的pin脚复用 PC6:

原理图LED1的位置:由PE5控制

选择用跳线链接PC6到PE5:

重复计数器在更新事件的时候会启动刷新,所以代码就是:改变句柄里的RCR值,利用软件事件缓冲RCR值到影子寄存器

4.4 高级定时器输出比较模式实验

【免费】Proj-12-TIM-高级定时器输出比较模式实验资源-CSDN下载https://download.csdn.net/download/PinnsiR/92564378

4.4.1 高级定时器输出比较模式实验原理

一个方波的计数个数:2*(ARR+1),【+1是因为从0开始计数】

一个周期的时间:计数个数* (PSC+1)/ Ft ,计数频率(1s钟计的次数):Ft/(PSC+1)

也就是 PWM波周期或频率由ARR决定,相位由CRR决定

占空比:翻转模式下,固定50%

4.4.2 高级定时器输出模式实验配置步骤

4.4.3 例程

手册:

#include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" #include "./SYSTEM/delay/delay.h" #include "./BSP/LED/led.h" #include "./BSP/TIMER/atim.h" extern TIM_HandleTypeDef g_timx_comp_pwm_handle; /* 定时器x句柄 */ int main(void) { uint8_t t = 0; HAL_Init(); /* 初始化HAL库 */ sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */ delay_init(72); /* 延时初始化 */ usart_init(115200); /* 串口初始化为115200 */ led_init(); /* 初始化LED */ atim_timx_comp_pwm_init(1000 - 1, 72 - 1); __HAL_TIM_SET_COMPARE(&g_timx_comp_pwm_handle, TIM_CHANNEL_1, 250 - 1); __HAL_TIM_SET_COMPARE(&g_timx_comp_pwm_handle, TIM_CHANNEL_2, 500 - 1); __HAL_TIM_SET_COMPARE(&g_timx_comp_pwm_handle, TIM_CHANNEL_3, 750 - 1); __HAL_TIM_SET_COMPARE(&g_timx_comp_pwm_handle, TIM_CHANNEL_4, 1000 - 1); while (1) { delay_ms(10); t++; if (t >= 20) { LED0_TOGGLE(); /* LED0(RED)闪烁 */ t = 0; } } }
#include "./BSP/TIMER/atim.h" TIM_HandleTypeDef g_timx_comp_pwm_handle; /* 定时器x句柄 */ /* 高级定时器 输出比较模式 初始化函数 */ void atim_timx_comp_pwm_init(uint16_t arr, uint16_t psc) { TIM_OC_InitTypeDef timx_oc_comp_pwm = {0}; g_timx_comp_pwm_handle.Instance = TIM8; /* 定时器8 */ g_timx_comp_pwm_handle.Init.Prescaler = psc ; /* 定时器分频 */ g_timx_comp_pwm_handle.Init.CounterMode = TIM_COUNTERMODE_UP; /* 递增计数模式 */ g_timx_comp_pwm_handle.Init.Period = arr; /* 自动重装载值 */ HAL_TIM_OC_Init(&g_timx_comp_pwm_handle); /* 输出比较模式初始化 */ timx_oc_comp_pwm.OCMode = TIM_OCMODE_TOGGLE; timx_oc_comp_pwm.OCPolarity = TIM_OCPOLARITY_HIGH; HAL_TIM_OC_ConfigChannel(&g_timx_comp_pwm_handle, &timx_oc_comp_pwm, TIM_CHANNEL_1); HAL_TIM_OC_ConfigChannel(&g_timx_comp_pwm_handle, &timx_oc_comp_pwm, TIM_CHANNEL_2); HAL_TIM_OC_ConfigChannel(&g_timx_comp_pwm_handle, &timx_oc_comp_pwm, TIM_CHANNEL_3); HAL_TIM_OC_ConfigChannel(&g_timx_comp_pwm_handle, &timx_oc_comp_pwm, TIM_CHANNEL_4); __HAL_TIM_ENABLE_OCxPRELOAD(&g_timx_comp_pwm_handle, TIM_CHANNEL_1); __HAL_TIM_ENABLE_OCxPRELOAD(&g_timx_comp_pwm_handle, TIM_CHANNEL_2); __HAL_TIM_ENABLE_OCxPRELOAD(&g_timx_comp_pwm_handle, TIM_CHANNEL_3); __HAL_TIM_ENABLE_OCxPRELOAD(&g_timx_comp_pwm_handle, TIM_CHANNEL_4); HAL_TIM_OC_Start(&g_timx_comp_pwm_handle, TIM_CHANNEL_1); HAL_TIM_OC_Start(&g_timx_comp_pwm_handle, TIM_CHANNEL_2); HAL_TIM_OC_Start(&g_timx_comp_pwm_handle, TIM_CHANNEL_3); HAL_TIM_OC_Start(&g_timx_comp_pwm_handle, TIM_CHANNEL_4); } /* 定时器 输出比较 MSP初始化函数 */ void HAL_TIM_OC_MspInit(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM8) { GPIO_InitTypeDef gpio_init_struct; __HAL_RCC_TIM8_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); gpio_init_struct.Pin = GPIO_PIN_6; gpio_init_struct.Mode = GPIO_MODE_AF_PP; gpio_init_struct.Pull = GPIO_NOPULL; gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOC, &gpio_init_struct); gpio_init_struct.Pin = GPIO_PIN_7; HAL_GPIO_Init(GPIOC, &gpio_init_struct); gpio_init_struct.Pin = GPIO_PIN_8; HAL_GPIO_Init(GPIOC, &gpio_init_struct); gpio_init_struct.Pin = GPIO_PIN_9; HAL_GPIO_Init(GPIOC, &gpio_init_struct); } }

4.5 高级定时器互补输出带死区控制实验

4.5.1 互补输出&&死区控制

互补输出通道只有 通道 1至3(OCx & OCxN)

4.5.2 带死区控制的互补输出应用之H桥

H桥:用于控制电机正反转(多用mos管)

正常的电路会加上更多的元器件,由于元器件是有延迟特性,所以需要加上死区时间控制。

加入死区时间会使这段时间内,输出与互补输出 相同电平,即无效电平,在控制H桥时,OC1与OC1N同时输出低电平,两个mos管是截止状态,通过死区时间后,才会开启mos管。

4.5.3 捕获/比较通道的输出部分(通道1至3)

4.5.4 死区时间计算

4.5.5 刹车(断路)功能

MOE被清0,被称为空闲模式,置1,被称为运行模式

4.5.6 高级定时器互补输出带死区控制实验配置步骤

用于HAL_TIM_PWM_ConfigChannel()

用于 HAL_TIMx_PWM_ConfigBreakDeadTime()

4.5.7 例程

【免费】AdvancedTimerComplementaryOutputwithDead-TimeControlProject资源-CSDN下载https://download.csdn.net/download/PinnsiR/92565740

72MHz使用4分频,可根据死区时间计算公式计算死区时间

重映射PE8 PE9到 TIM1的输出通道和互补输出通道1上

重映射PE15 到TIM1 的刹车通道上

寄存器复用设置

死区时间示波器结果

设置DTG = 100

设置TDG = 250

刹车功能验证:

刹车后输出和互补输出通道都为低,(OCIdleState和OCNIdleState设置空闲情况下的输出情况,不可同时为高导通电路。由硬件强制控制不可同时为高。)

4.6 高级定时器PWM输入模式实验

4.6.1 PWM输入模式工作原理

测量PWM参数 周期、频率、占空比。

4.6.2 PWM输入模式时序

4.6.3 高级定时器PWM输入模式实验配置步骤

TIM1/TIM8有独立的输入捕获中断服务函数:

4.6.4 例程

【免费】Proj-14-TIM-AdvancedTimerPWMInputModeExperiment资源-CSDN下载https://download.csdn.net/download/PinnsiR/92565902

不溢出不需要Tout + 1

TIM3的通道2占空比设置 的比较寄存器:

结果:

PWM 输出设置频率超过910:

想要采样更大的PWM周期,需要提高精度,提高PSC

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询