目录
定时器的分类
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
}
```