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

定时器的.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. STM32F103C8 TIM1 CHN PWM输出代码

    STM32F103高级定时器TIM1输出PWM波程序 /** 配置PB13输出,即全使能TIM1_CH1N通道,禁用TIM1_CH1通道,禁用更新中断* 其它参数看着修改*/ void Timer1I ...

  2. [控制基础] 定时器TIM的PWM输出+用积分思想分析PWM对直流减速有刷电机的控制(基于STM32F103+CubeMX+HAL)

    目录 解决的需求 一.高级定时器TIM1/TIM8 1.时基单元 2.更新操作与更新事件 3.与其他定时器的比较 ①.与其他定时器时基单元的比较 ②.与通用定时器的比较 4.CK_INT与CK_CNT ...

  3. STM32F10x TIM1 CH3/CH4 的重映射PWM输出

    事情经过 最近做项目,由于板子的布局以及芯片资源紧缺的原因,不得不想办法把偏僻的PE口的 高级定时器TIM1的PWM利用起来,我做的是TIM1_CH3.TIM1_CH4 的 重映射 两路PWM输出(P ...

  4. STM32F103的11个定时器详解 高级定时器pwm

    STM32F103VC这款单片机一共有2个高级定时器TIM1和TIM8 这2个高级定时器都可以同时产生3路互补带死区时间的PWM信号和一路单独的PWM信号, 具有刹车输入功能,在紧急的情况下这个刹车功 ...

  5. STM32F103 16路PWM 配置

    1. 前言 底层库:基于原子的标准库函数 适用芯片:STM32F103系列型号芯片,其他型号未测试(注:已测型号:C8T6.CBT6.RCT6.RET6.ZET6) 所用到的定时器:TIM1.TIM2 ...

  6. STM32F103单片机生成16路PWM波

    单片机输出pwm波在项目中是恨常用的一个功能,今天就总结一下用STM32F103C8T6单片机输出16路 pwm波. 使用keil5软件,用标准库函数来实现. 首先看定时器初始化 void TIM1_ ...

  7. stm32 学习 (设置TIM4输出4路 pwm J-LINK仿真验证)

    使用单片机:stm32f103c8t6  资源 RAM: 20K: flash: 64K:CPU频率: 72M:通用I/O: 32个:UART: 3个:SPI:2个:USB:1个:CAN: 1个:II ...

  8. ## STM32F103的光照、烟雾MQ2、有毒气体MQ135的ADC配置(寄存器版与库函数版

    STM32F103的光照.烟雾MQ2.有毒气体MQ135的ADC配置(寄存器版与库函数版 //#include "adc.h"#if 0 //寄存器编程 /************ ...

  9. STM32F103的PA15脚作为PWM输出使用

    1,STM32的PA15引脚默认作为JTAG下载使用,但是如果采用SWD调试时,PA15可以作为普通的IO口使用,但是需要设置一些寄存器,笔者调试时遇到些麻烦,最终解决问题,记录这个过程,希望对有同样 ...

最新文章

  1. php更新点击数,始终如一的坚守,PHP对数据更新的更优解
  2. [ruby] wxRuby安装
  3. 耿直:统计学中的因果推断问题(Causal Inference)
  4. 网易智企斩获“2021全球新经济卓越成就奖”两项大奖
  5. java 中线程池的种类,原理以及源码解析(1)
  6. java泛型——桥方法
  7. jdk1.6集成activemq的2种方式
  8. wechat.php+获取昵称,微信后台代码,获取用户昵称
  9. ex28 布尔表达式练习
  10. jvm最大最小内存参数设置
  11. h5保存图片到手机_如何快速制作一个【H5】作品?
  12. 推荐一个很健康护眼的eclipse主题
  13. LoadRunner11在Win10 下的破解解决办法(整合)
  14. 手机输入法带拼音声调_这些神奇的拼音输入法,你都知道几个?
  15. 卡拉曼达聊天服务器断开修复也没用,英雄联盟新版客户端 聊天系统神似QQ
  16. 2022年全球市场5G可用版业务支持系统总体规模、主要企业、主要地区、产品和应用细分研究报告
  17. 无限天空服务器,天空云服务器
  18. 计算机浏览器无法上网怎么办,电脑有网络,但是浏览器不能上网怎么办
  19. pptpd 安装步骤
  20. 使用Easyexcel对Excel进行读写操作

热门文章

  1. 江苏2017年计算机二级考试,2017年江苏计算机二级考试报名时间
  2. android afw模式,[HUAWEI-TITANC328]手机加密功能开启后,工作区中添加超级备份手机不断重启的分析报告...
  3. 【opencv】关于透视变换
  4. 论文解读:Correcting Chinese Spelling Errors with Phonetic Pre-training
  5. latex——小白学习经验
  6. 微信小程序 中 canvas 导出图片为黑色
  7. 卖着3元冰淇淋、均价6元奶茶的蜜雪冰城怎么赚钱?
  8. OAuth2:项目演示-模拟微信授权登录京东
  9. 常用JDBC数据库驱动包和类名
  10. Cortana小娜:甄嬛怎么说话 :P