本篇博文最后修改时间:2017年01月14日,23:50。


一、简介

本文介绍STM32系列如何使用timer1的第TIM1_CH2N通道(PB14)产生PWM。

二、实验平台

库版本:STM32F10x_StdPeriph_Lib_V3.5.0

编译软件:MDK4.53

硬件平台:STM32开发板(主芯片stm32f103c8t6)

仿真器:JLINK

、版权声明

博主:甜甜的大香瓜

声明:喝水不忘挖井人,转载请注明出处。

原文地址:http://blog.csdn.NET/feilusia

联系方式:897503845@qq.com

香瓜BLE之CC2541群:127442605

香瓜BLE之CC2640群:557278427

香瓜BLE之Android群:541462902

香瓜单片机之STM8/STM32群:164311667
甜甜的大香瓜的小店(淘宝店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i
四、 实验前提
1、在进行本文步骤前,请先 阅读 以下博文:
1)《STM32之timer3产生PWM》:http://blog.csdn.net/feilusia/article/details/53634882

2、在进行本文步骤前,请先 实现以下博文:
暂无

五、基础知识

1、什么是互补通道?

答: TIM1_CH2N 通道就是TIM1_CH2的互补通道,它们的波形完全反向。有些引脚上是互补通道,我们同样可用于PWM输出。

六、实验步骤

1、编写并添加PWM驱动

1)编写驱动GUA_Timer1_PWM.c(存放在“……\HARDWARE”)

//******************************************************************************
//name:             GUA_Timer1_PWM.c
//introduce:        定时器1的PWM驱动
//author:           甜甜的大香瓜
//email:            897503845@qq.com
//QQ group          香瓜单片机之STM8/STM32(164311667)
//changetime:       2017.01.14
//******************************************************************************
#include "stm32f10x.h"
#include "GUA_Timer1_PWM.h"  /*********************宏定义************************/
//引脚宏
#define GUA_TIMER1_PWM_PORT             GPIOB
#define GUA_TIMER1_PWM_PIN              GPIO_Pin_14
#define GUA_TIMER1_PWM_MODE             GPIO_Mode_AF_PP
#define GUA_TIMER1_PWM_GPIO_CLOCK               RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO
#define GUA_TIMER1_PWM_PERIPH_CLOCK         RCC_APB2Periph_TIM1 //计数值
#define GUA_TIMER1_PWM_PERIOD                       (72 - 1)  /*********************内部函数声明************************/
static void GUA_Timer1_PWM_IO_Init(void);
static void GUA_Timer1_PWM_Config_Init(GUA_U16 nGUA_Timer3_PWM_Prescaler);//******************************************************************************
//name:             GUA_Timer1_PWM_IO_Init
//introduce:        定时器1的PWM的IO初始化
//parameter:        none
//return:           none
//author:           甜甜的大香瓜
//email:            897503845@qq.com
//QQ group          香瓜单片机之STM8/STM32(164311667)
//changetime:       2017.01.14
//******************************************************************************
static void GUA_Timer1_PWM_IO_Init(void)
{      //IO结构体  GPIO_InitTypeDef GPIO_InitStructure;  //时钟配置 RCC_APB2PeriphClockCmd(GUA_TIMER1_PWM_GPIO_CLOCK, ENABLE); //IO初始化GPIO_InitStructure.GPIO_Pin = GUA_TIMER1_PWM_PIN;GPIO_InitStructure.GPIO_Mode = GUA_TIMER1_PWM_MODE;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GUA_TIMER1_PWM_PORT, &GPIO_InitStructure);
}//******************************************************************************
//name:             GUA_Timer1_PWM_Config_Init
//introduce:        定时器1的PWM的配置初始化
//parameter:        nGUA_Timer1_PWM_Prescaler:预分频数值,如100则表示1000000/100=10000Hz
//return:           none
//author:           甜甜的大香瓜
//email:            897503845@qq.com
//QQ group          香瓜单片机之STM8/STM32(164311667)
//changetime:       2017.01.14
//******************************************************************************
static void GUA_Timer1_PWM_Config_Init(GUA_U16 nGUA_Timer1_PWM_Prescaler)
{      TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;  TIM_OCInitTypeDef  TIM_OCInitStructure;  //时钟配置RCC_APB2PeriphClockCmd(GUA_TIMER1_PWM_PERIPH_CLOCK, ENABLE);  //定时器配置TIM_TimeBaseStructure.TIM_Period = GUA_TIMER1_PWM_PERIOD;                              //设置计数值  TIM_TimeBaseStructure.TIM_Prescaler = nGUA_Timer1_PWM_Prescaler - 1;      //设置预分频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;                                              //配置为PWM模式1(小于计数值时为有效电平)    //TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                    //比较输出使能 TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;                   //比较输出的互补输出使能       TIM_OCInitStructure.TIM_Pulse = 0;                                                                         //设置待装入捕获比较寄存器的脉冲值  //TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;                         //当定时器计数值小于CCR1时为低电平  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;                           //当定时器计数值小于CCR1时互补输出为低电平 //TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;                      //当MOE=0时,如果实现了OC*N,则死区后OC*=1   TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set;                       //当MOE=0时,如果实现了OC*N,则死区后OC*=1TIM_OC2Init(TIM1, &TIM_OCInitStructure);                                                               //使能通道2      //默认关闭PWM      GUA_Timer1_PWM_Status(GUA_TIMER1_PWM_STATUS_OFF);   //使能    TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);                                               //CH2预装载使能  TIM_ARRPreloadConfig(TIM1, ENABLE);                                                                         //使能TIM1重载寄存器ARR    TIM_Cmd(TIM1, ENABLE);                                                                                                  //使能定时器1
}//******************************************************************************
//name:             GUA_Timer1_PWM_Status
//introduce:        定时器1的PWM开关
//parameter:        nGUA_Timer1_PWM_Status: GUA_TIMER1_PWM_STATUS_ON or GUA_TIMER1_PWM_STATUS_OFF
//return:           none
//author:           甜甜的大香瓜
//email:            897503845@qq.com
//QQ group          香瓜单片机之STM8/STM32(164311667)
//changetime:       2017.01.14
//******************************************************************************
void GUA_Timer1_PWM_Status(GUA_U8 nGUA_Timer1_PWM_Status)
{  //打开PWM  if(nGUA_Timer1_PWM_Status == GUA_TIMER1_PWM_STATUS_ON)  {   TIM_SetCounter(TIM1, 0);      TIM_CtrlPWMOutputs(TIM1, ENABLE);           }  //关闭PWM else  {  TIM_CtrlPWMOutputs(TIM1, DISABLE);      }
}  //******************************************************************************
//name:             GUA_Timer1_PWM_SetDutyCycle
//introduce:        定时器1的PWM设置占空比
//parameter:        nGUA_Timer1_PWM_DutyCycle: 0~100为0%~100%
//return:           none
//author:           甜甜的大香瓜
//email:            897503845@qq.com
//QQ group          香瓜单片机之STM8/STM32(164311667)
//changetime:       2017.01.14
//******************************************************************************
void GUA_Timer1_PWM_SetDutyCycle(GUA_U8 nGUA_Timer1_PWM_DutyCycle)
{  TIM_SetCompare2(TIM1, GUA_TIMER1_PWM_PERIOD*nGUA_Timer1_PWM_DutyCycle/100);
}  //******************************************************************************
//name:             GUA_Timer1_PWM_Init
//introduce:        定时器1的PWM初始化
//parameter:        nGUA_Timer1_PWM_Prescaler:预分频数值,如100则表示1000000/100=10000Hz
//return:           none
//author:           甜甜的大香瓜
//email:            897503845@qq.com
//QQ group          香瓜单片机之STM8/STM32(164311667)
//changetime:       2017.01.14
//******************************************************************************
void GUA_Timer1_PWM_Init(GUA_U16 nGUA_Timer1_PWM_Prescaler)
{   //初始化IO  GUA_Timer1_PWM_IO_Init();  //初始化定时器配置 GUA_Timer1_PWM_Config_Init(nGUA_Timer1_PWM_Prescaler);
}

2) 编写驱动头文件 GUA_Timer1_PWM.h (存放在“ …… \HARDWARE ”)

//******************************************************************************
//name:             GUA_Timer1_PWM.h
//introduce:        定时器1的PWM驱动的头文件
//author:           甜甜的大香瓜
//email:            897503845@qq.com
//QQ group          香瓜单片机之STM8/STM32(164311667)
//changetime:       2017.01.14
//******************************************************************************
#ifndef _GUA_TIMER1_PWM_H_
#define _GUA_TIMER1_PWM_H_  /*********************宏定义************************/
//类型宏
#ifndef GUA_U8
typedef unsigned char GUA_U8;
#endif    #ifndef GUA_8
typedef signed char GUA_8;
#endif      #ifndef GUA_U16
typedef unsigned short GUA_U16;
#endif #ifndef GUA_16
typedef signed short GUA_16;
#endif         #ifndef GUA_U32
typedef unsigned long GUA_U32;
#endif #ifndef GUA_32
typedef signed long GUA_32;
#endif#ifndef GUA_U64
typedef unsigned long long GUA_U64;
#endif#ifndef GUA_64
typedef signed long long GUA_64;
#endif//PWM的开关宏
#define GUA_TIMER1_PWM_STATUS_ON                0       //PWM打开
#define GUA_TIMER1_PWM_STATUS_OFF               1       //PWM关闭  /*********************外部函数声明************************/
void GUA_Timer1_PWM_Status(GUA_U8 nGUA_Timer1_PWM_Status);
void GUA_Timer1_PWM_SetDutyCycle(GUA_U8 nGUA_Timer1_PWM_DutyCycle);
void GUA_Timer1_PWM_Init(GUA_U16 nGUA_Timer1_PWM_Prescaler);  #endif

3) 工程中添加GUA_Timer1_PWM.c

4)在MDK设置中添加驱动源文件路径

2、添加库的驱动

1)添加库的驱动文件

2)添加库的驱动头文件(stm32f10x_conf.h 中)

#include "stm32f10x_tim.h" 

3、在应用层中调用

1)添加驱动头文件(main.c中)

#include "GUA_Timer1_PWM.h" 

2) 添加初始化代码(main.c的main函数中)

   GUA_Timer1_PWM_Init(26);                                                        //设置PWM频率为1000000/26=38000Hz=38KHz  GUA_Timer1_PWM_SetDutyCycle(50);                                      //设置PWM占空比为50%  GUA_Timer1_PWM_Status(GUA_TIMER3_PWM_STATUS_ON);    //使能PWM   
七、注意事项
1、在初始化PWM的配置之后,需要调用使能PWM的函数才会有PWM的波形。
2、PWM会有死区。
3、如果仅使用PWM的互补通道,记得不要把另一个普通的PWM通道也初始化了。

八、实验结果

设置仿真断点在测试代码,仿真并全速运行至断点,单步执行测试代码后的PB14波形如下图:
1、使能PWM

因此,实验成功。

【STM32】STM32之timer1产生PWM(互补通道)相关推荐

  1. stm32 PWM互补输出

    stm32高级定时器例子-stm32 PWM互补输出 定时器初始化结构体 TIM_TimeBaseInitTypeDef 时基结构体,用于定时器基础参数设置,与TIM_TimeBaseInit函数配合 ...

  2. H桥驱动电机,STM32 PWM互补输出功能误用分析

    如果排查的思路对你有帮助,请记住 消雨匆匆 or  大吊工. 码字和排查很累,仅此而已 硬件不是抄电路,拿烙铁,懂点软件,细致分析,找问题和破案搜集线索是一样的. 导航车设计项目中,一个新人设计了如下 ...

  3. STM32之TIM 舵机控制PWM

    目录 大概步骤 定时器介绍 输入通道 输入滤波器和边沿检测器 捕获通道 定时器初始化结构体详解 1. TIM_TimeBaseInitTypeDef 定时器基本初始化结构体 TIM_OCInitTyp ...

  4. 【STM32】通用定时器的PWM输出(实例:PWM输出)

    STM32F1xx官方资料: <STM32中文参考手册V10>-第14章  通用定时器 通用定时器PWM概述 STM32定时器输出通道引脚 这里以TIM3为例来讲解.STM32的通用定时器 ...

  5. 【STM32】HAL库——定时器PWM输出

    前期准备: STM32CubeMX STM32RCT6核心板 IDE Keil(MDK-ARM) STM32CubeMX部分 1. 配置时钟 选择STM32F103RCTx系列芯片,配置时钟的同时会自 ...

  6. stm32+增量式pid+max6675 PWM温度控制

    stm32+增量式pid+max6675 PWM温度控制 本文采用的芯片为STM32F103RCT6 温度芯片为MAX6675 之前spi通讯的max6675代码: https://blog.csdn ...

  7. STM32入门(四)PWM与电机驱动

    STM32入门(四)PWM与电机驱动 一.PWM 所谓PWM,就是脉冲宽度调制技术,其具有两个很重要的参数:频率和占空比.频率,就是周期的倒数:占空比,就是高电平在一个周期内所占的比例.PWM方波的示 ...

  8. 基于CubeMX-STM32F103RCT6_单通道双路PWM互补输出

    文章目录 基于CubeMX-STM32F103RCT6_单通道双路PWM互补输出 简介 CubeMX-TIM配置详情 单通道双路 PWM 互补输出配置 参数配置 时钟配置 工程管理 修改代码 基于Cu ...

  9. 【电赛备考】基于STM32控制的可调PWM输出+LCD显示

    情况分析 大三老油条一枚,大一时赶上19年国赛申请留校一月自学(划水)开赛以后就和队友参观了一下其他队伍准备的情况就愉快的回家了.(材料都没买),因为疫情的原因大二的省赛推迟到了大三.趁着考研压力还不 ...

最新文章

  1. Linux环境下用OpenJTAG实现Linux内核的源码级调试
  2. java正则表达式入门文档
  3. 4-剑指offer: 把数组排成最小的数
  4. 蒙特卡洛法—非均匀随机数的产生
  5. 第一行代码学习笔记第二章——探究活动
  6. VTK:几何对象之OpenVROrientedArrow
  7. HDU 1506 Largest Rectangle in a Histogram(dp、单调栈)
  8. ENSP配置 实例五 RIP配置
  9. linux trac svn,Ubuntu安装Trac SVN的方法及命令
  10. sqlserver 两个数值字段相加_SQLServer 中多行数据合并成一行数据(一个字段)
  11. C++ Linked lists detail
  12. Entity Framework连接Mysql数据库并生成Model和DAL层
  13. php通用编码,php字符串怎么转换编码
  14. 搜人2013笔试题(java)
  15. oracle创建视图多表关联,Oracle创建两表关联查询的视图
  16. python中oserror_[python] 解决OSError: Address already in use
  17. window进行resize的时候ie假死(jquery插件处理)
  18. 最简单linux桌面环境,推荐:轻型简易的Linux桌面环境
  19. python连接S3
  20. 公司接了一个电商项目要在1个月内写10w行代码,该怎么搞定?

热门文章

  1. Qt QSetting 生成*.ini.lock和*.ini.shn126阻塞程序的问题
  2. [译] 如何从一个业余爱好者成长成为专业开发者
  3. 【模拟IC】DC-DC 电荷泵系统的行为级建模与分析
  4. 深入了解磁传感器和加速度传感器
  5. cocos 角度转弧度 转角度 转向量 函数
  6. 赚钱思考:屌丝逆袭应该怎么开始?
  7. 电脑格式化后数据恢复软件EasyRecovery16
  8. js 图片格式转换为jpg_如何将图像转换为JPG格式
  9. FLUENT软件求解器选择(转载)
  10. thinkvd将支持rmvb转换 (开发日志)