PWM概述
- 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制,PWM 原理如图:
- STM32F4 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。通过查看开发板的原理图(如下),可发现PF9引脚连接LED0,同时也是作为TIM14_CH1的复用输出端口,知道此前提,我们就可以开始搞事情了。
PWM输出步骤
- 使能定时器14和相关IO口时钟。
使能定时器14时钟:RCC_APB1PeriphClockCmd();
使能GPIOF时钟:RCC_AHB1PeriphClockCmd (); - 初始化IO口为复用功能输出。函数:GPIO_Init();
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能 - GPIOF9复用映射到定时器14
GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); - 初始化定时器:ARR,PSC等:TIM_TimeBaseInit();
- 初始化输出比较参数:TIM_OC1Init();
- 使能预装载寄存器: TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);
- 使能自动重装载的预装载寄存器允许位 TIM_ARRPreloadConfig(TIM14,ENABLE);
- 使能定时器。
- 不断改变比较值CCRx,达到不同的占空比效果:TIM_SetCompare1();
呼吸灯实现
pwm.c
#include "pwm.h"
/*
引脚说明:
LED0灯连接PF9,TIM14通道1
TIM14 -- APB1,定时器频率:84MHZ
*/
void Pwm_Led0_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
TIM_OCInitTypeDef TIM_OCInitStruct; //定时一个该结构体
//开启 TIM14 和 和 GPIO时钟,配置 PF9选择复用功能 AF9 (TIM14)输出。
//库函数使能 TIM14 时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14