PWM介绍(STM32库函数)

简介

PWM是 Pulse Width Modulation的缩写。
它是利用微处理器的数字输出来对模拟电路进行控制的一种技术。
可应用与电机控制,测量,通信,开关电源等

使用STM32库函数输出PWM详解

STM32f103ZET6
使用正点原子提供的底层库,仅从库函数上面作理解
先看定时器的使能

typedef struct
{
  uint16_t TIM_Prescaler;         /*!< 指定用于分割定时时钟的预分频器值。
                                       此参数可以是介于0x0000和0xFFFF之间的数字 */

  uint16_t TIM_CounterMode;       /*!< 指定计数器模式。
                                       此参数可以是@ref TIM_Counter_Mode的值 */

  uint16_t TIM_Period;            /*!< 指定要加载到活动
                                       在下一个更新事件中自动重新加载注册。
                                       此参数必须是介于0x0000和0xFFFF之间的数字。  */ 

  uint16_t TIM_ClockDivision;     /*!< 指定时钟分区。
                                       此参数可以是@ref TIM_Clock_Division_CKD的值 */

  uint8_t TIM_RepetitionCounter;  /*!< 指定时钟分区。
                                       此参数可以是@ref TIM_Clock_Division_ckd指定重复计数器值的值。每次RCR下降计数器
                                       达到零时,将生成更新事件并重新开始计数
                                       从RCR值(N)开始。
                                       这意味着在脉宽调制模式下,(N+1)对应于:
                                       -边缘对齐模式下的脉宽调制周期数
                                       -中心对准模式下的半脉宽调制周期数
                                       此参数必须是介于0x00和0xFF之间的数字。
                                       @注意:此参数仅对TIM1和TIM8有效。 */
} TIM_TimeBaseInitTypeDef; 

格外注意两个值
TIM_Prescaler、TIM_Period
预分频值和自动重装载值
可以说当对这两个赋值就是在决定PWM的周期和频率
计算方式

频率(Hz)=72000000/(TIM_Prescaler+1)/(TIM_Period+1)

TIM_CounterMode是计数模式,计算模式有三种
(1)向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),
然后重新从0开始计数并且产生一个计数器溢出事件。
(2)向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,
然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。
(3)中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,
产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件,
然后再从0开始重新计数。

TIM_ClockDivision 是时钟分割
可设置分割因子为1、2或者4

所以使能定时器的部分就有:使能GPIO时钟、初始化PWM输出引脚、设定预分频值和自动重装载值、设定计数模式、设定时钟分割等
接下来看PWM通道使能部分

typedef struct
{
  uint16_t TIM_OCMode;        /*!< 指定TIM模式。
                                   此参数可以是@ref TIM_Output_Compare_和_PWM_模式的值 */

  uint16_t TIM_OutputState;   /*!< 指定TIM输出比较状态。
                                   此参数可以是@ref TIM_Output_Compare_state的值 */

  uint16_t TIM_OutputNState;  /*!< 指定TIM互补输出比较状态。
								   此参数可以是@ref TIM_Output_Compare_N_state的值
								   @注意:此参数仅对TIM1和TIM8有效。 */

  uint16_t TIM_Pulse;         /*!< 指定要加载到捕获比较寄存器中的脉冲值。
								   此参数可以是介于0x0000和0xFFFF之间的数字*/

  uint16_t TIM_OCPolarity;    /*!< 指定要加载到捕获比较寄存器中的脉冲值。
							       此参数可以是介于0x0000和0xFFFF之间的数字,指定输出极性。
							       此参数可以是@ref TIM_Output_Compare_Polarity的值 */

  uint16_t TIM_OCNPolarity;   /*!< 指定互补输出极性。
								   此参数可以是@ref TIM_Output_Compare_N_Polarity的值
								   @注意:此参数仅对TIM1和TIM8有效。 */

  uint16_t TIM_OCIdleState;   /*!< 指定空闲状态下的TIM输出比较引脚状态。
								   此参数可以是@ref TIM_Output_Compare_Idle_State的值
							   	   @注意:此参数仅对TIM1和TIM8有效。*/

  uint16_t TIM_OCNIdleState;  /*!< 指定空闲状态下的TIM输出比较引脚状态。
                                   此参数可以是@ref TIM_Output_Compare_N_Idle_State的值
                                   @注意:此参数仅对TIM1和TIM8有效。 */
} TIM_OCInitTypeDef;

TIM_OCMode是PWM模式
PWM模式1:
在向上计数时,一旦TIMx_CNT<TIMx_CCRX时通道X为有效电平,否则为无效电平;
在向下计数时,一旦TIMx_CNT>TIMx_CCRX时通道X为无效电平,否则为有效电平。
PWM模式2:
在向上计数时,一旦TIMx_CNT<TIMx_CCRX时通道X为无效电平,否则为有效电平;
在向下计数时,一旦TIMx_CNT>TIMx_CCRX时通道X为有效电平,否则为无效电平。
TIMx_CNT是定时器计数值,其中CCRX可以说即是TIM_Pulse,
当定时器计数与TIM_Pulse比较即可判断应该产生高电平还是低电平
TIM_Pulse可以说是占空比
通俗理解

PWM占空比 = TIM_Pulse / TIM_Period

TIM_OCPolarity设置电平极性
TIM_OutputState 用来设置比较输出使能,使能PWM 输出到端口
所以使能PWM部分的需要做的有设置PWM模式,设定占空比,设置计较输出使能,设定电平极性

原创文章 23 获赞 49 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43086497/article/details/105847478