STM32——定时器:高级定时器

定时器归纳总页:

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 例程

手册:

cpp 复制代码
#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;
        }
    }
}
cpp 复制代码
#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

相关推荐
深圳市九鼎创展科技1 小时前
瑞芯微 RK3399 开发板 X3399 评测:高性能 ARM 平台的多面手
linux·arm开发·人工智能·单片机·嵌入式硬件·边缘计算
辰哥单片机设计1 小时前
STM32项目分享:车辆防盗报警系统
stm32·单片机·嵌入式硬件
風清掦2 小时前
【江科大STM32学习笔记-05】EXTI外部中断11
笔记·stm32·学习
小龙报3 小时前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机
范纹杉想快点毕业3 小时前
嵌入式与单片机开发核心学习指南——从思维转变到第一性原理的深度实践
单片机·嵌入式硬件
Industio_触觉智能3 小时前
瑞芯微RK3566开发板规格书,详细参数配置,型号EVB3566-V1,基于RK3566核心板SOM3566邮票孔封装
嵌入式硬件·开发板·rk3568·rk3566·核心板·瑞芯微
czwxkn3 小时前
4STM32(stdl)TIM定时器
stm32·单片机·嵌入式硬件
Love Song残响3 小时前
NVIDIA显卡终极优化指南
stm32·单片机·嵌入式硬件
qq_672592753 小时前
电源芯片为什么发热
单片机·嵌入式硬件
天天爱吃肉82184 小时前
【跨界封神|周杰伦×王传福(陶晶莹主持):音乐创作与新能源NVH测试,底层逻辑竟完全同源!(新人必看入行指南)】
python·嵌入式硬件·算法·汽车