STM32PWM输出实验

参考正点原子视频

STM32 PWM工作过程

在这里插入图片描述
通道(1)为例
在这里插入图片描述
CCR1:捕获比较(值)寄存器(x=1,2,3,4):设置比较值。

CCMR:OC1M[2 : 0]位:对于PWM方式下,用于设置PWM模式1【110】或者PWM模式2【111】

CCER:CC1P位:输入/捕获1输出极性。0:高电平有效,1:低电平有效。

CCER:CC1E位:输入/捕获1输出使能。0:关闭,1:打开。

PWM模式1 & PWM模式2

寄存器TIMx_CCMR1的OC1M[2:0]位来分析:

PWM模式1或PWM模式2:决定什么时候是有效电平,什么时候是无效电平

CCER:CC1E和CCER:CC1P:决定是高电平有效,还是低电平有效
在这里插入图片描述

向上计数配置

当TIMx_CR1寄存器中的DIR位为低的时候执行向上计数。

在这里插入图片描述

PWM模式

脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率,由TIMx_CCRx寄存器确定占空比的信号

在TIMx_CCRx寄存器中的OCxM位写入‘110’(PWM模式1)或者 ‘111’(PWM模式2),能够独立地设置每个OCx输出通道产生一路PWM。必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预分频寄存器,最后还要设置TIMx_CR1寄存器的ARPE位,(在向上计数或中心对称模式中)使能自动重装载的预装载寄存器

void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);

void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx,FunctionalState NewState);

自动重载的预装载寄存器

在这里插入图片描述

void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);

ARPE=0,ARR立即生效;APRE=1,ARR下个比较周期生效

定时器1的引脚复用功能映像

在这里插入图片描述

定时器2的引脚复用功能映像:

在这里插入图片描述

定时器3的引脚复用功能映像:

在这里插入图片描述

定时器4的引脚复用功能映像:

在这里插入图片描述

PWM输出库函数

void TIM_OCxInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

TIM_OCInitTypeDef结构体

typedef struct
{
	uint16_t TIM_OCMode;// PWM模式1或者模式2
	uint16_t TIM_OutputState;// 输出使能OR失能
	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;
	TIM_OCInitTypeDef TIM_OCInitStructure;//定义结构体
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//选择定时器模式,TIM脉冲宽度调制模式2
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//输出比较极性低
  TIM_OCInitStruct.TIM_Pulse=100;
  TIM_OC1Init(TIM3, &TIM_OCInitStructure);//根据结构体信息进行初始化
  TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能定时器TIM2在CCR1上的预装载值

设置比较值函数

void TIM_SetCompareX(TIM_TypeDef* TIMx, uint16_t Compare2);

使能输出比较预装载

void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);

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

void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);

PWM输出配置步骤

  1. 使能定时器3和相关IO口时钟

    RCC_APB1PeriphClockCmd();// 使能定时器3时钟
    RCC_APB2PeriphClockCmd();// 使能GPIOB时钟
    
  2. 初始化IO口为复用功能输出

    GPIO_Init();// 函数
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
    
  3. 这里我们是要把PB5用作定时器的PWM输出引脚,所以要重映射配置,所以需要开启AFIO时钟。同时设置重映射。

    RCC_APB2PeriphClockCmd(RCC_APB2periph_AFIO,ENABLE);
    GPIO_PinRemapConfig(GPIO_ParitalRemap_TIM3,ENABLE);
    
  4. 初始化定时器:ARR,PSC等

    TIM_TimeBaseInit();
    
  5. 初始化输出比较参数

    TIM_OC2Init();
    
  6. 使能预装载寄存器

    TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_ENABLE);
    
  7. 使能定时器

    TIM_Cmd();
    
  8. 不断改变比较值CCRx,达到不同的占空比效果

    TIM_SetCompare2();
    
  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值