目录
一、题目要求
使用TIM3和TIM4,分别输出一个PWM波形,PWM的占空比随时间变化,去驱动你外接的一个LED以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),实现2个 LED呼吸灯的效果。
二、PWM
(一)什么是PWM
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
(二)PWM相关概念
1.pwm的频率
是指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期);也就是说一秒钟PWM有多少个周期。单位: Hz
2.pwm的周期
T=1/f;周期=1/频率
如:50Hz = 20ms,如果频率为50Hz ,也就是说一个周期是20ms, 那么一秒钟就有 50次PWM周期。
3.占空比
是一个脉冲周期内,高电平的时间与整个周期时间的比例
单位: % (0%-100%)
表示方式:20%。
周期: 一个脉冲信号的时间 ,1s内测周期次数等于频率
脉宽时间: 高电平时间
比方说周期的时间是10ms,脉宽时间是8ms 那么低电平时间就是2ms, 总的占空比 8/(8+2)= 80%
这就是占空比为80%的脉冲信号。
而我们知道PWM就是脉冲宽度调制通过调节占空比,就可以调节脉冲宽度(脉宽时间) ,而频率就是单位时间内脉冲信号的次数。
以20Hz 占空比为80% 举例,就是1秒钟之内输出了20次脉冲信号,每次的高电平时间为40ms。
(三)PWM输入模式
1.概念
PWM输入捕获模式是输入捕获模式的特例,
输入捕获就是当连接到定时器的引脚上产生电平变化时对应的捕获装置会立即将当前计数值复制到另一个寄存器中。你可以开启捕获中断然后在中断处理函数中读出保存的计数值。
与输入捕获不同的是PWM输入模式会将同一个输入信号(TI1或TI2)连接到两个捕获装置(IC1和IC2)。这两个捕获装置一个捕获上升沿一个捕获下降沿。TI1FP1、TI2FP2它们中的一个被选择为触发输入且从模式控制器被配置为复位模式。
TIMx_CH1引脚输入一个pwm信号,经过输入滤波和边沿检测之后一路(TI1FP1)给到了IC1,一路(TI1FP2)给到了IC2,从而实现两个捕获通道捕获同一个pwm信号。IC1负责测量pwm信号的周期,而IC2负责测量pwm信号的脉宽。
2.PWM输出模式
①PWM模式1
向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。
②PWM模式2
在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。
(四)PWM模式
1.PWM边沿对齐模式
2.PWM中央对齐模式
(五)PWM操作步骤
- 使能定时器和相关IO口时钟。调用函数:RCC_APB1PeriphClockCmd()
- RCC_APB2PeriphClockCmd();
- 初始化IO口为复用功能输出。调用函数:GPIO_Init();
- 这里是要把PB6用作定时器的PWM输出引脚,所以要重映射配置,所以需要开启AFIO时钟,同时设置重映射;调用函数:RCC_APB2PeriphClockCmd();GPIO_PinRemapConfig();
- 初始化定时器。调用函数:ARR,PSC等:TIM_TimeBaseInit();
- 初始化输出比较参数。调用函数:TIM_OC2Init();
- 使能预装载寄存器。调用函数:TIM_OC2PreloadConfig();
- 使能定时器。调用函数:TIM_Cmd();
- 不断改变比较值CCRx,达到不同的占空比效果;调用函TIM_SetCompare2()
三、工程建立+代码撰写
(一)CubeMX相关配置
1.选择STM32F103C8T6
2.RCC配置
3.配置SYS
4.配置TIM3和TIM4
勾选内部时钟Internal Clock
Channel1选择PWM Generation CH1
Prtscaler (定时器分频系数) : 71
Counter Mode(计数模式):Up
(向上计数模式)
Counter Period(自动重装载值) : 500
CKD(时钟分频因子) :No Division
(不分频 )
5.配置时钟树
6.接下来生成工程,打开进入Keil进行代码编写。
(二)代码撰写
1.main.c文件下添加全局变量
uint16_t pwm=0; //占空比
2.main.c文件的while循环之上添加TIM3和TIM4的PWM通道1开启函数
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1);
3.while循环中添加调用函数
while (pwm< 500)
{
pwm++;
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwm);
__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_1, pwm);
HAL_Delay(1);
}
while (pwm)
{
pwm--;
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwm);
__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_1, pwm);
HAL_Delay(1);
}
HAL_Delay(200);
四、电路连接+效果展示
(一)实物图连接
(二)电路连接
1.STM32F103C8T6和USB to TTL
2.LED和STM32F103C8T6
LED长引脚 | 3V3 |
LED短引脚 | PA6 |
PC13 | PB6 |
(三)效果展示
呼吸灯
五、总结
在同时实现PA6连接的LED与焊接在板子上与PC13连接的LED的呼吸灯之前,单独对焊接在板子上与PC13连接的LED和PA6连接的LED的呼吸灯时,仅实现了外接的LED呼吸灯,即PA6连接的LED的呼吸灯,焊接在板子上的未实现,因为在CubeMX上进行对引脚配置时PB6会出现TIM4_CH1但是PC13并未出现TIM的相关选项,因此无法直接用PC13实现呼吸灯。
六、参考文献
https://blog.csdn.net/as480133937/article/details/103439546
https://blog.csdn.net/u011308691/article/details/38403743
https://blog.csdn.net/gogo0707/article/details/124763231
https://blog.csdn.net/qq_53112972/article/details/127577995