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

相关推荐
项目題供诗2 小时前
51单片机入门(一)
单片机·嵌入式硬件·51单片机
1621B驱动芯片原厂3 小时前
YL1621 芯片成功案例推荐
stm32·单片机·嵌入式硬件·mcu·51单片机
Hello_Embed4 小时前
RS485 双串口通信 + LCD 实时显示(DMA+IDLE 空闲中断版)
笔记·单片机·学习·操作系统·嵌入式·freertos
__万波__4 小时前
STM32L475基于完全空白的项目,完成时钟树初始化配置并验证
单片机·嵌入式硬件
XINVRY-FPGA4 小时前
XC7VX690T-2FFG1761I Xilinx AMD FPGA Virtex-7
arm开发·嵌入式硬件·fpga开发·硬件工程·fpga
良许Linux5 小时前
STM32F103每个符号的意思是什么?
stm32·单片机·嵌入式硬件
小痞同学6 小时前
【铁头山羊STM32】HAL库 4.时钟系统部分
stm32·单片机·嵌入式硬件
周周记笔记6 小时前
ESP32-S3 :开发方式笔记(五)
笔记·单片机·嵌入式硬件
我怕是好6 小时前
学习STM32 ESP8266
stm32·嵌入式硬件·学习