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

相关推荐
蓝斯49712 小时前
从.到实现一个Windows上的虚拟hid键盘设备
windows·单片机·计算机外设
熙芯XiChip12 小时前
硬实时与软实时RTOS核心区别
嵌入式硬件
伟大的前程13 小时前
unsigned int 定义的变量 在 电脑的 64 位系统中 和 32 位 cortex-m0 和 8 位的 51 单片机
单片机·嵌入式硬件
小渔村的拉线工13 小时前
1.HPM6E80 解析芯片整体工作原理和存储架构
单片机·嵌入式硬件·mcu·架构·hpm6e80
熙芯XiChip14 小时前
CAN与CANopen的本质区别
单片机
lilihewo14 小时前
Altium Designer 封装库的创建(分享pcb 3D封装库)
嵌入式硬件·51单片机
神罚天下ET15 小时前
典型arm位单片机启动流程(从上电到main.c)
c语言·arm开发·单片机
碧海银沙音频科技研究院16 小时前
蓝牙耳机使用WSDF5361锂保芯片进入船运模式实现方法
嵌入式硬件·算法
Zevalin爱灰灰17 小时前
模拟信号链电路——基于TL431的电压基准电路
单片机·嵌入式硬件
csdn杰哥17 小时前
瑞萨单片机开发教程[二十七] DTC 外部中断触发传输实验
单片机·嵌入式硬件·mongodb·瑞萨·ra6m5