STM32PWM配置详解笔记

代码

目录

代码

步骤(相关寄存器与函数)

注意与总结


关于STM32的PWM模式配置 ,核心代码如下,以原子的mini板STM32F103RCT6为例子

void TIM1_PWM_Init(u16 arr,u16 psc)//定时器1的PWM初始化
{
	/*结构体变量定义*/
	GPIO_InitTypeDef GPIO_Initstrue;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitstrue;
	TIM_OCInitTypeDef TIM_OCInitstrue;
	/*-------------*/
	/*开启TIM1时钟,配置对应管脚(PA8)为复用输出*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOA,ENABLE);//使能TIM1和GPIOA时钟
	
	GPIO_Initstrue.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽
	GPIO_Initstrue.GPIO_Pin = GPIO_Pin_8;
	GPIO_Initstrue.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_Initstrue);//初始化IO口为复用推挽
	/*---------------------------------------*/
	/*设置TIM1的ARR和PSC*/
	TIM_TimeBaseInitstrue.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式
	TIM_TimeBaseInitstrue.TIM_Period = arr;//设置自动重装载值,决定周期
	TIM_TimeBaseInitstrue.TIM_Prescaler = psc;//设置预分频值,决定周期
	TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitstrue);//定时器初始化
	/*设置TIM1_CH1的PWM模式,通道,使能TIM1的CH1输出*/
	TIM_OCInitstrue.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能
	TIM_OCInitstrue.TIM_OCMode = TIM_OCMode_PWM2;//PWM模式2:向上计数,CNT<CCR1时为有效电平
	TIM_OCInitstrue.TIM_OCPolarity = TIM_OCPolarity_High;//输出极性高
	TIM_OC1Init(TIM1,&TIM_OCInitstrue);//通道1输出PWM
	TIM_CtrlPWMOutputs(TIM1,ENABLE);//TIM1,8需要该函数MOE主输出使能
	TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);//CH1的CCR1预装载寄存器使能
	TIM_ARRPreloadConfig(TIM1,ENABLE);//使能TIM1在ARR上的预装载寄存器
	TIM_Cmd(TIM1,ENABLE);//使能TIM1定时器
}

步骤(相关寄存器与函数)

首先,应当使能对应的定时器与IO口时钟。因为PWM是从定时器的一个通道输出而来的。

第二步,通过ARR,PSC寄存器的值来控制PWM波的周期。如该代码,频率为72000K/(899+1)=80KHz

 

TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitstrue);//定时器初始化

第三步,设置TIM1-CH1的PWM模式,通道

因为min板的LED接PA8,且为低电平亮,所以PWM模式2,CNT<CCR1时,为无效电平,输出极性设置为高,则1为有效电平,无效电平为0,所以灯亮。以下为设置通道的函数。。

TIM_OC1Init(TIM1,&TIM_OCInitstrue);//通道1输出PWM

第四步,使能CH1通道(也是使能CCR1比较寄存器),使能ARR预装载寄存器。

TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);//CH1的CCR1预装载寄存器使能
TIM_ARRPreloadConfig(TIM1,ENABLE);//使能TIM1在ARR上的预装载寄存器

第五步,使能TIM1定时器

TIM_Cmd(TIM1,ENABLE);//使能TIM1定时器

第五步,仅对于高级定时器才需要此步。F103RCT6的高级定时器为TIM1和8,所以需要。使能刹车和死区寄存器(TIM1_BDTR)的MOE位,以使能整个OCx输出。库函数为

TIM_CtrlPWMOutputs(TIM1,ENABLE);//TIM1,8需要该函数MOE主输出使能

第六步,占空比的修改。TIM_SetCompare1(TIM1,a);这个值当然就是CCR1里装载的值   ,但不能大于arr的值!

哦,对了,也有端口重映射的PWM输出。粘上代码如下

这里我们是假设一下,要把PB5用作定时器的PWM输出引脚,所以要重映射配置,        所以需要开启AFIO时钟。同时设置重映射。        

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);         
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);

注意与总结

ARR寄存器的值即自动重装载值,和预分频值共同决定PWM周期。CCRx寄存器的值则是决定着占空比。根据原理,CCRx寄存器的值必须不能大于ARR寄存器的值。。。还有的朋友会疑惑,为啥一个定时器可以同时输出四个通道的PWM,却只有一个CNT计数寄存器,这个嘛,他有一个CNT计数器,却每个通道对应一个CCRx寄存器,这样一来计数归计数,他和四个CCRx寄存器接连比较输出各自的PWM并不矛盾。。。

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值