【STM32】TIM和PWM模式配置的基础学习(CT117E电路)

目录

TIM与PWM介绍

TIM

PWM

TIM和PWM的初始化

参考文献(个人觉得有帮助的都加上去了)


TIM与PWM介绍

TIM

【STM32】TIM和PWM模式配置的基础学习(CT117E电路)_第1张图片

对于简单的PWM的输出以及捕获都主要用到向上计数功能。计数值会按照设定的频率(根据预分频器寄存器的值得到设定频率)来计数(计数值存在计数器寄存器中),当计数值(计数器寄存器中的值)达到与自动装载寄存器中的值相等时,又从零计数,周而复始。

【STM32】TIM和PWM模式配置的基础学习(CT117E电路)_第2张图片

【STM32】TIM和PWM模式配置的基础学习(CT117E电路)_第3张图片

PWM

根据配置PWM,使得一个周期内以固定占空比(duty,表示一个周期中高电平所占的比例)输出高电平与低电平。

【STM32】TIM和PWM模式配置的基础学习(CT117E电路)_第4张图片 

     根据stm32f103rbt6.pdf的第19页可以看到TIM3的通道1和通道2对应的引脚分别为PA6,PA7,TIM2的通道2和通道3对应的引脚为PA1,PA2。我们常用到以下四个引脚来配置PWM的输出和捕获。

【STM32】TIM和PWM模式配置的基础学习(CT117E电路)_第5张图片

TIM和PWM的初始化

这里以TIM2的通道2和3(TIM2_CH2、TIM2_CH3)为例,来配置PWM的输出的初始化

void PWM_INITOutput(u16 arr,u16 pre,u16 OC2pluse,u16 OC3pluse)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_OCInitTypeDef TIM_OCInitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	TIM_TimeBaseInitStructure.TIM_Period=arr-1;//一个计数周期的整个计数值大小,是从0开始计数所以要减去1
	TIM_TimeBaseInitStructure.TIM_Prescaler=pre-1;//分频大小,分频后最终的计数频率为:(72M/pre)Hz;
	TIM_TimeBaseInitStructure.TIM_CounterMode=0x0;//记住
	TIM_TimeBaseInitStructure.TIM_ClockDivision=0x0;//记住
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
	
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;//PWM2模式时配置极性为LOW(PWM1模式时配置极性为High):这样配置,占空比的数值就是对应的pluse的值
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;//低电平有效
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//要用时就ENABLE(打开),不用该输出时就DISABLE(关闭)
	TIM_OCInitStructure.TIM_Pulse=OC2pluse;
	TIM_OC2Init(TIM2,&TIM_OCInitStructure);
	
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse=OC3pluse;
	TIM_OC3Init(TIM2,&TIM_OCInitStructure);
	
	TIM_CtrlPWMOutputs(TIM2,ENABLE);
	TIM_Cmd(TIM2,ENABLE);
}

 这个地方困扰了我很久,直到看到下面这篇博客

	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;//PWM2模式时配置极性为LOW(PWM1模式时配置极性为High):这样配置,占空比的数值就是对应的pluse的值
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;//低电平有效
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//要用时就ENABLE(打开),不用该输出时就DISABLE(关闭)
	TIM_OCInitStructure.TIM_Pulse=OC2pluse;
	TIM_OC2Init(TIM2,&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;//PWM2模式时配置极性为LOW(PWM1模式时配置极性为High):这样配置,占空比的数值就是对应的pluse的值

 首先需要知道:TIM_OCInitStructure.TIM_Pulse=CCR1_Value;也就是说TIM_Pulse的值赋值到TIMx_CCR1。

PWM2模式是由CCMR1的OC1M和OC2M来决定的,因为我们选择的是是通道1,所以设置的是OC1M,再看相关介绍OC1M[2:0]:输出比较1模式(Output compare 1 enable)

110:PWM模式1- 在向上计数时,一旦TIMx_CNT有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。
111:PWM模式2- 在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为有效电平,否则为无效电平。

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低,所以这里我们设置的CC2P是1

CC1P:输入/捕获1输出极性(Capture/Compare 1 output polarity)  位1 
CC1通道配置为输出:0:OC1高电平有效    1:OC1低电平有效

看了上面要是对输出电平又疑惑可以看这篇博客:STM32输出PWM时,PWM1和PWM2的区别 https://blog.csdn.net/kinsno/article/details/46763243

若arr=1000,pre=72,OC1pluse=400,OC2pluse=800.

常用参数的计算公式(可以根据公式配置想要的参数值):

Duty(占空比,注意:这是根据以上配置求得的):

Duty=\frac{pluse*100}{arr}

Fre(频率):

Fre=\frac{72000000}{pre*arr}

参考文献(个人觉得有帮助的都加上去了)

[1] 定时器周期计算公式 https://blog.csdn.net/weixin_30457465/article/details/96171032

[2] 定时器TIM和PWM的输出 https://blog.csdn.net/huangyangquan/article/details/78819941

[3] STM32的TIM中的OCMode设置 http://blog.sina.com.cn/s/blog_be25f0c101017qfs.html

[4] 关于PWM输出的,图中的设置的,TIM1脉冲宽度调制模式2与其他模式有什么区别? https://bbs.csdn.net/topics/390531641 

[6] 蓝桥杯嵌入式开发经验分享(9.PWM模式配置) https://blog.csdn.net/qq_34952376/article/details/81172361

[7] STM32输出PWM时,PWM1和PWM2的区别 https://blog.csdn.net/kinsno/article/details/46763243

你可能感兴趣的:(嵌入式,stm32,嵌入式)