历史上的今天
返回首页

历史上的今天

今天是:2025年08月21日(星期四)

正在发生

2019年08月21日 | 【STM32】STM32之timer1产生PWM(互补通道)

2019-08-21 来源:eefocus

一、简介



本文介绍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*=1

TIM_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)  

推荐阅读

史海拾趣

Blue Giga公司的发展小趣事

为了扩大市场份额和提升品牌影响力,Blue Giga积极寻求与各行业领导者的合作。它与微软、谷歌、英特尔等知名企业建立了战略合作伙伴关系,共同推动物联网和无线连接技术的发展。这些合作不仅为Blue Giga带来了更多的商业机会,也提升了其在行业中的地位。

Cramer公司的发展小趣事

随着可穿戴设备的兴起,Cramer公司迅速捕捉到了市场机遇。他们推出了一款智能手表,该手表不仅具备基本的时间显示功能,还集成了健康监测、运动追踪等多项实用功能。为了提升产品的竞争力,Cramer公司与多家科技公司合作,共同研发新技术。这款智能手表在市场上获得了广泛认可,进一步提升了Cramer公司的品牌知名度和市场份额。

HCC Industries公司的发展小趣事

近年来,随着全球对环境保护和可持续发展的重视,HCC Industries积极响应号召,制定了绿色可持续发展战略。公司加大了对环保技术和绿色产品的研发投入,推出了一系列符合环保标准的微电子部件产品。同时,HCC还通过优化生产工艺和节能减排措施,降低了生产过程中的能源消耗和污染排放。这一战略不仅赢得了客户和消费者的广泛赞誉,也为公司带来了更加可持续的发展前景。

Hayashi Denko Co Ltd公司的发展小趣事

随着国内市场的饱和,HCC Industries在2010年制定了国际化发展战略。公司首先选择在欧洲市场设立分支机构,利用其先进的制造工艺和技术优势,迅速打开了当地市场。随后,HCC又相继在亚洲和北美地区设立了多个办事处和生产基地,实现了全球范围内的生产和销售网络布局。这一战略不仅显著提升了HCC的品牌影响力,也为其带来了更加多元化的客户群体和更广阔的市场空间。

ADI Electronics Inc公司的发展小趣事

随着技术的不断进步,ADI开始逐步拓展其产品线,从最初的运算放大器逐步扩展到信号处理、数据转换等多个领域。这些技术突破不仅巩固了ADI在电子行业的地位,也为其带来了更多的商业机会。同时,ADI始终保持着对新技术的高度关注,不断投入研发,确保公司在激烈的市场竞争中保持领先地位。

Eby Company公司的发展小趣事

eBay一直致力于创新和改革,以适应不断变化的市场环境。例如,eBay推出了“新卖家金鹰计划”,旨在通过多项专属服务扶持新卖家拓展全球市场。此外,eBay还不断更新其技术平台,提高交易效率和用户体验。这些创新和改革措施使eBay能够在竞争激烈的电子行业中保持领先地位。

问答坊 | AI 解惑

电磁流量计原理

1. 概 述 电磁流量计(以下简称EMF)是利用法拉第电磁感应定律制成的一种测量导电液体体积流量的仪表。50年代初EMF实现了工业化应用,近年来世界范围EMF产量约占工业流量仪表台数的5%~6.5%。 70年代以来出现键控低频矩形波激磁方式,逐渐替代早 ...…

查看全部问答>

电流转换成电压再进行AD转换的电路,有个问题,请教模电

最近正在做一个同时电压和电流的电路 。现在有个问题。 单独测量电压和电流都没有问题,只是不能同时测量,同时测量的话,电压正常,电流就不对了。 电流测量点是在VDD端,我估计可能是共模干扰的问题,但是不知道怎么解决。 请高手指点,不胜感 ...…

查看全部问答>

4星C++经典(英文清晰PDF)

C++: The Complete Reference, 3rd Edition Product DescriptionBest-selling genius Herb Schildt covers everything from keywords, syntax, and libraries, to advanced features such as overloading, inheritance, virtual functions, name ...…

查看全部问答>

这种情况下怎样滤波效果更好?

最近用到AD698来检测位移,用示波器发现698输出的直流电压有纹波,大约10mv,几十Hz,即使使用电池供电也照样存在!想用简单的阻容滤除,但电容加大到100uF才滤掉了纹波!但此时出现了一个非常讨厌的现象:          ...…

查看全部问答>

为什么我的贴被删

不可以那样发贴吗,版主,解释下 死也要死的明白??…

查看全部问答>

诚聘硬件部经理

公司:深圳市亚特尔南京研发中心(正在筹建中) 地址:南京市鼓楼区定淮门12号世界之窗软件园15号楼北301室 TEL:025-83752651     Website:www.szartel.com 要求: 1、本科以上学历,电子信息相关专业; 2、从事ARM、DS ...…

查看全部问答>

供应VGA控制板

VGA控制板: 1. 为单片定身量做的显卡,单片机通过8/16/32位数据总线或IO口直接控制             2. 标准VGA输出接口,直接驱动15/17\"LCD和CRT显示器            ...…

查看全部问答>

CF卡的驱动

您好,我最近在做CF卡的驱动,是基于arm9(at91rm9200)平台linux操作系统的,看了一段时间书也没什么大的头绪,能否给我源代码做参考,非常感谢! 我的邮箱:jink1977@163.com…

查看全部问答>

版主,请问串口1如何使用呢?

版主,我用的是207R8,想使用串口1,如何配置寄存器,才能使它像普通单片机串口一样收发使用呢,寄存器配置太多,不知道如何使用了 使用库函数也行啊 我使用的是 stvp,外部时钟 22.1184…

查看全部问答>