STM32f103,TIM1到TIM8,4路PWM输出配置(TIM1,2,3,4,5,8)

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

定时器的.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
*********************************************************************************/

#include "pwm.h"
void PWM_Init (u16 arr,u16 psc)
{
    
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;

    
    //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
*****************************************************/

#ifndef __PWM_H__
#define __PWM_H__

#include "sys.h"
#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_GPIO1         GPIOA

#define TIMX_GPIO_CLK2     RCC_APB2Periph_GPIOA
#define TIMX_GPIO_PIN2     GPIO_Pin_7
#define TIMX_GPIO2         GPIOA

#define TIMX_GPIO_CLK3     RCC_APB2Periph_GPIOB
#define TIMX_GPIO_PIN3     GPIO_Pin_0
#define TIMX_GPIO3         GPIOB

#define TIMX_GPIO_CLK4     RCC_APB2Periph_GPIOB
#define TIMX_GPIO_PIN4     GPIO_Pin_1
#define TIMX_GPIO4         GPIOB


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
    
***********************************************************/

  • 6
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
STM32F103微控制器上使用定时器输出PWM信号的步骤如下: 1. 配置GPIO引脚:首先,选择一个合适的GPIO引脚作为PWM输出引脚,并将其设置为复用功能。可以使用GPIO初始化函数来配置引脚。 2. 配置定时器:选择一个合适的定时器(如TIM1、TIM2等),并配置它作为PWM生成器。可以使用定时器初始化函数来配置定时器的模式、计数方向、预分频系数等参数。 3. 配置PWM模式:选择合适的PWM模式,并配置相关参数,如周期、占空比等。可以使用PWM初始化函数来配置PWM模式。 4. 启动定时器:通过使能定时器的计数功能来启动定时器。 下面是一个简单的代码示例,演示了如何在STM32F103配置定时器输出PWM信号: ```c #include "stm32f10x.h" void TIM_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; // 配置GPIO引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置定时器 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); TIM_TimeBaseStructure.TIM_Period = 1000 - 1; // 设置周期为1000个计数单位 TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // 设置预分频系数为72 TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); // 配置PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 500; // 设置占空比为50% TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM1, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); // 启动定时器 TIM_Cmd(TIM1, ENABLE); } int main(void) { // 初始化系统时钟等 // 配置定时器输出PWM TIM_Configuration(); while (1) { // 主循环中可以进行其他任务 } return 0; } ``` 这是一个简单的示例代码,用于在STM32F103配置TIM1通道1为PWM输出模式,并且将GPIOA的Pin 9作为PWM输出引脚。在这个例子中,PWM的周期为1000个计数单位,占空比为50%。你可以根据需要修改这些参数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值