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输出配置步骤
-
使能定时器3和相关IO口时钟
RCC_APB1PeriphClockCmd();// 使能定时器3时钟 RCC_APB2PeriphClockCmd();// 使能GPIOB时钟
-
初始化IO口为复用功能输出
GPIO_Init();// 函数 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
-
这里我们是要把PB5用作定时器的PWM输出引脚,所以要重映射配置,所以需要开启AFIO时钟。同时设置重映射。
RCC_APB2PeriphClockCmd(RCC_APB2periph_AFIO,ENABLE); GPIO_PinRemapConfig(GPIO_ParitalRemap_TIM3,ENABLE);
-
初始化定时器:ARR,PSC等
TIM_TimeBaseInit();
-
初始化输出比较参数
TIM_OC2Init();
-
使能预装载寄存器
TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_ENABLE);
-
使能定时器
TIM_Cmd();
-
不断改变比较值CCRx,达到不同的占空比效果
TIM_SetCompare2();
以上是关于STM32PWM输出实验的主要内容,如果未能解决你的问题,请参考以下文章