失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > STM32f103 TIM1 TIM2 TIM3 TIM4 TIM5 TIM8 4路PWM输出配置(保姆级)

STM32f103 TIM1 TIM2 TIM3 TIM4 TIM5 TIM8 4路PWM输出配置(保姆级)

时间:2023-01-26 03:28:21

相关推荐

STM32f103 TIM1 TIM2 TIM3 TIM4 TIM5 TIM8 4路PWM输出配置(保姆级)

没什么可说的,想说的都写在注释里了,重要的事情说三遍:看注释,看注释,看注释

定时器的.c文件:

/*****************************************************************************

TIM1,TIM2,TIM3,TIM4,TIM5,TIM8输出4路PWM配置

要用TIM2-TIM5记得注销TIM1,TIM8

要用TIM1,TIM8记得注销TIM2-TIM5

默认:TIM2-TIM5

注意:要使用TIM8的话别忘记把

TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset ;

的注释取消掉,TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset ;

的具体位置在下方。

arr和psc要自己配置(根据自己的需要配置)

公式:

72MHz / ((arr+1)*(psc+1)) =F(HZ)

T=1/F(s)

配置方式:

在主函数加入PWM_Init (999,0);

我的arr和psc的默认值分别是

arr=999,psc=0

*********************************************************************************/

void PWM_Init (u16 arr,u16 psc)

{

GPIO_InitTypeDef GPIO_InitStructure;

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_OCInitTypeDef TIM_OCInitStructure;

PWM_motor_Init();

//RCC_APB2PeriphClockCmd(TIMX_CLKCmd2, ENABLE);//TIM1,TIM8

RCC_APB1PeriphClockCmd(TIMX_CLKCmd, ENABLE);//TIM2--TIM5(TIM2,TIM3,TIM4,TIM5)

//PWM端口1

RCC_APB2PeriphClockCmd(TIMX_GPIO_CLK1, ENABLE);

GPIO_InitStructure.GPIO_Pin = TIMX_GPIO_PIN1;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(TIMX_GPIO1, &GPIO_InitStructure);

//PWM端口2

RCC_APB2PeriphClockCmd(TIMX_GPIO_CLK2, ENABLE);

GPIO_InitStructure.GPIO_Pin = TIMX_GPIO_PIN2;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(TIMX_GPIO2, &GPIO_InitStructure);

//PWM端口3

RCC_APB2PeriphClockCmd(TIMX_GPIO_CLK3, ENABLE);

GPIO_InitStructure.GPIO_Pin = TIMX_GPIO_PIN3;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(TIMX_GPIO3, &GPIO_InitStructure);

//PWM端口4

RCC_APB2PeriphClockCmd(TIMX_GPIO_CLK4, ENABLE);

GPIO_InitStructure.GPIO_Pin = TIMX_GPIO_PIN4;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(TIMX_GPIO4, &GPIO_InitStructure);

//TIME配置模式

TIM_TimeBaseStructure.TIM_Period = arr;

TIM_TimeBaseStructure.TIM_Prescaler = psc;

TIM_TimeBaseStructure.TIM_ClockDivision = 0;

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIMX, &TIM_TimeBaseStructure);

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

TIM_OCInitStructure.TIM_Pulse = 0;

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

//TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset ;//TIM8关闭空闲状态(使用TIM8时候开启)

/*********************************************************************************

空闲状态是MOE DISABLE的时候输出值哈。因为你要先配置好所有的寄存器才会去开启MOE的,

这样对互补驱动来说很有用的。因为P MOSFET和N MOSFET的驱动是相反的,有些情况下IDLE

下是要高电平或者是要低电平的。但是我一直都是用低电平,我配置为高电平的时候,之前

出过问题,就是MOE开启的时候,互补驱动中间是不会插入死去的,2个驱动会有重叠部分,

相当于桥臂会直通。但是TIMER1有一个比较厉害的地方那个就是当MCU的主时钟挂掉了,驱动

还是可以保证互补的。

***********************************************************************************/

//TIME使能

TIM_OC1Init(TIMX, &TIM_OCInitStructure);

TIM_OC2Init(TIMX, &TIM_OCInitStructure);

TIM_OC3Init(TIMX, &TIM_OCInitStructure);

TIM_OC4Init(TIMX, &TIM_OCInitStructure);

TIM_CtrlPWMOutputs(TIMX, ENABLE);

TIM_OC1PreloadConfig(TIMX, TIM_OCPreload_Enable);

TIM_OC2PreloadConfig(TIMX, TIM_OCPreload_Enable);

TIM_OC3PreloadConfig(TIMX, TIM_OCPreload_Enable);

TIM_OC4PreloadConfig(TIMX, TIM_OCPreload_Enable);

TIM_ARRPreloadConfig(TIMX, ENABLE);

TIM_Cmd(TIMX, ENABLE);

}

定时器的.h

/*****************************************************

PWM设置

TIM1,TIM8:

设置TIM1或TIM8时要改一下#define TIMX_CLKCmd2的配置

默认:TIM1

TIM2-TIM5:

设置TIM2,TIM3,TIM4,TIM5时改一下TIMX_CLKCmd的配置

默认:TIM3

要用TIM2-TIM5记得注释TIM1,TIM8

要用TIM1,TIM8记得注释TIM2-TIM5

*****************************************************/

#define TIMX TIM3

//#define TIMX_CLKCmd2 RCC_APB2Periph_TIM1//TIM1,TIM8

#define TIMX_CLKCmd RCC_APB1Periph_TIM3//TIM2-TIM5(TIM2,TIM3,TIM4,TIM5)

#define TIMX_GPIO_CLK1 RCC_APB2Periph_GPIOA

#define TIMX_GPIO_PIN1 GPIO_Pin_6

#define TIMX_GPIO1GPIOA

#define TIMX_GPIO_CLK2 RCC_APB2Periph_GPIOA

#define TIMX_GPIO_PIN2 GPIO_Pin_7

#define TIMX_GPIO2GPIOA

#define TIMX_GPIO_CLK3 RCC_APB2Periph_GPIOB

#define TIMX_GPIO_PIN3 GPIO_Pin_0

#define TIMX_GPIO3GPIOB

#define TIMX_GPIO_CLK4 RCC_APB2Periph_GPIOB

#define TIMX_GPIO_PIN4 GPIO_Pin_1

#define TIMX_GPIO4GPIOB

void PWM_motor_Init (void);

void PWM_Init (u16 arr,u16 psc);

/**********************************************************

TIM1 TIM2 TIM3 TIM4 TIM5 TIM8

CH1 PA8 PA0 PA6 PB6 PA0 PC6

CH2 PA9 PA1 PA7 PB7 PA1 PC7

CH3 PA10 PA2 PB0 PB8 PA2 PC8

CH4 PA11 PA3 PB1 PB9 PA3 PC9

注:这里TIM2和TIM5引脚配置一样

如果要同时使用TIM2和TIM5的话可以把TIM2进行端口复用,

在RCC_APB1PeriphClockCmd(TIMX_CLKCmd, ENABLE);//TIM2--TIM5(TIM2,TIM3,TIM4,TIM5)

下方加入RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);即可

然后把TIM2或者TIM5的引脚改成复用引脚

下面是TIM2的复用引脚

TIM2:

CH1 PA5 PA15

CH2 PB3

CH3 PB10

CH4 PB11

***********************************************************/

如果觉得《STM32f103 TIM1 TIM2 TIM3 TIM4 TIM5 TIM8 4路PWM输出配置(保姆级)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。