【蓝桥杯】_嵌入式编程_PWM模块

目录

定时器的分类

配置PWM输出模块

1.CubeMX配置

2.keil5中配置

输出pwm小练习


定时器的分类

STM32G431x芯片 提供三种类型的定时器 分别为基本定时器 通用定时器 高级定时器

 

 图来源STM32G431RB数据手册.pdf

本次介绍高级定时器的pwm输出功能

何为PWM?
        全称脉冲宽度调节

PWM有什么作用?
         在单位周期内调整高电平持续的时间(术语就是占空比)

大致原理:在一个计数周期内设定一个比较值 当计数器小于这个数可以输出高电平或低电平 一旦大于这个数就状态调反 由此就可以控制高电平的时间。新手入门编程常常用来做呼吸灯,呼吸灯的原理就是高电平持续降低,led逐渐变暗。

配置PWM输出模块

1.CubeMX配置

Tim15_ch1_PA2
Tim15_ch2_PA3

1)找到用拥有tim15的引脚 (可以在cubemx右下角搜索tim15 快速确定相关引脚)

2)配置TIM15使用内部时钟 两个信道  

 GPIO口速率可以调高点

 3)tim15的配置(输出频率)

这里需要注意的配置是Counter period(AUTORELOAD ) 的值这个决定了输出频率

80 000 000 / 80 = 1 000 000 分完频之后 1 000 000 pwm要输出1k 频率 1 000 000/1 000=1000 AUTORELOAD 就要设置为999(1000-1) pwm要输出2k 频率 1 000 000/2 000=500 AUTORELOAD 就要设置为499(500-1)

再hal库中专门设置AUTORELOAD 的宏定义 本质上还是调用了寄存器

/**
  * @brief  Set the TIM Autoreload Register value on runtime without calling another time any Init function.
  * @param  __HANDLE__ TIM handle.
  * @param  __AUTORELOAD__ specifies the Counter register new value.
  * @retval None
    */
    #define __HAL_TIM_SET_AUTORELOAD(__HANDLE__, __AUTORELOAD__) 

4)配置占空比相关

 这里需要注意Pulse的值 它决定了你的pwm的占空比(高电平再单位周期的持续时间)

假如你要输出10%的PWM占空比 你应该用AUTORELOAD的值*10%就能得出Pulse要设置的值 这里300/1000=30% 600/1000=60%可知 pwm channel 1占空比为30% pwm channel 2占空比为60%同时hal库也对应的宏定义修改该寄存器的值

  #define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) 
  @param  __HANDLE__ TIM handle.
  @param  __CHANNEL__ TIM Channels to be configured.
    This parameter can be one of the following values:  
 @arg TIM_CHANNEL_1: TIM Channel 1~6 selected   
 @param  __COMPARE__ specifies the Capture Compare register new value. 

2.keil5中配置

1)将生成的代码更新原有的tim.c文件(用户自定义的保留)

2)主函数 配置初始化

	PWM_Output_TIM15_Init();
	HAL_TIM_PWM_Start(&htim15,TIM_CHANNEL_1);
	HAL_TIM_PWM_Start(&htim15,TIM_CHANNEL_2);	

输出pwm小练习

PA1默认输出1kHz的50%PWM 再次按下B1键后 PA1输出2KHz 10%的脉冲信号 持续5秒钟回到默认状态下


if(key_down==B1)
{
		__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,50);//输出修改 改变pwm信号的占空比  50/500=10%
		__HAL_TIM_SET_AUTORELOAD(&htim2,499);	//10% 2k 1000000/500=2k
		do_time=1;
		uwTick_key_delay = uwTick; 
}
if(((uwTick-uwTick_key_delay)>= 5000)&&(do_time == 1)){
		__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,500);//输出修改  500/1000=50%
		__HAL_TIM_SET_AUTORELOAD(&htim2,999); //%50  1k  1000000/1000=1k
		do_time=0
 }
```

猜你喜欢

转载自blog.csdn.net/shelter1234567/article/details/129307164