STM32定时器(输出比较)

接之前的定时器部分,今天讲解定时器的输出比较部分,也就是右下角红色圆圈里的部分,包括接下来的结构框图,都是基于这个定时器的结构图抠一部分下来细讲的,先了解一下输出比较是在定时器的具体哪个部分

                                        输出比较简介

  OC(output compare)输出比较。输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1,置0或者翻转的操作,用于输出一定频率和占空比的PWM波形,每个高级定时器和通用定时器都拥有4个输出比较通道。

看上面的结构图,我们能看出,输出比较就是由上面的时基单元传参,到下面的输出比较单元,也就是与捕获/比较寄存器(CCR)对比参数,然后输出PWM波形,听起来有点抽象,我给大家画一个流程图(字丑,大家将就看哈哈)

 上面是时基单元,下面是输出比较单元,还有就是PWM波形,简单介绍一下

                                                         PWM简介

Pulse width modulation 脉冲宽度调制

在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速等领域

频率 =1/T(s)   占空比 =T(on)/T(s)  分辨率=占空比变化步距

PWM波形就是我们最终输出的高低电平的变化波形,当高低电平变化足够快时,就能让接收电平的载体达到一种新的状态

按道理来说,电平只有高电平1和低电平0,但是如果当输出的电平高低频率变化足够快时,就能得到高低电平的中间任意值,就好似点亮一个LED灯,一般来说,LED灯只有亮和熄灭两种状态,但是我们如果输入的高低电平信号跳变频率足够快时,LED就会由于惯性呈现一种中等亮度,就能看到LED灯微亮的状态,当然电机调速也一样的道理

再看上面的PWM波形图,当高电平的时间长一点,低电平的时间短,等效模拟量就偏向高电平,当然高电平时间短,低电平时间长,等效模拟量就偏向低电平,当然输出PWM波形必须要在有惯性的系统中才有效果,比如LED灯,电机啥的 

了解完PWM波形接下来开始讲解通用定时器输出比较大框架(上面大图抠出来细讲)

 从左边开始,CNT在一个设置好的范围里自增,同时,还要和你的CCR寄存器不断比较,大于或者小于就输出对应的电平(当然对比的要求可以通过写程序自己设置),输出的电平就是REF,主模式是映射到TRGO,一般用的少,了解一下就行,接着向右到极性选择器,给寄存器(CC1P)写0的话,信号就往上走(0那条路),就是电平正常不翻转,如果寄存器(CC1P)写1,走下面那条路(1那条路),电平翻转,意思就是传过来的REF电平信号,是正常输出还是翻转输出,可以通过这个CC1P再选择一次,可能是我学的太浅了,觉得有点多余哈,当然别人设计出来肯定有它的道理,接着到使能电路,就是使能一下,也就是开关,打开就可以输出

接着刚刚说到对比的要求可以自己设置,那么这个输出模式控制器有哪些模式可以选择呢

CNT就是计数器不断自增,然后CCR寄存器写值,CNT和CCR匹配成功相等时,就输出电平信号,电平信号也就是REF,前几个模式很简单不用说,就是相等就保持原状态,也就是上一次电平的状态,还有无效电平,有效电平啥的顾名思义很简单哈,用的也不多,我们直接说用的最多的PWM模式1和PWM模式2 

                                        先看一张图

首选蓝色的很容易看出是个CNT计数器,在我们设置的阈值(黄色线)里不断自增(ARR自动重装寄存器),这个阈值就是黄色的线,蓝色CNT计数器自增达到阈值(ARR)就清零,再次不断自增,当然之前我们讲的这个时基单元有中断哈,这里不用中断,计数器在不断计数工作,我们再在这个阈值里设置一个CCR(比较器),当计数器和设置的CCR匹配上时,就输出对应的电平

PWM模式1:  向上计数,CNT小于CCR时,看下面图,就置高电平,CNT大于CCR,REF就低电平,向下计数就同理相反

PWM模式2同理,不过相反,一般用模式1就行,因为REF过去之后有一个极性选择器,用模式1也能做到模式2的效果

为了更清晰了解输出比较的工作模式,看这张图思路再整理一下

当然通用定时器的输出比较电路讲了,还有高级定时器的输出比较没讲,作为学生,为暂时还没用到高级定时器,一般通用就够了,但是我还是放一张高级定时器的结构图,大家看一下 

 

 看得出来,高级定时器的输出比较通道相对于通用定时器的通道,基本一样,就多了下部分死区生成,高级定时器我作为学生了解不多,看结构图,大概猜测是为了保护电路用的,既然涉及到保护电路,当然高级定时器是用到大功率的设备上了

输出比较部分讲完了,当然一般配合输出比较使用的设备还需要驱动芯片配合使用,比如要设计一个可调速的直流电机,那就还要配置一个直流电机驱动芯片,来驱动电机,最后来简单过一下代码

1:RCC开启时钟,把我们要用到的TIM外设和GPIO外设的时钟打开

 

2:配置时基单元

3:配置输出比较单元,用结构体配置参数

 

4:配置GPIO(参考引脚定义表),用的输出比较通道1,CH1参考引脚定义表,为P0,所以配置PA0为GPIO口

5:运行控制,启动计数器

这样输出比较初始化就配置好了,如果还想要CCR不断变化的话,可以用这个函数

谢谢观看,一个大三学生的自学总结,有什么不对的地方还望大家理解并指出

 

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
STM32中,定时器输出比较模式可以通过以下步骤进行配置: 1. 初始化定时器的时钟和基本设置,如定时器模式、预分频器和计数器方向等。 2. 配置定时器输出比较模式。这可以通过设置定时器输出比较寄存器(CCR)来完成。每个CCR寄存器控制一个输出通道。 3. 配置CCR寄存器的比较值(CCRx)和比较模式(OCxM)。比较值是一个16位的数字,用于与计数器的当前值进行比较比较模式定义了何时输出比较结果。 4. 配置CCR寄存器的输出模式(OCxPE和OCxFE)。OCxPE用于使能CCR寄存器的预装载功能。OCxFE用于使能CCR寄存器的快速输出模式。 下面是一个示例代码,用于配置定时器TIM1的输出比较通道1(CH1): ``` // 初始化定时器TIM1 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 999; // 计数器重载值 TIM_TimeBaseStructure.TIM_Prescaler = 719; // 预分频器,得到1ms的计数周期 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 计数器向上计数 TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); // 配置TIM1的输出比较通道1 TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // 输出比较模式为PWM1 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 使能输出 TIM_OCInitStructure.TIM_Pulse = 500; // 比较值 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 输出极性为高电平 TIM_OC1Init(TIM1, &TIM_OCInitStructure); // 使能TIM1 TIM_Cmd(TIM1, ENABLE); ``` 在这个示例中,定时器TIM1被初始化为一个1kHz的计数器。输出比较通道1被配置为PWM1模式,比较值为500(占空比50%),输出极性为高电平。最后,定时器被使能并开始计数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值