STM32PWM输出实验

Posted 想成为大师啊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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();
    

以上是关于STM32PWM输出实验的主要内容,如果未能解决你的问题,请参考以下文章

STM32F103 PWM输出实验(HAL库)

STM32之呼吸灯实验

关于STM32单片机PWM输出实验定时器的问题

基于霸道秉火的STM32F103ZET6嵌入式开发之------基于定时TIM3的PWM实验

正点原子STM32(基于HAL库)3

STM32LL库系列教程——通用定时器PWM实验