历史上的今天
返回首页

历史上的今天

今天是:2024年12月10日(星期二)

正在发生

2018年12月10日 | STM32 通用定时器的输出PWM功能 学习笔记

2018-12-10 来源:eefocus

首先来说,你要使用PWM模式你得先选择用哪个定时器来输出PWM吧!除了TIM6、TIM7这两个普通的定时器无法输出PWM外,其余的定时器都可以输出PWM,每个通用定时器可以输出4路PWM,高级定时器TIM1、TIM8每个可输出7路PWM。选好定时器及通道后,下一步就是要使能定时器的时钟。先贴代码,再对每条代码做详细分析。


TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2


TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能


TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高(也就是选择有效电平,这里是高电平为有效电平)


TIM_OC2Init(TIM3, &TIM_OCInitStructure);   //根据T指定的参数初始化外设TIM3 OC2


TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器,即TIM3_CCR2的预装载值在更新事件到来时才能被传送至当前寄存器中。


TIM_Cmd(TIM3, ENABLE);  //使能TIM3


这6句话就把PWM的通道配置好了,现在来解释每一条代码:


为什么选择的是PWM2模式呢?为什么不选择PWM1模式呢?两者又有什么区别呢?


下面我们就一探究竟,PWM1和PWM2模式是由CCMRx的OCxM来决定的,因为我们选择的是是通道2,所以设置的是OC2M,再看相关介绍OCxM[2:0]:


110:PWM模式1- 在向上计数时,一旦TIMx_CNT


在向下计数时,一旦TIMx_CNT>TIMx_CCRx时通道x为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。


111:PWM模式2- 在向上计数时,一旦TIMx_CNT


在向下计数时,一旦TIMx_CNT>TIMx_CCRx时通道x为有效电平,否则为无效电平。


TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; 这句就是用来选有效电平,HIGH就代表1为有效电平。


TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器,


即TIM3_CCR2的预装载值在更新事件到来时才能被传送至当前寄存器中。


这句话是说,CCR2中的预装载值何时被传送到当前的CNT寄存器中,这里我们选择的是当更新事件到来的时候才装载,


追踪寄存器的设置可知,原来设置的是CCMR1的OC2PE,其实还有一种方式是立即装载看手册:


OC1PE:输出比较1预装载使能(Output compare 1 preload enable)  位3 


0:禁止TIMx_CCR1寄存器的预装载功能,可随时写入TIMx_CCR1寄存器,并且新写入的数值立即起作用。


1:开启TIMx_CCR1寄存器的预装载功能,读写操作仅对预装载寄存器操作,


TIMx_CCR1的预装载值在更新事件到来时被传送至当前寄存器中。


TIM_OC1PreloadConfig(),TIM_ARRPreloadConfig();这两个函数控制的是ccr1和arr的预装在使能,使能和失能的区别就是:


使能的时候这两个储存期的读写需要等待有更新事件发生时才能被改变(比如计数溢出就是更新时间)。失能的时候可以直接进行读写而没有延迟。


另外在运行当中想要改变pwm的频率和占空比调用:TIM_SetAutoreload();TIM_SetCompare1()这两个函数就可以了。


学习后发现stm32的定时器功能确实很强大,小总结一下方便以后使用的时候做参考。


Stm32定时器一共分为三种:tim1和tim8是高级定时器,6和7是基本定时器,2—5是通用定时器。从名字就可以看得出来主要功能上的差异。


今天我主要是用定时器做pwm输出,所以总结也主要是针对pwm方面的。先大致说下通用和高级定时器的区别。通用的可以输出四路pwm信号互不影响。高级定时器可以输出三对互补pwm信号外加ch4通道,也就是一共七路。所以这样算下来stm32一共可以生成4*5+7*2=30路pwm信号。接下来还有功能上的区别:通用定时器的pwm信号比较简单,就是普通的调节占空比调节频率(别的不常用到的没去深究);高级定时器的还带有互补输出功能,同时互补信号可以插入死区,也可以使能刹车功能,从这些看来高级定时器的pwm天生就是用来控制电机的。


推荐阅读

史海拾趣

Comtech AHA Corp公司的发展小趣事

Comtech AHA Corp自创立之初,便以技术创新为核心竞争力。公司研发团队不断攻克技术难关,推出了一系列具有自主知识产权的高性能电子产品。其中,一款具有自主知识产权的通信芯片在市场上取得了巨大成功,为公司带来了可观的收益。随着技术的不断迭代升级,Comtech AHA Corp逐渐在电子行业中占据了一席之地。

DCCOM [ DC COMPONENTS ]公司的发展小趣事

在快速发展的过程中,DCCOM公司始终坚持品质至上的原则。公司建立了一套严格的质量控制体系,从原材料采购到产品生产的每一个环节都严格把关。这种对品质的执着追求,使得DCCOM的产品在市场上赢得了良好的口碑,客户回头率逐年攀升。

科山芯创(COSINE)公司的发展小趣事

面对未来,科山芯创有着清晰的规划和展望。他们将继续加大研发投入,不断推出更多高性能、高品质的芯片产品;同时,他们还将积极拓展国际市场,提升品牌影响力;此外,科山芯创还将加强与产业链上下游企业的合作,共同推动电子行业的创新与发展。

以上五个故事概述了科山芯创在电子行业中的发展历程和成就。作为一家专注于高性能、高品质射频及模拟集成电路芯片研发与设计的创新型企业,科山芯创以其强大的技术实力和优质的服务赢得了市场的认可和尊重。

BJB公司的发展小趣事

BJB公司的创立源于对照明电器领域的深刻理解和市场需求的敏锐洞察。创立初期,公司面临着资金短缺、技术挑战和市场竞争等多重困难。然而,通过创始人的坚定信念和团队的共同努力,BJB逐渐攻克技术难关,推出了一系列高质量的照明配件产品,初步在市场中获得了认可。

Akustica(Bosch)公司的发展小趣事

随着科技的不断进步,BJB公司意识到技术创新的重要性。因此,公司加大了研发投入,积极引进先进的技术和设备,致力于照明配件产品的创新和升级。经过不懈的努力,BJB成功研发出具有高效节能、环保低碳特点的照明配件产品,不仅提升了产品的性能和质量,也满足了客户对绿色照明的需求。

FOCI Fiber Optic Communications Inc公司的发展小趣事

在国内市场取得一定成绩后,BJB公司开始积极拓展国际市场。公司积极参加国际展览和交流活动,与国际同行建立合作关系,将产品打入国际市场。同时,BJB还与国际知名品牌进行战略合作,共同研发和推广照明产品,进一步提升了公司的国际影响力。

问答坊 | AI 解惑

快来看,NEC赠送芯片的资料

本帖最后由 paulhyde 于 2014-9-15 09:09 编辑 比赛时会用到的 [ 本帖最后由 燕子宝贝 于 2009-9-1 21:01 编辑 ]  …

查看全部问答>

usb问题

请问大哥们。。usb的检测是怎么一回事呢。。。。我怎么知道他插入了呢,CE里面的代码在哪里呢。。…

查看全部问答>

DeviceIoControl 调用驱动 如何得知驱动被调用了呢 ? dbgview.exe 看不到输出

我用 delphi 做了个调用自己驱动(win 2k ddk) 可是DeviceIoControl   总返回false  也不知道驱动运行没有 哪怕进入了 入口函数 如果驱动被调用  如何看到 入口函数中   DbgPrint  调试信 ...…

查看全部问答>

问个小问题~~

各位大虾......弱弱的问下.... 现在要招嵌入式开发的公司是不是都不要新手的呢? 偶想转..不知道有没有公司要新手的...一个人自学好难啊~~…

查看全部问答>

.Net Compact Framework 1.1中有没有获得当前线程ID的方法?

.Net Compact Framework 1.1中有没有获得当前线程ID的方法? 完全版中倒是有AppDomain.GetCurrentThreadID() coredll.dll中有没有我也不知道。 哪位大虾帮帮我啊~…

查看全部问答>

线路的尖峰毛刺造成FPGA工作不正常

  使用EP2C35 FPGA 设计了多个串口工作,出现了几个问题. 第一次, 由于内核电源1.2V 供电不是完整平面,而是带状线供电,EP2C35 在代码容量大的情况下,而且输入FPGA 信号变换频繁, 造成整个EP2C35 所有的D触发器停止翻转. 经过多次验证, 只要输入 ...…

查看全部问答>

请问:Error[e16]: Segment CSTACK (size: 0x50 align: 0x1) is too long for segment de

Error[e16]: Segment CSTACK (size: 0x50 align: 0x1) is too long for segment definition. At least 0x4 more bytes needed. The pro××em occurred while processing the segment placement command "-Z(DATA)CSTACK+_STACK_SIZE#", wher ...…

查看全部问答>

ARM问题

我用ADS1.2编译生成两个目标文件(init.o 和main.o),仿真没问题,但是我烧了几次复位没有反应(S3C2410开发板)。请高人请点:两个目标文件(init.o和main.o)怎么烧写。备注一下,我烧写用K9S1208()函数。…

查看全部问答>

子节点重启组网问题

本人用一个协调器和五个子节点组网,组网完成后,把协调器关了,然后过一会再打开,这个时候子节点就不能完全连接上,PANID 是0x0045,手动指定的,NV_INIT和NV_RESTOR都没有编译进去,高手指点啊…

查看全部问答>