STM32学习笔记:通用定时器输出PWM

发布者:VelvetSoul最新更新时间:2018-06-29 来源: eefocus关键字:STM32  通用定时器  输出PWM 手机看文章 扫描二维码
随时随地手机看文章

脉冲宽度调制,简称PWM(Pulse Width Modulation)是利用微处理器的数字输出 对模拟电路进行控制的一种非常有效的控制技术,常用于控制Led灯的亮度、电机转速等。
STM32 的定时器除了 TIM6 和 7,其他的定时器都可以用来产生 PWM 输出。其中高级定时器TIM1和TIM8可以同时产生高达7路的PWM输出,通用定时器TIM2~TIM5可以同时产生4路PWM输出。
使用通用定时器输出PWM同样需要4步配置,由于输出PWM信号时,不需要定时器中断,所以不需要配置NVIC,但是需要配置TIM_OCInitStructure。下面已配置TIM2为例:
(1)开启系统时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); 




(2)配置GPIO
GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);




(3)配置TIMER
TIM_DeInit(TIM2);
  TIM_TimeBaseStructure.TIM_Period = 3599; //重装载值3600           
  TIM_TimeBaseStructure.TIM_Prescaler = 0;//预分频系数0,意味着不分频,由两项参数可算出定时器频率为20KHz           
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;  
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);




(4)配置TIM_OCInitStructure
void TIM2_PWM_Init(void)
{
TIM_OCInitTypeDef  TIM_OCInitStructure;            

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//输出模式为PWM1              
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能  
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//输出极性高,即输出高电平        

TIM_OCInitStructure.TIM_Pulse =40*36;      //设置PWM占空比为40%
TIM_OC1Init(TIM2, &TIM_OCInitStructure);//初始化TIM2信道1 
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);//开启TIM2信道1的预装载寄存器

TIM_OCInitStructure.TIM_Pulse =0*36;     
TIM_OC2Init(TIM2, &TIM_OCInitStructure); 
TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);

TIM_OCInitStructure.TIM_Pulse =90*36;       
TIM_OC3Init(TIM2, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);

TIM_OCInitStructure.TIM_Pulse =0*36;        
TIM_OC4Init(TIM2, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);

TIM_ARRPreloadConfig(TIM2, ENABLE);
TIM_Cmd(TIM2, ENABLE);
}
结构体 TIM_OCInitTypeDef的定义为:
typedef struct
{
uint16_t TIM_OCMode;
uint16_t TIM_OutputState;  
uint16_t TIM_OutputNState; 
uint16_t TIM_Pulse;         
uint16_t TIM_OCPolarity;    
uint16_t TIM_OCNPolarity;   
uint16_t TIM_OCIdleState;  
uint16_t TIM_OCNIdleState;  
} TIM_OCInitTypeDef;
其中TIM_OCPolarity、TIM_OCMode、TIM_OutputState、TIM_Pulse四个属性是需要我们设置的,其他四个属性是高级定时器TIM1和TIM8才有用的,在这里不做介绍。
1.TIM_OCMode设置输出模式,可设置为TIM_OCMode_PWM1与TIM_OCMode_PWM2,
PWM1:在向上计数时,一旦TIMx_CNTPWM2:在向上计数时,一旦TIMx_CNT2.TIM_OCPolarity设置输出极性,可设置为TIM_OCPolarity_High与TIM_OCPolarity_Low,分别为输出极性高和输出极性低;
3.TIM_OutputState设置比较输出使能,当设置为TIM_OutputState_Enable时,将PWM输出到端口上;
4.TIM_Pulse设置输出PWM的占空比,TIM_Pulse/TIM_Period为PWM的占空比;
在设置PWM占空比 时,还有一种方式,在正点原子的教程中使用了TIM_SetComparex(x=1,2,3,4)函数来设置PWM的占空比,我不是很理解,具体设置过程以设置TIM2的CH1为例:
TIM_SetCompare1(TIM2,40*36)应该是与设置TIM_Pulse=40*36是相同的效果。

关键字:STM32  通用定时器  输出PWM 引用地址:STM32学习笔记:通用定时器输出PWM

上一篇:STM32 PWM的输出与Keil软件仿真
下一篇:STM32学习笔记一一PWM 输出

推荐阅读最新更新时间:2024-03-16 16:07

趣谈STM32的ADC与DMA
最近在做ADC采样电池电压,有时候有点纠结,不用DMA我能很好的把电压给采集出来,那么我为什么要费那些精力去使用DMA呢?用了DMA万一搞错了呢,不用DMA的效果还没有影响到让我非用不可的地步。我有时候确实会有这些小纠结,不想太麻烦,一分钟能做出来的事情,不想用两分钟做出来。但是看到网上很多人一谈到ADC立马就开始说各种DMA,仿佛这种类似的数据外设到内存的传输非DMA不可。 网上的一篇文章详细的讲述了ADC外设和DMA的来龙去脉,非常清晰,在此摘抄下来用以学习:原文地址 : http://m646208823.blog.163.com/blog/static/1669029532012217115010531/ 作为一个偏向工
[单片机]
趣谈<font color='red'>STM32</font>的ADC与DMA
stm32启动指向0x1FFFF020
stm32启动的时候,一直跑不起来,然后进行debug, PC指针总是指向0x1FFFF020,这是boot脚设置错误,解决办法为:将boot0设置为0,boot1设置为任意!
[单片机]
<font color='red'>stm32</font>启动指向0x1FFFF020
STM32——使用PWM+DMA实现脉冲发送精确控制
之前用stm32写过脉冲发送的代码,用来控制步进电机,但是缺点明显,之前是用定时器中断做的,所以一但控制的电机多起来,MCU资源占用就很大,这在大多数情况下是不可接受的,更不用说多轴联动了。 最近做的步进电机CAN总线控制系统,就想顺便重新写驱动。希望做到占用很少的MCU资源,实现脉冲发送的精确控制。既然是用来控制步进电机,那么脉冲的数量和频率一定要可控,要不然怎么实现电机的加减速曲线。于是就想到了DMA。 DMA (直接存储器访问) DMA(Direct Memory Access,直接内存存取) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载。否则,CPU 需要从来源把每一
[单片机]
<font color='red'>STM32</font>——使用<font color='red'>PWM</font>+DMA实现脉冲发送精确控制
STM32的书由三部分组成:主控,串行总线,外设传感器
因为一个嵌入式系统也确实就是由这三部分组成!!!! 单片机都是靠串行总线和外设连接的,所以那些公司招聘要求都写着总线协议是有道理的啊!!!!!一个嵌入式系统无非就是主控和外设,连接主控和外设的就是串行总线!!!!!就这么简单的道理。什么样的传感器选用什么样的串口你需要清楚。 所以STM32的固件库包含两部分,一部分就是对应一些外设的文件!!!!所以学STM32,无非就是两部分,一个是主控,一个是外设,再加一个那就是连接主控和外设的串行总线!!!!!!这么理一下一下子清晰了!!!!!!你去看野火的或者正点的STM32的书或者其他单片机的书,无非就是这三部分组成。 无人机你也可以说就是STM32+外设传感器组成的嘛,抛开算法不谈。
[单片机]
<font color='red'>STM32</font>的书由三部分组成:主控,串行总线,外设传感器
关于STM32的计数和延时
读者*丽杰*问: 问个问题,我想要获得比较准确的延时时间,用stm32哪个时钟,通过什么方法让他准确? 我的回答: 通过STM32的任意一个TIM定时器都可以达到比较精确的延时时间。 Ⅰ 关于STM32的计数和延时 在STM32中,具有计数(或计时)功能的模块基本都能实现延时功能。如:系统滴答SysTick、定时器TIM、实时时钟RTC、看门狗WDG。 精确延时一般使用定时器TIM即可实现。当然,是否精确,取决于你的主频(也就是晶振)是否准确,如果主频精确,那么实现的延时也一定精确。 一般来说,常温下实现us微秒级的延时,误差还是挺小的(应该说挺精确)。拿F407,主频168M来说,可以实现几十ns纳秒
[单片机]
关于<font color='red'>STM32</font>的计数和延时
stm32学习笔记——外部中断的使用
基本概念 stm32中,每一个GPIO都可以触发一个外部中断,但是,GPIO的中断是以组为一个单位的,同组间的外部中断同一时间只能使用一个。比如说,PA0,PB0,PC0,PD0,PE0,PF0,PG0这些为1组,如果我们使用PA0作为外部中断源,那么别的就不能再使用了。在此情况下,我们只能使用类似于PB1,PC2这种末端序号不同的外部中断源。每一组使用一个中断标志EXTIx。EXTI0-EXTI4这5个外部中断有着自己单独的中断响应函数,EXIT5-EXIT9共用一个中断响应函数,EXIT10-EXIT15共用一个中断响应函数。 对于中断的控制,stm32有一个专用的管理机构:NVIC。对于NVIC的详细解释,可以参考《AR
[单片机]
STM32 FSMC操作SRAM的步骤简析
本次操作的SRAM的型号是IS62WV51216,是高速,8M位静态SRAM。它采用ISSI(Intergrated Silicon Solution, Inc)公司的高性能CMOS技术,按照512K个字(16)位进行组织存储单元。其具有高性能、低功耗特点。为方便用户扩展SRAM的存储空间,为用户有提供了两个片选引脚;此外,含有两个字节控制信号UB和LB,可方便用户按字节访问SRAM或按字访问SRAM。IS62WV51216具有45ns/55ns访问速度,因为是全静态操作,因此无需外部时钟和刷新要求。 IS62WV51216功能框图 IS62WV51216有地址译码器、数据IO、控制逻辑和存储阵列四部分构成。地址译码器将1
[单片机]
<font color='red'>STM32</font> FSMC操作SRAM的步骤简析
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved