完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
STM32 定时器除了基本计数定时功能外,还对外扩展了输入、输出通道,从而可以实现输入捕获、比较输出功能。
比较输出[Compare Output]功能:定时器通过对预设的比较值与定时器的值做匹配比较之后,并依据相应的输出模式从而实现各类输出。如PWM输出、电平翻转、单脉冲模式、强制输出等。一般来说,STM32的通用定时器和高级定时器都具有比较输出功能,不同的定时器可能通道数量上有差异。 或者,我们可以使用比较输出功能来感知或提示某个时间段已经过去了。因为比较输出的基本特征是计数器CNT的值与比较寄存器CCR的值作比较,计数器数据变化意味着时间流逝,当计数器记到与比较值相等或向匹配时,也就表示相应时间段的过去。 具体应用到STM32定时器,在比较输出模式下,当捕获比较单元监测到计数器CNT的值与CCR寄存器值数字相等时,将根据相应的输出比较输出模式实现相应输出。比较输出功能主要靠捕获比较单元实现,同时定时器输出单元与时基单元协同配合。 捕捉比较单元有个重要的寄存器,捕捉比较寄存器CCR ,它由影子寄存器/预装载寄存器组成。用户访问时,访问预装载寄存器。预装载功能可以开启或关闭。由OCxPE@TIMx_CCMR控制。 需要修改的预装数据立即生效时将预装功能关闭。 需要修改的数据不影响当前周期的计数或波形输出时,我们就打开其预装功能。 比较输出流程: 捕获/比较通道的输出部分(通道1至3) 当定时器的比较输出单元检测到计数器CNT的值与捕获比较寄存器CCR的值发送匹配事件时,定时器的比较输出单元会根据比较输出模式输出相应的信号,该信号我们称之为 中间参考信号,即OCxREF。 该OCxREF源与输出模式控制器,并硬件约定高电平为有效电平 它经过极性选择后,在经过输出控制电路输出到到管脚。当极性选择位 CCxP = 0 时。高电平为OCx的有效输出电平,当CCxP = 1时,低电平作为OCx的有效输出。 也就是说:OCxREF 信号只是一个中间参考信号,并非最终输出信号,最终输出端OCx的 Active state【有效状态】/ inactive state【无效状态】所对应的电平取决于极性选择控制位CCxp/CCxNP。 也就是最终的输出需要由2个信号来控制,一个是 OCxREF中间参考信号,用来确定有效信号和与无效信号,另一个CCxP用来控制,有效信号或者无效信号的高电平和低电平。 总结为一张表: [tr]OC1REFCC1P功能OC1描述[/tr]00OC1高电平有效0(低电平)无效 1OC1低电平有效1(高电平)无效 10OC1高电平有效1(高电平)有效 1OC1低电平有效0(低电平)有效 比较输出事件: 当核心计数器的值CNT与比较寄存器CCR 的数值匹配时发生比较输出事件 相应通道的比较输出标志位CCxIF@TIMx_SR被置位 触发比较中断 (如果CCxIE@TIMx_DIER被置位使能) 触发DMA请求 (CCxDE@TIMx_DIER CCDS@TIMx_CR2 使能允许) 比较输出事件也可以软件方式产生。通过操作TIMx_EGR@CCxG位来实现 对于这些比较输出有关的事件,我们需要做到心中有数。因为在我们定时器中,往往需要基于相关事件来开展我们的应用开发。比如基于比较输出事件,做脉冲波形频率或占空比的变更、做脉冲个数的统计、做DMA的请求等等。。 另外,TIMx_CCRx寄存器能够在任何时候通过软件进行更新以控制输出波形,条件是未使用预装载寄存器(OCxPE=’0’,否则TIMx_CCRx的影子寄存器只能在发生下一次更新事件时被更新)。 下图给出了一个例子。 输出比较模式预览 总的来讲,这几个比较输出模式,我们有必要对它们的各自输出特征做基本了解,它是我们做比较输出应用时的基础。比方不同比较输出模式,结合不同的计数模式,相应的输出特征是什么。 边沿对齐PWM输出波形示例【Up Counting + PWM mode1】: 以下以PWM模式1为例。只要 TIMx_CNT 《 TIMx_CCRx。PWM的参考信号 OCxREF便为高电平,否则为低电平。 如果 TIMx_CCRx中的比较值大于自动重装载值(TIM_ARR中),则OCxREF保持为“1”,如果比较值为“0”,则OCxREF保持为“0”。 中心对齐PWM输出波形示例【Center aligned Mode + PWM1】 PWM输出频率计算: 定时器比较输出最常见的应用就是PWM输出,即脉宽调制输出。这里简单介绍下PWM输出波形参数的计算。 以计数器向上计数、PWM1为例: PWM输出方波信号,信号的频率有TIMx的计数时钟频率和TIMx_ARR这个寄存器决定。输出信号的占空比由TIMx_CRRx寄存器和TIMx_ARR寄存器的值所决定。 占空比 = (TIMx_CRRx / (TIMx_ARR+1))* 100%。 频率 = CK_PSC / ((PSC + 1) * (ARR + 1)。 单脉冲模式 单脉冲模式(OPM)是上述模式的一个特例,在这个模式下,计数器可以在一个激励信号的触发下启动,并且可在一段可编程的延时后产生一个脉宽可编程的脉冲。 可以通过从模式控制器启动计数器。可以在输出比较模式或PWM模式下生成波形,将 TIMx_CR1 寄存器中的 OPM 位置1,既可以选择单脉冲模式。这样发,发生下一次更新事件 UEV时,计数器将自动停止。 只有当比较值与计数器初始值不同时,才能正确产生一个脉冲。启动前(定时器等待触发时),必须如下配置: 递增计数模式下:CNT《CCRxARR(特别注意,0《CCRx) 递减计数模式下:CNT》CCRx 原理: 计数器启动后,在下一个更新事件来临之前的时间段内实现固定个数的脉冲输出。当下一个更新事件来临时计数器停止计数。输出的脉冲个数可以一个或几个。如果是通用计数器就是1个,如果是高级定时器,脉冲个数与RCR数值和计数模式有关。 实现方式 使用OC比较输出或PWM输出模式。 启动 计数器的启动可以通过自身软件使能启动,也可以将定时器配置在触发从模式经过触发启动。 例如:你需要在从TI2输入脚上检测到一个上升沿开始,延迟tDELAY之后,在OC1上产生一个长度为tPULSE的正脉冲。 假定TI2FP2作为触发1: 置TIMx_CCMR1寄存器中的CC2S=01,把TI2FP2映像到TI2。 置TIMx_CCER寄存器中的CC2P=0,使TI2FP2能够检测上升沿。 置TIMx_SMCR寄存器中的TS=110,TI2FP2作为从模式控制器的触发(TRGI)。 置TIMx_SMCR寄存器中的SMS=110(触发模式),TI2FP2被用来启动计数器。 OPM的波形由写入比较寄存器的数值决定(要考虑时钟频率和计数器预分频器) tDELAY由TIMx_CCR1寄存器中的值定义。 tPULSE由自动装载值和比较值之间的差值定义(TIMx_ARR - TIMx_CCR1)。 假定当发生比较匹配时要产生从0到1的波形,当计数器达到预装载值时要产生一个从1到0的波形;首先要置TIMx_CCMR1寄存器的OC1M=111,进入PWM模式2;根据需要有选择地使能预装载寄存器:置TIMx_CCMR1中的OC1PE=1和TIMx_CR1寄存器中的ARPE;然后在TIMx_CCR1寄存器中填写比较值,在TIMx_ARR寄存器中填写自动装载值,设置UG位来产生一个更新事件,然后等待在TI2上的一个外部触发事件。本例中,CC1P=0。 在这个例子中,TIMx_CR1寄存器中的DIR和CMS位应该置低。 因为只需要一个脉冲,所以必须设置TIMx_CR1寄存器中的OPM=1,在下一个更新事件(当计数器从自动装载值翻转到0)时停止计数。 比较输出应用时的几个注意点 高级定时器相比通用定时器,它增加了主输出使能控制位,【MOE@timx_bdtr】,如果该位置零的话,此时OCx端没有波形输出; 高级定时器相比通用定时器,它增加了刹车控制机制,BKE@timx_bdtr】,如果使能了刹车控制并触发有效刹车电平,此时OCx端没有波形输出; 高级定时器相比通用定时器,使用互补输出时增加了死区插入机制,【DTG@timx_bdtr】,若插入的死区时间过大,当超过有效输出电平宽度时,会导致OCx/OCxN一端或两端没有变化的波形输出; 高级定时器的互补输出在OCxREF出来后、在极性选择之前,二者是互补的,经过极性选择后是否互补取决于两互补通道的极性选择。极性的选择最终由实际驱动电路需求决定的。 定时器的所有输出通道可以独立自由设置,如禁用/开启、输出模式选择、极性安排等。但高级定时器的做互补输出时,他们共用相同输出模式和CCR值。 对于通用定时器的Ocx通道,当使能该通道时,Ocx输出=OCxREF+极性;当禁用该通道时,Ocx的输出=0。 对于高级定时器Ocx/OCxN互补通道,没法同时实现实现有效输出。注意区分有效电平、无效电平与最终输出端的高、低电平。 对于高级定时器来说,Ocx/OCxN的输出除了跟输出使能位有关外,跟其它多个控制位【MOE/OSSI/OSSR/CCxP/CCxNP】有关。各个系列的STM32参考手册中有个Ocx/OcxN互补通道输出控制表格可以查看。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1618 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1545 浏览 1 评论
979 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
683 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1597 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
645浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
516浏览 3评论
532浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
505浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 14:40 , Processed in 0.734847 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号