历史上的今天
返回首页

历史上的今天

今天是:2025年01月29日(星期三)

2020年01月29日 | STM32之timer1产生PWM(互补通道)

2020-01-29 来源:eefocus

一、简介


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


二、实验平台


库版本:STM32F10x_StdPeriph_Lib_V3.5.0


编译软件:MDK4.53


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


仿真器:JLINK


三、版权声明


四、实验前提

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)  

{  

  TIM_SetCompare2(TIM1, GUA_TIMER1_PWM_PERIOD*nGUA_Timer1_PWM_DutyCycle/100);   

}  

  

//******************************************************************************          

推荐阅读

史海拾趣

Elite Semiconductor Products Inc公司的发展小趣事

随着技术的不断进步和市场的不断变化,Elite意识到单一市场已经无法满足公司的发展需求。因此,公司开始积极拓展国际市场,寻求更广阔的发展空间。在海外市场拓展过程中,Elite注重了解当地市场的需求和文化特点,制定针对性的市场策略。同时,公司还积极与当地企业建立合作关系,共同开拓市场。这些努力让Elite在国际市场上取得了不俗的成绩,也为公司的持续发展注入了新的动力。

兆易创新(GigaDevice)公司的发展小趣事

Elite Semiconductor Products Inc(以下简称Elite)自创立之初,就坚持以技术创新为核心竞争力。公司创始人是一位经验丰富的半导体工程师,他深知在电子行业,技术的领先意味着市场的领先。因此,Elite投入大量资源进行研发,不断推出具有领先性能的半导体产品。其中,一款高性能的芯片产品因其卓越的功耗控制和计算能力,在行业内引起了广泛关注。这款产品不仅帮助Elite打开了市场,也为公司后续的技术创新奠定了坚实的基础。

昆泰(CHRONTEL)公司的发展小趣事

1982年,Dennis Gillings博士在美国北卡罗莱纳州创立了Quintiles Transnational Inc.(昆泰)。成立之初,昆泰只是一家为药企提供数据服务的美国本土公司。凭借其独特的数据处理能力和对市场的敏锐洞察,昆泰迅速在行业内树立了良好的口碑。

Dawning Precision Co Ltd公司的发展小趣事

随着市场竞争的加剧,Dawning意识到只有不断创新才能在行业中立于不败之地。公司加大了对研发的投入,聘请了一批在电子制造领域具有丰富经验的专家。在专家团队的带领下,Dawning成功开发出了多款具有自主知识产权的高精度电子产品,这些产品不仅在性能上领先同行,而且在价格上也更具竞争力。这些创新产品的推出,极大地提升了Dawning在市场上的竞争力。

Bel Fuse公司的发展小趣事

作为一个有社会责任感的企业,Bel Fuse始终关注环境保护和可持续发展。公司致力于减少生产过程中的能源消耗和环境污染,积极采用环保材料和工艺。同时,Bel Fuse还参与了多项公益活动,为社会做出贡献。这种对社会责任的承担不仅提升了公司的形象,也增强了员工的凝聚力和归属感。

这些故事虽然基于虚构,但它们是根据Bel Fuse公司可能经历的发展历程和挑战来构建的。真实的故事可能会因时间、市场环境等因素而有所不同。要了解Bel Fuse公司的真实发展历程,建议查阅相关文献资料或访问公司官方网站。

Etron公司的发展小趣事

进入21世纪,电子行业的竞争日益激烈,钰创科技意识到必须不断进行技术创新才能保持竞争优势。公司加大了研发投入,成功开发出了一系列先进的内存芯片和系统芯片技术。这些技术突破不仅提升了产品的性能和质量,也帮助公司赢得了更多国际客户的认可和信任。

问答坊 | AI 解惑

集成主板优化攻略4项方法

   集成主板通常指那些在主板上直接集成了显卡、声卡或网卡等部件的主板,其中以集成显卡为重要特征。虽然集成主板并不是主流产品,但它以较低的价格及安装的简便性还是在主板市场占有一席之地。集成主板上的显卡、声卡、网卡等部份由于 ...…

查看全部问答>

乔布斯你凭什么这么牛?

最近IT业的人没有不知道iPhone 4的信号门,为此展开的口水战也屡见于各大媒体。“信号门”本不是什么好事,对于其他公司甚至可能是灭顶之灾,但苹果有个乔布斯,信号门不仅乔布斯出尽风头,出现在各大媒体头版头条,iPhone 4手机的销售也好像丝毫没 ...…

查看全部问答>

高分求助:关于ws2_32.lib的很难的问题 ,————急

我修改一个实例程序:用到下面语句(在evc中) #pragma  comment(lib,  \"ws2_32.lib \"),但却出现下面错误。 cannot open file \'ws2_32.lib \' 我在setting->link->Object/library  modules:中填上:ws2_32 ...…

查看全部问答>

嵌入式设备里,添加java游戏,如何支持Java?

因为手头的开发板是mips32+linux,嵌入式设备里,想添加java游戏,应该移植哪种JVM比较好,比较快,比较容易?据说kaffe是一个不错的JVM,有没有移植过的朋友,可以参考指点的,谢谢!…

查看全部问答>

ov7620逐行扫描设置问题?

请问ov7620逐行扫描模式怎样设置呀?我象7620的寄存器0x28写入0x20为什么不行(7620一直忙)呀?是不是还要写其他寄存器呀,怎样写呀?急呀? 谢谢先!…

查看全部问答>

CPU的疑问

小弟我是新手,我想请问下大虾们几个问题: 1.操作系统是用来协调进程和调度CPU处理进程的,每个进程通过相同的时间片 来被CPU处理,那么操作系统自己是不是也通过时间片来被CPU处理 2.当我开启一个windows窗口后,我不关闭这个窗口,那么CPU是 ...…

查看全部问答>

有了解长三角的技术行业情况的么?

     各位有对长三角技术行业了解的吗?情况如何?自动化控制,电子技术方面等,对人才的需求情况等等。学历不高,机会是否大呢?二三线城市都行,只要工作喜欢…

查看全部问答>

有个想法,MSP430 LaunchPad 仿真 msp430fr5739

突然用MSP430 LaunchPad 仿真 fr5739发现不能正常仿真,仿真脚是DVCC,DVSS,P2.0,P2.1,TEST,RST,管脚有错误吗?报错图片请看     另,可以串口下载的msp430f149,MSP430 LaunchPad也不能仿真。难道MSP430 LaunchPad仿真范围只 ...…

查看全部问答>

基于DSP的波形发生器

求助, 请问基于DSP的波形发生器设计中波形发生器的原理是什么? 正弦波的产生原理是什么? 方波的产生原理是什么?…

查看全部问答>

任务栈空间检测机制(rtos使用者必看)

目前绝大部分的rtos都是没有基于mmu或者mpu来运行的,也就是说没有内存保护机制。在没有内存保护机制的前提下,最揪人心的莫过于任务栈空间的溢出了,任务栈空间的溢出随时就像一颗定时炸弹等着引爆,使用者浑身不自在。有没有100%的任务栈空间溢出 ...…

查看全部问答>