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

这篇具有很好参考价值的文章主要介绍了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_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
    
***********************************************************/文章来源地址https://www.toymoban.com/news/detail-405182.html

到了这里,关于STM32f103,TIM1,TIM2,TIM3,TIM4,TIM5,TIM8,4路PWM输出配置(保姆级)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32F1定时器(TIM1~TIM8)

    STM32共11个定时器,2个高级控制定时器TIM1和TIM8,4个通用定时器TIM2~TIM5,两个基本定时器TIM6和TIM7,两个看门狗定时器和一个系统滴答定时器Systick. 高级定时器TIM1和TIM8的时钟由APB1产生,其它六个通用定时器的时钟由APB2产生。它们的最大频率都可以配置成系统时钟的频率。 定

    2024年02月15日
    浏览(53)
  • STM32学习笔记 & 通用定时器TIM3~TIM5 13

    通用定时器是一个通过可编程预分频器驱动的 16 位自动装载计数器构成。 它适用于多种场合,包括测量输入信号的脉冲长度 ( 输入捕获 ) 或者产生输出波形 ( 输出比较和PWM)。 使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间

    2024年02月05日
    浏览(83)
  • STM32F105RBT6 使用定时器TIM3输出PWM波

    2.1 相关函数 RCC_APB1PeriphClockCmd、GPIO_Init、TIM_TimeBaseInit、TIM_OC4Init、TIM_OC4PreloadConfig、NVIC_Init、TIM_ITConfig、TIM_Cmd、 3.1 在启动文件里面找到TIM3 对应的中断入口函数,也就是中断服务函数 TIM3_IRQHandler 4.1 中断服务函数需要快速地执行完毕。中断服务函数应该避免执行太多的计算复

    2024年02月08日
    浏览(37)
  • STM32-TIM3-PWM实现不同占空比波形

    目录 硬件准备 PWM介绍 产生PWM方法  TIM3模块介绍  代码部分 详细步骤 总结 首先,需要准备一块带有STM32芯片的开发板,例如STM32F103C8T6或STM32F407VET6。连接开发板到电脑上,并使用Keil,IAR等软件进行编程。本文章用的是Keil软件。 PWM(Pulse Width Modulation)即脉冲宽度调制,在具

    2024年02月03日
    浏览(32)
  • 软件STM32cubeIDE下STM32F1xx使用定时器(TIM8)+DMA+PWM点亮灯带WS2812-基础样例

    好长时间不调试灯带ws2812了,最近项目上,要在STM32F1上进行点灯带ws2812,虽然自己之前做了很多了,但是人有个性质,一旦某个事情做完了,你不在去惦记它了,基本会完全抛在脑后。所以才体现记录的重要性,本次在做STM32F1上验证时,即使之前有经验的情况下,还是掉坑

    2024年02月01日
    浏览(52)
  • 普中STM32-PZ6806L开发板(HAL库函数实现-TIM5 设置 PWM input, 获取频率跟占空比)

    连线 APIs 创建项目 参考 普中STM32-PZ6806L开发板(HAL库函数实现-PWM呼吸灯), 使用同一个GPIO口PC7产生PWM,然后PA0引脚进行捕获 初始化TIM5 CH1 合并通道, 选项为PWM输入到CH1, 这里其实就是合并1和2通道使一个采集上升沿一个采集下降沿 主从模式开启, 先启动会等待另外一个同步启动

    2024年02月19日
    浏览(27)
  • TIM-输出比较(PWM)——STM32

    Oc (Output Compare) 输出比较 输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形 每个高级定时器和通用定时器都拥有4个输出比较通道高级定时器的前3个通道额外拥有死区生成和互补输出的功能 第一步,

    2024年02月10日
    浏览(28)
  • STM32 TIM输出比较、PWM波形

    单片机学习! 目录 一、输出比较简介 二、PWM简介 三、输出比较通道 3.1通用定时器的输出比较部分电路 3.2高级定时器的输出比较部分电路 四、输出模式控制器 五、PWM基本结构 六、PWM参数计算 总结 前言         文章讲述STM32定时器的输出比较功能,它主要用来输出PWM波形

    2024年01月20日
    浏览(49)
  • STM32 TIM2重映射

    最近想弄一个多路输出PWM,但是发现TIM2不能用,根据手册也对它进行重映射了,但是还是不能用,用示波器发现驱动能力比较弱,然后禁用jtag搞定了。 重映射的参数在stm32底层文件可以看到 这里有写 1.不重映射时,默认的IO口是PA0、PA1、PA2、PA3 2.要使用PA15、PB3、PA2、PA3的端

    2024年02月22日
    浏览(21)
  • STM32-HAL库08-TIM的输出比较模式(输出PWM的另一种方式)

    STM32F103C6T6最小系统板 STM32CUBEMX(HAL库软件) MDK5 示波器或者逻辑分析仪 通过定时器TIM的输出比较模式得到预定频率与占空比的PWM波形;其中定时器输出比较模式与PWM模式的区别在于!!! PWM模式在同一个TIM下所有输出口的频率一致不能单独控制单个的频率 ,而输出比较模式

    2024年02月03日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包