STM32单片机输出频率及占空比可调的PWM波

STM32单片机输出频率及占空比可调的PWM波一 测试用环境 STM32F103C8T HAL 库 只考虑 PWM 的频率和占空比两个参数 死区 极性 对齐方式等不做讨论 二 STM32Cube MX 配置 1 PWM 原理 上图中 定时器向上计数 当 CNT ccrx 时 输出 0 当 cnt CCRx 时输出 1 ccrx 时 输出 0 当 cnt

大家好,我是讯享网,很高兴认识大家。

一、测试用环境

二、STM32Cube MX配置

1.PWM原理

在这里插入图片描述
讯享网
上图中,定时器向上计数,当CNT<CCRx时,输出0,当CNT>CCRx时输出1,当CNT达到ARR值的时候,重新归零,再次向上计数,如此循环。改变CCRx的值,就可以改变PWM输出的占空比,改变ARR的值,就可以改变PWM输出的的频率。计算频率和占空比的公式如下:

f p w m = f_{pwm}= fpwm= f T I M ( P S C + 1 ) ∗ ( A R R + 1 ) f_{TIM} \over (PSC+1)*(ARR+1) (PSC+1)(ARR+1)fTIM

D u t y C y c l e DutyCycle DutyCycle = C C R A R R CCR\over ARR ARRCCR *100%
由以上两公式可知,时钟频率确定后,频率与分频系数PSC和自动重装载值ARR都有关系,占空比是CCR和ARR的比值;

2.CubeMX配置

以通用定时器TIM3的通道1为例,时钟为72MHz,主要配置如下图,因为频率和占空比我们需要可改变,在程序运行过程中需要修改参数,所以在CubeMX里,这些参数可以不配置;为了方便,我们配置PSC为72-1,这样当ARR从0~65535变化时,可以得到约15Hz-1MHz的频率,如果想要其他频率,则可以修改PSC的值。
在这里插入图片描述

三、主要代码

生成代码以后,在stm32f1xx_hal_tim.h头文件中,有开启或停止PWM的函数:

HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel) 

讯享网
讯享网HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) 

因为我们使用的是TIM3、通道1,因此可通过如下代码开启PWM功能:

HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); 

同样,停止PWM功能代码如下:

讯享网HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_1); 

接下来,需要写一个修改PWM频率及占空比的函数,在stm32f1xx_hal_tim.h头文件中

#define __HAL_TIM_SET_AUTORELOAD(__HANDLE__, __AUTORELOAD__) \ do{ 
      \ (__HANDLE__)->Instance->ARR = (__AUTORELOAD__); \ (__HANDLE__)->Init.Period = (__AUTORELOAD__); \ } while(0) 

用来设置ARR的的值,而__HAL_TIM_SET_AUTORELOAD在stm32_hal_legacy.h中又有如下宏定义:

讯享网#define __HAL_TIM_SetAutoreload __HAL_TIM_SET_AUTORELOAD 

同样,设置CCR的功能定义如下:

#define __HAL_TIM_SetCompare __HAL_TIM_SET_COMPARE 

利用这两个宏我们可以写出配置频率和占空比的函数:

讯享网/* * 函数名:PWM_Config * 功 能:PWM配置,设置频率和占空比 * 参 数:Freq频率,Hz Duty占空比,*100 * 返回值:无 * 说 明:TIM3,Channel1; 时钟72MHz,PSC=72-1,f=72M/((PSC+1)*(ARR+1)),PSC不变; Duty=ccr/arr*100%; 取值0~100,所以计算ccr要除以100 */ void PWM_Config(uint32_t Freq, uint8_t Duty) { 
    uint32_t arr =  / Freq - 1; uint32_t ccr = (uint32_t)Duty * arr / 100; __HAL_TIM_SetAutoreload(&htim3, arr); __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, ccr); } 

四、试验验证

频率1KHz、占空比70%

PWM_Config(1000, 70); 

在这里插入图片描述
从逻辑分析仪捕捉的波形图可看出,一个完整周期时间为1ms,即频率为1KHz,其中高电平为700us,即占空比为70%;
将配置改为2500Hz,占空比为35%,

讯享网PWM_Config(2500, 35); 

在这里插入图片描述
上图可看出,周期为400us,即频率2500Hz,高电平宽度的140us,即占空比为35%;

五、总结

小讯
上一篇 2025-02-14 20:25
下一篇 2025-03-26 19:56

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/15598.html