关于STM32F103C8T6工程文件自己免积分下载https://download.csdn.net/download/weixin_45488643/12522971这个仅仅是一个核心工程文件,只需要自己添加以下代码就可以。
PWM简介
脉冲宽度调制(PWM),是英文“Pulse Width Modulation” 的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。
STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出,这样,STM32 最多可以同时产生 30 路 PWM 输出!这里仅使用 TIM1的 CH1 产生一路 PWM 输出。
要使 STM32 的高级定时器 TIM1 产生 PWM 输出,除了上一章介绍的几个寄存器(ARR、PSC、 CR1 等) 外,我们还会用到 4 个寄存器(通用定时器则只需要 3 个),来控制 PWM 的输出。这四个寄存器分别是:捕获/比较模式寄存器( TIMx_CCMR1/2)、捕获/比较使能寄存器(TIMx_CCER)、捕获/比较寄存器(TIMx_CCR1~4) 以及刹车和死区寄存器TIMx_BDTR)。
简单介绍这四个寄存器。首先是捕获/比较模式寄存器(TIMx_CCMR1/2),该寄存器总共有 2 个, TIMx CCMR1和 TIMx CCMR2。 TIMx_CCMR1 控制 CH1 和 CH2,而 TIMx_CCMR2 控制 CH3 和 CH4。
TIMx_CCMR1 寄存器各位描述:
介绍捕获/比较使能寄存器(TIMx_CCER),该寄存器控制着各个输入输出通道的开关。
**TIMx CCER 寄存器各位描述**
捕获/比较寄存器(TIMx_CCR1~4),该寄存器总共有 4 个,对应 4 个
输通道 CH1~4。因为这 4 个寄存器都差不多,仅以 TIMx_CCR1 为例介绍。
**寄存器 TIMx CCR1 各位描述**
在输出模式下,该寄存器的值与 CNT 的值比较,根据比较结果产生相应动作。利用这点,通过修改这个寄存器的值,就可以控制 PWM 的输出脉宽了。
如果是通用定时器,则配置以上三个寄存器就够了,但是如果是高级定时器,则还需要配置:刹车和死区寄存器(TIMx_BDTR),该寄存器各位描述如图所以。
该寄存器,我们只需要关注最高位: MOE 位,要想高级定时器的 PWM 正常输出,则必须设置 MOE 位为 1,否则不会有输出。注意:通用定时器不需要配置这个。
配置步骤:
1) 开启 TIM1 时钟,配置 PA8 为复用输出。要使用 TIM1,我们必须先开启 TIM1 的时钟。这里我们还要配置 PA8 为复用输出(当然还要时能 PORTA 的时钟),这是因为 TIM1_CH1 通道将使用 PA8 的复用功能作为输出。 库函数使能 TIM3 时钟的方法是:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器 3 时钟
设置 PA8 为复用功能输,列出 GPIO 初始化的一行代码即可:
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
2)设置 TIM1 的 ARR 和 PSC。
在开启了 TIM1 的时钟之后,我们要设置 ARR 和 PSC 两个寄存器的值来控制输出 PWM 的周期。当 PWM 周期太慢(低于 50Hz)的时候,我们就会明显感觉到闪烁了。因此, PWM 周期在这里不宜设置的太小。这在库函数是通过 TIM_TimeBaseInit 函数实现的。
TIM_TimeBaseStructure.TIM_Period = arr; //设置自动重装载值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.