• STM32-NUCLEO-F411RE—输出PWM及修改PWM频率与占空比


    使用STM32CubeMX生产初始化代码,底板硬件使用NUCLEO-F411RE开发板
    在这里插入图片描述
    查看原理图,PC6的TIM3-CH1设置为PWM输出管脚。
    在这里插入图片描述
    在这里插入图片描述

    独立输出所需要的文件
    在这里插入图片描述

    结构框图

    查看下面结构框图可以得知,时钟可以由内部的tim_ker_ck和tim_pclk产生或者外部ETR时钟产生
    同时可以设置复位,使能,向上/向下,中央双向对齐计数模式。
    在这里插入图片描述
    在这里插入图片描述
    tim_ker_ck说明:内核时钟计数器。这个钟一定是与tim_pclk(派生相同的源)。时钟率Tim_ker_ck /tim_pclk必须为整数:1,2,3,16(最大值)

    说明下中央双向对齐溢出事件
    中央双向对齐计数模式中,计数器交替向上、向下计数。当计数值从 TMRx_PR 值向下计数到 1 值时,产生下溢事件,然后从0开始向上计数;当向上计数到TMRx_PR值-1时,产生上溢事件,之后从TMRx_PR值向下计数。计数器计数方向可由计数器方向控制位(OWCDIR)实时查看

    查看下列文档可以得知,定时器主要有TIMx_CNT、TIMx_PSC、TIMx_ARR、TIMx_RCR控制。
    同时预分频器(TIMx_PSC)范围位1-65535。
    在这里插入图片描述
    在这里插入图片描述

    查看TIMx_PSC说明,可以得知定时器频率为 fCK_PSC / (PSC[15:0] + 1)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    可以看到,当psc设置为不同的值的时候,计数频率也会发生改变。
    在这里插入图片描述
    在这里插入图片描述
    同时ARR可以改变计数值,当写入的ARR越大,他的频率越低,计数周期是ARR+1。

    在这里插入图片描述
    在这里插入图片描述

    PWM频率计算如下所示:

    请添加图片描述

    底层硬件使用外部晶振8M时钟, 时钟配置为以下

        Stm32_Clock_Init(96,4,2,4);     //设置时钟,96Mhz
    
    • 1

    在上面配置TIM1参数,预分频系数设置为96-1, 自动重载值设置为1000-1,那么PWM频率为96,000,000/((96-1+1)*(1000-1+1))=1000Hz,即1KHz。

    STM32-NUCLEO配置

    在这里插入图片描述
    这两个为定时器主从模式配置,很少用到,我们用不到,所以全部关闭
    请添加图片描述

    在这里插入图片描述
    Trigger Output (TRGO) Parameters项 与本节无关,之后做详细介绍
    TRGO:定时器的触发信号输出 在定时器的定时时间到达的时候输出一个信号(如:定时器更新产生TRGO信号来触发ADC的同步转换)

    使能定时器中断:
    在这里插入图片描述

    只要TIM1_CNT= TIM1_CCRx,OCxRER为低。若TIM1_CCRx中的比较值大于自动重载值(在TIM1_ARR中)则OCxREF仍保持1。若比较值是0则OCxREF保持0。下图的例子显示了当TIM1_ARR=8时一些边沿对齐的PWM波形。
    在这里插入图片描述

    函数讲解:

    HAL_TIM_IRQHandler(&htim3);
    
    • 1

    定时器中断处理函数 在stm32f4xx_it.c的 TIM3_IRQHandler()定时器中断服务函数中

    这个函数的具体作用是判断中断是否正常,然后判断产生的是哪一类定时器中断(溢出中断/PWM中断…),然后进入相应的中断回调函数

    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    
    • 1

    在HAL库中,每进行完一个中断,并不会立刻退出,而是会进入到中断回调函数中,这里我们是使用定时器溢出中断回调函数

    ▲void TIM3_IRQHandler(void) 首先进入中断函数
    ▲ HAL_TIM_IRQHandler(&htim3);之后进入定时器中断处理函数
    ▲判断产生的是哪一类定时器中断(溢出中断/PWM中断…) 和定时器通道
    ▲ void HAL_TIM_PeriodElapsedCallback(&htim2); 进入相对应中断回调函数
    ▲在中断回调函数中添加用户代码

    __HAL_TIM_SET_COMPARE()
    
    • 1

    设置CCR值,可以通过此函数修改PWM。

    由于上述设置计数值位1000,那么设置30%的正占空比的ccr应该配置为30%*1000=300,代码如下所示。

    HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
    __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 300);
    
    • 1
    • 2

    在这里插入图片描述

    修改PWM频率

    修改PWM频率可以修改PSC或者ARR来进行改变。

    请添加图片描述

    __HAL_TIM_SET_AUTORELOAD ()
    
    • 1

    设置TIM自动重新加载寄存器值。

    初始设置为PSC为96-1,ARR为1000-1,若设置为500-1,那么他的频率应该是96M/(96-1+1)(500-1+1)=2k
    占空比为300/500*100%=60%

    __HAL_TIM_SET_AUTORELOAD(&htim3, 500-1);
    
    • 1

    在这里插入图片描述

  • 相关阅读:
    【AUTOSAR-Nm】-2.2-通过CAN/Lin...信号报告Nm状态机的跳转
    Elasticsearch:Metadata fields - 元数据字段介绍
    TypeScript中的declare关键字
    数据资产、数字资产、数据资源及数据资产入表
    C++之修改结构体成员字节对齐(二百一十三)
    Dockerfile构建镜像与实战
    树型结构和二叉树的概念及特性
    交叉编译tcpdump
    CSS基础选择器,CSS字体属性,CSS文本属性
    Jtti:Ubuntu下如何创建XFS文件系统的LVM
  • 原文地址:https://blog.csdn.net/weixin_41226265/article/details/126695692