PWM输出——频率占空比可调【STM32】

singlechip

本次实验使用的是蓝桥杯嵌入式大赛的指定开发板,STM32G431R8T6。

下面为 CubeMX 和代码部分

CubeMX定时器配置部分

选择对应引脚的通道设置为PWM输出模式(不要选择CH*N)。

以获取一个100Hz,占空比为50的脉冲信号,现在设置时钟频率为80MHz,参数设置中PSC,ARR需要我们自己配置(当然我们后期实现代码修改频率、占空比的时候会修改这些数据)。

公式1:脉冲频率 = (时钟频率)/ (PSC+1)/(ARR+1)

代入已知数据 100Hz = 80 000 000 / 8 000 / 100 ,求得 PSC = 8000 - 1 ARR = 100 – 1

公式2:占空比  = pulse / ARR

代入已知数据 50 = pulse / (100-1),求得pulse 约为 50

生成代码

pwm.c

#include "pwm.h"

/* PWM调节占空比、频率
 * 参数:htim定时器,Channel定时器通道, freq设置对应的频率, duty设置对应的占空比
 */
void PWM_Set_freq_duty(TIM_HandleTypeDef htim, uint32_t Channel, uint32_t freq, uint32_t duty)
{
	uint64_t tim_clk = 80000000;
	uint32_t prescaler = 8000-1;
	
	float arr = (tim_clk * 1.0) / freq / (prescaler+1) -1;
	float pulse = duty * 1.0 / 100 * (arr+1);
	
	/* 设置预分频值 */
	__HAL_TIM_SET_PRESCALER(&htim, prescaler);
	/* 设置自动重装载的值 */
	__HAL_TIM_SetAutoreload(&htim, arr);
	/* 设置占空比的值 */
	__HAL_TIM_SetCompare(&htim, Channel, pulse);
	
}

/*
	公式:脉冲频率 = (时钟频率)/ (PSC+1)/(ARR+1)
				PSC = 8000-1			ARR = 100 – 1
*/

pwm.h

#ifndef __PWM_H_
#define __PWM_H_

#include "main.h"

void PWM_Set_freq_duty(TIM_HandleTypeDef htim, uint32_t Channel, uint32_t freq, uint32_t duty);

#endif

主函数功能验证部分

  while (1)
  {
		if(keys[0].key_result == ONCE)
		{
			tim17_duty+=10;
			if(tim17_duty>90) tim17_duty = 10;
			PWM_Set_freq_duty(htim17, TIM_CHANNEL_1, tim17_freq, tim17_duty);
			sprintf(lcd_string,"PA7 duty is %d  ",tim17_duty);
			LCD_DisplayStringLine(Line1, (unsigned char *)lcd_string);
			keys[0].key_result = IDLE;
		}
		if(keys[1].key_result == ONCE)
		{
			tim16_freq+=10;
			if(tim16_freq>120) tim16_freq = 40;
			PWM_Set_freq_duty(htim16, TIM_CHANNEL_1, tim16_freq, tim16_duty);
			sprintf(lcd_string,"PA6 freq is %d  ",tim16_freq);
			LCD_DisplayStringLine(Line2, (unsigned char *)lcd_string);
			keys[1].key_result = IDLE;
		}
	}

注意在main函数开始时,我们还需要使能PWM输出:

/* 开启PWM两路输出 */
	HAL_TIM_PWM_Start(&htim16, TIM_CHANNEL_1);			/* 使能后PWM就会输出,但是不可以改变频率和占空比 */
	HAL_TIM_PWM_Start(&htim17, TIM_CHANNEL_1);

演示视频

[【B 站链接 —— 备战 2025 蓝桥杯 —— 嵌入式】](http://【STM32 PWM输出——频率占空比可调】 https://www.bilibili.com/video/BV1XPAae3EPY/?share_source=copy_web&vd_source=4a3d8c11d455291dbb5507669d40a8b8)

相关文章

【蓝桥杯-嵌入式 STM32】ADC、DAC

本次实验使用的是蓝桥杯嵌入式大赛的指定开发板,STM32G431R8T6。 下面为 CubeMX 和代码部分 CubeMX ADC部分 设置引脚选择ADC模式,对应通道选择“Single-ended”(单端输出)。其他默认即可 DAC部分 DAC选择“仅与外部引脚相连”。 生成代码 ad.c ``` #include "ad.h" /* ADC读取函数 * 参数 A...

singlechip

【蓝桥杯-嵌入式 STM32】PWM输入捕获,获取频率占空比

本次实验使用的是蓝桥杯嵌入式大赛的指定开发板,STM32G431R8T6。 下面为 CubeMX 和代码部分 CubeMX 选择对应引脚,配置为定时器模式,设置通道一路为“Input Captu direct mode”(输入捕获直接模式用于读取周期)、一路为“Input Captu inindirect mode”(输入捕获间接模式用于计算占空比)。 预分频(PSC)设置为(时钟频率-...

singlechip

按键判断单击、双击、长按【STM32】

本次实验使用的是蓝桥杯嵌入式大赛的指定开发板,STM32G431R8T6。 下面为CubeMX和代码部分 CubeMX配置 将按键引脚设置为双边沿中断触发模式,并设置上拉电阻。 定时器本次选择TIM3,选择内部时钟源,设置PSC为80-1,COUNTER Period为1000-1,实现1ms定时(频率为80MHz) 并打开定时器中断。 Key.c ``` #inc...

singlechip