STM32学习笔记(9)定时器相关之PWM概述(改)

简介

PWM:Pulse Width Modulation,即脉冲宽度调制,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化。

占空比:指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如对称方波的占空比就是50%.

应用:调光电路,直流斩波电路、蜂鸣器驱动、电机驱动、逆变电路、加湿机雾化量等,广泛应用在从测量、通信到功率控制与变换的许多领域中。

以交流调光电路为例,高电平占多一点,也就是占空比大一点亮度就亮一点,占空比小一点亮度就没有那么亮,前提是PWM的频率要大于我们人眼识别频率,要不然会出现闪烁现象。

原理

在这里插入图片描述
如图:
ARR是自动重装载寄存器(TIMx_ARR)的值,CNT是定时器计数器当前的值,CCRx是捕获/比较寄存器 x(TIMx_CCRx)的值。当计数器 的值CNT小于CCRx,则输出低电平,大于CCRx,则输出高电平,通过改变CCRx的值即可改变占空比,改变ARR的值即可改变周期。

使用相关

工作过程

在这里插入图片描述

1,TIMx_CCMR1寄存器的OC1M[2:0]位,设置输出模式控制器
110:PWM模式1(如果是向上计数,当TIMX_CNT<TIMX_CCRX时通道X为有效电平,否则为无效电平。向下计数时相反,当TIMX_CNT>TIMX_CCRX时通道X为无效电平,否则为有效电平)
111:PWM模式2(如果是向上计数,当TIMX_CNT<TIMX_CCRX时通道X为无效电平,否则为有效电平。向下计数时相反,当TIMX_CNT>TIMX_CCRX时通道X为有效电平,否则为无效电平)

2,计数器值TIMx_CNT与通道1捕获比较寄存器CCR1进行比较,通过比较结果输出有效电平和无效电平
OC1REF=0 无效电平
OC1REF=1 无效电平
3,通过输出模式控制器产生的信号TIMx_CCER寄存器的CC1P位,设置输入/捕获通道1输出极性
0:高电平有效
1:低电平有效
4,TIMx_CCER:CC1E位控制输出使能电路,信号由此输出到对应引脚
0:关闭
1:开启

有效电平与无效电平:
首先,OCxREF是一个参考信号,并且被约定
OCxREF有效则OCxREF=1,即高电平为OCxREF的有效电平;
OCxREF无效则OCxREF=0,即低电平为OCxREF的无效电平。
(即在这里可认为有效电平是高电平,无效电平是低电平)
注意:在其他地方,有无效存在其他意义

相应计算

向上计数,设置PWM模式为2(即TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平),使PSC分频设置成71,ARR的值设置成4999,由TimeOut=(ARR+1)(PSC+1)/Tclk,此时溢出时间为5ms,并且由每一次计数时间为(PSC+1)/Tclk=1μs,此时使CCRx的值为2000,则一个周期内低电平持续时间为2ms,高电平持续时间3ms。占空比为60%。

配置

输出配置步骤

1.使能定时器与相关IO口时钟;
2.初始化IO口为复用功能输出;
3.把相应引脚设置为定时器的PWM输出引脚;(相应引脚在手册查找,如果需要配置重映射,必须开启AFIO时钟,并设置重映射)
4.初始化定时器;(ARR,PSC等)TIM_TimeBaseInit();
5.初始化相应输出比较参数;TIM_OC2Init();
6.使能预装载寄存器;TIM_OC2PreloadConfig();
7.使能定时器;TIM_Cmd();

相关结构体



typedef struct
{
uint16_t TIM_OCMode;     //设置PWM的模式
uint16_t TIM_OutputState;//输出使能/使能  
uint16_t TIM_OutputNState;  
uint16_t TIM_Pulse;        //比较值,即CCRx的值,控制占空比
uint16_t TIM_OCPolarity;    //比较输出极性
uint16_t TIM_OCNPolarity;  
uint16_t TIM_OCIdleState;  
uint16_t TIM_OCNIdleState;  
} TIM_OCInitTypeDef;


PWM模式为2:TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平
PWM模式为1:TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平
(可在TIMx_CCMR1的OCxM位配置这两个模式)

配置范例

void TIM3_PWM_Init(u16 arr,u16 psc)
{
 
  GPIO_InitTypeDef  GPIO_InitStructure;//相关结构体初始化
  TIM_TimeBaseInitTypeDef TIM_TimeBaseInitSrtue;
  TIM_OCInitTypeDef TIM_OCInitStrie;

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;     //LED0-->PB.5 端口配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //IO口速度为50MHz
  GPIO_Init(GPIOB, &GPIO_InitStructure);      //根据设定参数初始化GPIOB.5

  GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);//重映射函数,部分重映射
 
  TIM_TimeBaseInitSrtue.TIM_Prescaler=psc;//预分频系数
  TIM_TimeBaseInitSrtue.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
  TIM_TimeBaseInitSrtue.TIM_Period=arr;//自动装载值
  TIM_TimeBaseInitSrtue.TIM_ClockDivision=TIM_CKD_DIV1;//设置时钟分割:TDTS = Tck_tim
  TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitSrtue);//初始化TIMx的时间基数单位

  TIM_OCInitStrie.TIM_OCMode=TIM_OCMode_PWM2;//模式2
  TIM_OCInitStrie.TIM_OCPolarity=TIM_OCPolarity_High;//输出极性
  TIM_OCInitStrie.TIM_OutputState=TIM_OutputState_Enable;
   TIM_OCInitStrie.TIM_Pulse=100;//设置比较值为100(如果想动态改变占空比,这里不要设置,而是用其它函数设置
  TIM_OC2Init(TIM3,&TIM_OCInitStrie);//初始化输出比较参数
 
  TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能输出比较预装载
 
  TIM_Cmd(TIM3,ENABLE);//使能定时器
}

之后,在主函数调用并输入适当的ARR,PSC值即可

附:相关函数
1.设置比较值函数

void TIM_SetCompareX(TIM_TypeDef*TIMx.uint16_t Compare2);

2.使能输出比较预装载

void TIM_OC2PreloadConfig(TIM_TypeDef*TIMx.uint16_t TIM_OC2Preload);

3.使能自动重装载的预装载寄存器允许位

void TIM_ARRPreloadConfig(TIM_TypeDef*TIMx.FunctionalState NewState);
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值