STM32开发板学习日记-[5]TIM的PMW模式

发布者:Ziyu2022最新更新时间:2015-11-12 来源: eefocus关键字:STM32  开发板  TIM  PMW模式 手机看文章 扫描二维码
随时随地手机看文章
脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。

在TIMx_CCMRx寄存器中的OCxM位写入’110’(PWM模式1)或’111’(PWM模式2),能够独立地设置每个OCx输出通道产生一路PWM。必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器,最后还要设置TIMx_CR1寄存器的ARPE位使能自动重装载的预装载寄存器(在向上计数或中心对称模式中)。
因为仅当发生一个更新事件的时候,预装载寄存器才能被传送到影子寄存器,因此在计数器开始计数之前,必须通过设置TIMx_EGR寄存器中的UG位来初始化所有的寄存器。
OCx的极性可以通过软件在TIMx_CCER寄存器中的CCxP位设置,它可以设置为高电平有效活或低电平有效。TIMx_CCER寄存器中的CCxE位控制OCx输出使能。

 


在PWM模式(模式1或模式2)下,TIMx_CNT和TIM1_CCRx始终在进行比较,(依据计数器的计数方向)以确定是否符合TIM1_CCRx≤TIM1_CNT或者TIM1_CNT≤TIM1_CCRx。然而为了与OCREF_CLR的功能(在下一个PWM周期之前,ETR信号上的一个外部事件能够清除OCxREF)一致,OCxREF信号只能在下述条件下产生:
●当比较的结果改变

●当输出比较模式(TIMx_CCMRx寄存器中的OCxM位)从“冻结”(无比较,OCxM=’000’)切换到某个PWM模式(OCxM=’110’或’111’)。这样在运行中可以通过软件强置PWM输出。
根据TIMx_CR1寄存器中CMS位的状态,定时器能够产生边沿对齐的PWM信号或中央对齐的PWM信号。

110:PWM模式1-在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。
111:PWM模式2-在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为有效电平,否则为无效电平。


PWM 边沿对齐模式
向上计数配置
当TIMx_CR1寄存器中的DIR位为低的时候执行向上计数。参看13.3.2节。
下面是一个PWM模式1的例子。当TIMx_CNT

 

[转载]STM32开发板学习日记-[5]TIM的PMW模式

 

向下计数的配置


当TIMx_CR1寄存器的DIR位为高时执行向下计数。

在PWM模式1,当TIMx_CNT>TIMx_CCRx时参考信号OCxREF为低,否则为高。如果TIMx_CCRx中的比较值大于TIMx_ARR中的自动重装载值,则OCxREF保持为’1’。该模式下不能产生0%的PWM波形。
PWM 中央对齐模式
当TIMx_CR1寄存器中的CMS位不为’00’时为中央对齐模式(所有其他的配置对OCxREF/OCx信号都有相同的作用)。根据不同的CMS位的设置,比较标志可以在计数器向上计数时被置1、在计数器向下计数时被置1、或在计数器向上和向下计数时被置1。TIMx_CR1寄存器中的计数方向位(DIR)由硬件更新,不要用软件修改它。下图给出了一些中央对齐的PWM波形的例子
●TIMx_ARR=8
●PWM模式1
●TIMx_CR1寄存器中的CMS=01,在中央对齐模式1时,当计数器向下计数时设置比较标志。通用定时器(TIMx)

[转载]STM32开发板学习日记-[5]TIM的PMW模式

使用中央对齐模式的提示:
●进入中央对齐模式时,使用当前的上/下计数配置;这就意味着计数器向上还是向下计数取决于TIMx_CR1寄存器中DIR位的当前值。此外,软件不能同时修改DIR和CMS位。
●不推荐当运行在中央对齐模式时改写计数器,因为会产生不可预知的结果。特别地:
─如果写入计数器的值大于自动重加载的值(TIMx_CNT>TIMx_ARR),则方向不会被更新。例如,如果计数器正在向上计数,它就会继续向上计数。
─如果将0或者TIMx_ARR的值写入计数器,方向被更新,但不产生更新事件UEV。
●使用中央对齐模式最保险的方法,就是在启动计数器之前产生一个软件更新(设置TIMx_EGR 位中的UG位),不要在计数进行过程中修改计数器的值。

 

 

本例展示了如何设置TIM工作在脉冲宽度调制模式(PWM Pulse Width Modulation
mode)。

TIM3时钟设置为36MHz,预分频设置为0,TIM2计数器时钟可表达为:
TIM3 counter clock = TIMxCLK / (Prescaler +1) = 36 MHz

设置TIM3_CCR1寄存器值为500,则TIM3通道1产生一个频率为36MHz,占空比(duty cycle)为50%的PWM信号。

同理,根据寄存器TIM3_CCR2 、TIM3_CCR3和 TIM3_CCR4的值,TIM3通道2产生一个频率为36MHz,占空比(duty cycle)为37.5%的PWM信号;TIM3通道1产生一个频率为36MHz,占空比(duty cycle)为25%的PWM信号;TIM3通道1产生一个频率为36MHz,占空比(duty cycle)为12.5%的PWM信号。

可以通过示波器,在相应管脚观察到输出信号。

 

u16 CCR1_Val = 500;
u16 CCR2_Val = 375;
u16 CCR3_Val = 250;
u16 CCR4_Val = 125;



 
 
  TIM_TimeBaseStructure.TIM_Period = 999;         
  TIM_TimeBaseStructure.TIM_Prescaler = 0;      
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;   
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
 
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

 
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;         
  TIM_OCInitStructure.TIM_Channel = TIM_Channel_1;         
  TIM_OCInitStructure.TIM_Pulse = CCR1_Val; 
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
   
  TIM_OCInit(TIM3, &TIM_OCInitStructure);

启用CCR1寄存器的影子寄存器(直到产生更新事件才更改设置)

  TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);

 
  TIM_OCInitStructure.TIM_Channel = TIM_Channel_2;         
  TIM_OCInitStructure.TIM_Pulse = CCR2_Val; 
 
  TIM_OCInit(TIM3, &TIM_OCInitStructure);

  TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);

 
  TIM_OCInitStructure.TIM_Channel = TIM_Channel_3;         
  TIM_OCInitStructure.TIM_Pulse = CCR3_Val; 
 
  TIM_OCInit(TIM3, &TIM_OCInitStructure);

  TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);

 
  TIM_OCInitStructure.TIM_Channel = TIM_Channel_4;         
  TIM_OCInitStructure.TIM_Pulse = CCR4_Val; 
 
  TIM_OCInit(TIM3, &TIM_OCInitStructure);

  TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
 
  TIM_ARRPreloadConfig(TIM3, ENABLE);

 
  TIM_Cmd(TIM3, ENABLE);

  while (1)
  {
 
}

 


关键字:STM32  开发板  TIM  PMW模式 引用地址:STM32开发板学习日记-[5]TIM的PMW模式

上一篇:STM32 GPIO的配置
下一篇:STM32 定时器(二)——定时器产生不同频率的PWM

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

STM32-(10):Printf
学C语言的时候我们经常将printf作为打印输出,可以加格式转换符,比如十进制,十六进制,浮点输出,功能十分强大。在硬件进行调试的时候,也希望能输出这样一个结果,能够看到内部的ARM工作在什么状态,或者运行的结果,一般会用到数码管、液晶屏,但是控制起来麻烦,如果也能用到printf,那肯定很方便! 此时我们只需将printf重定向,原来是输出到屏幕,我们只需要重定向输出到串口。 串口只需要一个串口助手就能看到打印。 printf 是 标准的输入输出库 stdio.lib 内实现的, 这个 lib 库赖以支持的基础是一个文件流 FILE,文件流内有很多的底层函数,比如:_sys_exit _sys_open ,其中有一个底层函数
[单片机]
STM32】7—通用定时器 & 时钟树学习
0 实验预期效果 让LED闪烁(每秒钟内:亮0.5s,再暗0.5s)。 1 相关原理图 2 定时器TIM2与时钟树 2.1 TIM2 简介与特性 关于通用定时器TIM2,查STM32F407中文手册392页可知: ① TIM2 到 TIM5 简介: 通用定时器包含一个16 位或 32 位自动重载计数器,该计数器由可编程预分频器驱动。 它们可用于多种用途,包括测量输入信号的脉冲宽度(输入捕获)或生成输出波形(输出比较和 PWM)。 使用定时器预分频器和 RCC 时钟控制器预分频器,可将脉冲宽度和波形周期从几微秒调制到几毫秒。 这些定时器彼此完全独立,不共享任何资源
[单片机]
【<font color='red'>STM32</font>】7—通用定时器 & 时钟树学习
STM32】SRAM启动
创建工程的调试版本 该操作调试版本会复制原工程的配置 修改FLASH的目标配置 用的是STM32F103C8T6 RAM起始地址为是0x2000 0000大小为20KB, 这里用12KB大小的RAM作为虚拟ROM,用8KB的RAM作为RAM 虚拟ROM起始地址0x2000 0000大小0x3000 RAM起始地址0x2000 3000大小0x2000 配置分散加载文件 keil STM32中sct 分散加载文件学习 注意要与FLASH下的目标配置一致 虚拟ROM起始地址0x2000 0000大小0x3000 RAM起始地址0x2000 3000大小0x2000 ; *************************
[单片机]
【<font color='red'>STM32</font>】SRAM启动
浅谈STM32的端口输出方式
STM32有两个寄存器可以控制IO输出, 一个是ODR寄存器, 只使用了低16位. 向此寄存器写数据, 就可以控制某个引脚的输出电平. BSRR寄存器是端口位设置/清除寄存器. 此寄存器和ODR寄存器有类似的功能, 都可以来用设置GPIO端口输出.此寄存器分为高16位和低16位, 向高16位的某位写1清除对应ODR寄存器位(输出0), 写0无影响. 向低16位某位写1置位对应ODR寄存器位(输出1), 写0无影响. 可见两个寄存器均可以控制IO输出, 从上文可知写BSRR实际上是可以影响ODR寄存器的值的, 那么使用这两个寄存器控制输出有什么区别呢? 在ST的手册中有这样的说明(RM0090 266页): Each I/O por
[单片机]
基于STM32的USB枚举过程学习笔记(三)
上一篇介绍到了主机上电复位USB设备,在控制传输的建立过程,发送了8个字节的数据给设备,这8个字节为0x80 0x06 0x00 0x01 0x00 0x00 0x40 0x00,该请求为USB标准设备请求中的GET_DESCRIPTOR请求。0x80表示标准设备请求,数据方向是设备到主机。0x60表示请求类型GET_DESCRIPTOR。0x01表示描述符类型是设备描述符。0x40表示描述符长度。 设备在收到该请求以后,首先进行解析,根据请求中的0x40表示该控制传输有数据过程,因此进入到Data_Setup0()函数。该函数根据请求的不同描述符,执行不同的回调函数 CopyRoutine(),并在DataStage
[单片机]
基于<font color='red'>STM32</font>的USB枚举过程学习笔记(三)
stm32的gpio口的介绍
我最近在学stm32,想和大家分享自己的学习成果,也和大家一起学习交流。之前学习过15的库函数的套用,经过一段时间摸索,我对stm32的使用有了基础的了解。因为板子不是正点原子和野火,所以有些不同。 每个板子视频教学第一个介绍都是stm32的gipo口的介绍,这个io口跟51的io口定义全然不同,并且能配置自身频率,而且有些定义用到了结构体。而且stm32是32位的单片机,内部的32位寄存器太多,很难记住,所以建议使用库函数的办法,先学会套用,后来在更改参数或者做一些小项目的时候,对一些寄存器做一些更深入的理解。 首先我们讲一下gipo口void led_init(void) { GPIO_InitTypeDe
[单片机]
一个能效更高的USB-C保护解决方案
TCPP01-M12芯片可以在受电模式(充电)下保护USB Type-CTM接口,防止过压冲击接口针脚,VBUS线最大耐压24V,CC线最大耐压6V,还具有静电放电防护等安全功能。TCPP代表了Type-C接口保护,同时TCPP01-M12可与内置 USB-C Power Delivery (UCPD)控制模块的STM32 MCU配套使用。因此,微控制器STM32G0、STM32G4、STM32L5 或 STM32U5均可以与TCPP01-M12搭配使用,并且比用大量的外部器件更划算。TCPP01-M12 的独到之处还在于,当接口没有连接任何设备时,其静态电流为零。 TCPP01-M12: 保护USB-C的热度 USB-C的崛
[单片机]
一个能效更高的USB-C保护解决方案
STM32之一步一步点亮led
入手stm32以来,一直想快速上手,所以在各大论坛闲逛,各个达人的blog上学习,正所谓欲速则不达,心急是吃不了热豆腐的!有木有? 最终决定使用st官网的库开发,据大侠们写道使用库可以快速上手,貌似的确如此,一个个教程写的那么好,直接拿过来用就是了。可是那么多个库,聪明的你请告诉到底选择哪一个啊?My God!实话实说,我被这些库折腾了个够!好吧,我最后还是承认最后用的是v3.4的库,是很方便! 切入正题,点亮LED。 硬件:红牛开发板,STM32F103ZET6(144封装). 软件: RealView MDK 4.12 stm32固件库:v3.4 附上自己整理后的库: V3.4_clean.rar 根据官网库自己整理
[单片机]
<font color='red'>STM32</font>之一步一步点亮led
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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