PWM配置介绍

PWM配置介绍

本文以总结性语言介绍基础的PWM配置过程,普遍适用于有PWM外设的MCU,以下以stm32为例。

名词介绍

PWM: 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制。简单理解一种方波信号

在这里插入图片描述

周期:一个脉冲信号时间。不严谨理解,一个高电平和低电平加起来的时间。就图中T的时间。如1ms。

占空比:一个周期内,高电平在周期中比例。如25%。

频率一秒内周期数。如1000hz=1khz,一秒有1000个周期。
​ 周期与频率换算:周期 = 1/频率,如 周期 + 1/1000hz = 0.001s = 1ms。

(后面会讲怎么在配置中设置这些参数)


配置

开启RCC时钟

包括定时器(选一个定时器产生pwm)和引脚时钟。注意是在APB1还是APB2,不知道看芯片手册的时钟树`

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使用RCC开启GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);//APB2总线中的TIM1设为使能

配置输出引脚

配置所选择定时器的通道对应的引脚。一般为推完输出。注意是否重映射,不懂翻芯片引脚图。(以上两个步骤和点亮一个LED灯管脚配置差不多一样,相信你可以的)

GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHZ速度
GPIO_Init(GPIOA,&GPIO_InitStructure);

配置定时器(重点)

主要有自动重装值(Period),预分频值(Prescaler),时钟分频(ClockDivision),计数模式(CounterMode)。
前提是知道定时器时钟频率(不知道自己的就翻自己芯片的手册)。这里假如是72MHz

CounterMode:时钟分频。就讲主频分频,一般为TIM_CKD_DIV1,即分1频,72MHz/1=72MHz。(注意,如果你直接填“1”,它会 72MHz/(1+1)=35MHz;填“0”,72MHz/(0+1)=72MHz。)

Prescaler:预分频系数。就设置定时器计数的频率的系数。预分频系数 = 分频后的频率 / 定时器计数的频率 + 1。
假如我分频后为36MHz,想设置1MHz的计时频率(就1/1000 000=1us计数一次),那么Prescaler = 36000 000 / 1000 000 - 1=35

Period:自动重装值。在定时器计数的频率的基础上,计数Period次。就设置pwm周期时长。比如我要设置1ms周期的PWM,在配置了1MHz(1us)的计时频率的情况下,Period = 1ms / 1us - 1= 999

CounterMode:计数模式,一般为向上计数,即TIM_CounterMode_Up

TIM_InternalClockConfig(TIM1);//TIM1使用内部时钟//72MHz
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//设置时钟分频为1分频,72MHz
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//设置为向上向上计数
TIM_TimeBaseInitStructure.TIM_Period=1000-1;//自动重装【ARR】值 0<ARR<65535,周期为1kHz,即1ms
TIM_TimeBaseInitStructure.TIM_Prescaler=72-1;//预分频【PSC】值 0<PSC<65535,1MHz计数频率
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStructure);//初始化时基单元

PWM输出配置

主要是输出比较模式(TIM_OCMode)、输出比较极性(TIM_OCPolarity)、捕获比较寄存器值(TIM_Pulse)和输出比较输出状态(TIM_OutputState),其他配置如互补输出,空闲状态暂时用不到,就不展开了,感兴趣自己去查询。

TIM_OCMode:设置输出比较模式,一般为TIM_OCMode_PWM1,PWM模式1,当定时器计数从0到比较值(TIM_Pulse)时,输出保持活动状态(TIM_OCPolarity);当计数超过比较值时,输出变为非活动状态。模式2则相反,其他模式暂不展开。

TIM_OCPolarity:活跃状态的时候,是输出高电平还是输出低电平。

TIM_Pulse:捕获比较寄存器值,即用来设置占空比的。0 < TIM_Pulse < Period。在上述基础上,我想设置40%的占空比,那么TIM_Pulse = 400。

TIM_OutputState:用来开启设置占空比的,一般为开启,TIM_OutputState_Enable

TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//设置输出比较模式为PWM1模式
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//REF有效时,输出高电平(有效电平为高电平)
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//设置为使能
TIM_OCInitStructure.TIM_Pulse=400;//设置【CCR】捕获比较寄存器值,占空比

启动定时器

定时器通道使能,定时器使能。

TIM_OC1Init(TIM1,&TIM_OCInitStructure);//初始化TIM1的OC1通道(通常连接到PA8引脚)以输出PWM波形
TIM_OC2Init(TIM1,&TIM_OCInitStructure);//初始化TIM1的OC2通道(通常连接到PA9引脚)以输出PWM波形。
TIM_OC3Init(TIM1,&TIM_OCInitStructure);//初始化TIM1的OC3通道(通常连接到PA10引脚)以输出PWM波形。
TIM_CtrlPWMOutputs(TIM1,ENABLE);//使能了TIM1的PWM输出控制。

TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);//OC1预装载寄存器使能(占空比)
TIM_OC2PreloadConfig(TIM1,TIM_OCPreload_Enable);//OC2预装载寄存器使能
TIM_OC3PreloadConfig(TIM1,TIM_OCPreload_Enable);//OC3预装载寄存器使能
TIM_ARRPreloadConfig(TIM1,ENABLE);//TIM1在ARR上预装载寄存器使能(周期)
	
TIM_Cmd(TIM1,ENABLE);//启动定时器1

作用

通过控制频率(周期时长)和占空比来实现等效作用。

比如单片机引脚高电平输出5v低电平输出0v,要输出2.5v该怎么做?当然是选择一个合适的频率,输出占空比50%,让他等效输出2.5v。

在此基础上,就可以实现LED呼吸灯,电机控制,功率控制,信号调制等。


碎碎念:最近在弄用国产32控无刷电机,现当个笔记逐步记录电机控制的相关内容,后面应该会慢慢写手搓FOC的过程

  • 18
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值