草庐IT

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

插电就能用 2023-04-09 原文

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

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

有关STM32f103,TIM1,TIM2,TIM3,TIM4,TIM5,TIM8,4路PWM输出配置(保姆级)的更多相关文章

  1. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

    文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

  2. STM32的HAL和LL库区别和性能对比 - 2

    LL库和HAL库简介LL:Low-Layer,底层库HAL:HardwareAbstractionLayer,硬件抽象层库LL库和hal库对比,很精简,这实际上是一个精简的库。LL库的配置选择如下:在STM32CUBEMX中,点击菜单的“ProjectManager”–>“AdvancedSettings”,在下面的界面中选择“AdvancedSettings”,然后在每个模块后面选择使用的库总结:1、如果使用的MCU是小容量的,那么STM32CubeLL将是最佳选择;2、如果结合可移植性和优化,使用STM32CubeHAL并使用特定的优化实现替换一些调用,可保持最大的可移植性。另外HAL和L

  3. ruby-on-rails - 如何使用 Tim Pope 的 cucumber.vim 插件? - 2

    我已经按照说明将cucumber.vim文件加载到ftplugin和其他目录中,但我对ftplugin语法的理解还不足以弄清楚如何获得全部好处。据我所知,该插件应该能够在步骤定义和功能文件之间跳转,但我无法弄清楚我的映射有什么问题。看起来映射应该是通常的ctag映射Ctrl+],但这不起作用。对如何使这些映射起作用有什么想法吗?这是插件的链接:http://github.com/tpope/vim-cucumber/tree/master干杯! 最佳答案 原来我没有打开文件类型插件和文件类型缩进功能。只需将以下内容添加到您的.vim

  4. 蓝桥杯 stm32 MCP4017 - 2

    本文代码使用HAL库。文章目录前言一、MCP4017的重要特性二、MCP4017计算RBW阻值三、MCP4017地址四、MCP4017读写函数五、CubeMX创建工程(利用ADC测量MCP4017电压)、对应代码:总结前言一、MCP4017的重要特性蓝桥杯板子上的是MCP4017T-104ELT,如图1。MCP4017是一个可编程电阻,通过写入的数值可以改变电阻的大小。重点在于6引脚(W),5引脚(B&#

  5. STM32 OTA应用开发——通过USB实现OTA升级 - 2

    STM32OTA应用开发——通过USB实现OTA升级目录STM32OTA应用开发——通过USB实现OTA升级前言1环境搭建2功能描述3BootLoader的制作4APP的制作5烧录下载配置6运行测试结束语前言什么是OTA?百度百科:空中下载技术(Over-the-AirTechnology;OTA),是通过移动通信的空中接口实现对移动终端设备及SIM卡数据进行远程管理的技术。经过公网多年的应用与发展,已十分成熟,网络运营商通过OTA技术实现SIM卡远程管理,还能提供移动化的新业务下载功能。实际上,现在我们所说的OTA比百度百科的定义还要更广泛,OTA的形式已经不再局限于手机和SIM卡,只要涉及

  6. 【毕业设计】基于单片机的智能温控农业大棚系统 - 物联网 stm32 - 2

    文章目录1简介2绪论2.1课题背景与目的3系统设计详细设计描述3.2硬件部分温度测量电路其他电路部分3.3软件部分主程序子系统程序温湿度程序流程键盘显示子程序3.4实现效果3.5部分相关代码4最后1简介Hi,大家好,这里是丹成学长,今天向大家介绍一个单片机项目基于单片机的智能温控农业大棚系统大家可用于课程设计或毕业设计单片机-嵌入式毕设选题大全及项目分享:https://blog.csdn.net/m0_71572576/article/details/1254090522绪论2.1课题背景与目的近年来我国的温室控制取得了长足的进步,首先在温室群控制方面,进行了初步的探索和理论研究,其次在温室

  7. STM32+ESP8266接入云(3) - 2

    解析数据     进入阿里云的IOTStdio,点击新建项目。         新建项目后点击新建Web应用。名称     应用名称随便填写              创建完成后我们进入应用。    在左侧组件处拖入一个指示灯和一个开关。     点击指示灯组件,点击配置数据源     选择我们的产品、数据、和属性。     我们还可以配置开和关的显示颜色。    点击按钮,配置交互动作。     选择设备和属性,设置值位置点击数据来源,选择组件值     配置完成后进入预览,点击按钮,在esp8266就会收到来自平台的json格式的数据,MCU端需要做的就是解析来自平台的数据,进而达到控制下

  8. STM32F103C8T6编码器电机的使用 - 2

    目录前言一、定时器部分和按键部分二、PWM调速三、电机驱动部分​​​​​​​三、编码器接口部分(测速)四.主函数总结​​​​​​​推荐STM32学习课程:[6-8]编码器接口测速_哔哩哔哩_bilibili[6-8]编码器接口测速是STM32入门教程-2022持续更新中的第20集视频,该合集共计30集,视频收藏或关注UP主,及时了解更多相关视频内容。https://www.bilibili.com/video/BV1th411z7sn/?p=20&spm_id_from=pageDriver&vd_source=ed36b2700bbc2bac7746c270bc391540OLED显示屏代码

  9. STM32F103C8T6—库函数应用I2C/SPI驱动OLED显示中文、字符串 - 2

    文章目录1.I2C与SPI通信协议对比2.四脚OLED与六脚OLED3.I2C驱动OLED显示oled.h&oled.c:汉字取模&oledfont.h:main.c显示示例:连线方法:4.SPI驱动OLED显示1.I2C与SPI通信协议对比I2C(Inter-IntegratedCircuit)SPI(SerialPeripheralInterface)传输方式半双工全双工传输速度低速,100Kbps----4Mbps高速,30Mbps以上几线制4线制:VCC,GND,SCL,SDA6/7线制:VCC,GND,SCLK(D0),MOSI(D1/SDA),DC,CS/SS主从模式多主机总线,通

  10. 【STM32】LCD液晶显示 - 2

    🐱作者:一只大喵咪1201🐱专栏:《STM32学习》🔥格言:你只管努力,剩下的交给时间!LCD显示📺LCD简介📺TFTLCD驱动原理📺ILI9341液晶控制器简介🃏液晶屏的信号线及8080时序📺使用STM32的FSMC模拟8080接口时序📺硬件连接📺代码实现📺字符显示🃏英文字符显示🃏英文字符串的显示📺总结📺LCD简介显示器属于计算机的I/O设备,即输入输出设备。它是一种将特定电子信息输出到屏幕上再反射到人眼的显示工具。常见的有CRT显示器、液晶显示器、LED点阵显示器及OLED显示器。本喵这里使用的是CLD显示器,也就是液晶显示器。液晶显示器,简称LCD(LiquidCrystalDispla

随机推荐