0602STM32定时器输出比较

STM32定时器输出比较

主要用来输出PWM波形,PWM波形又是驱动电机的必要条件,所以如果想用STM32做一些有电机的项目,比如智能车,机器人等。那输出比较功能就要认真掌握
1.PWM驱动LED呼吸灯
2.PWM驱动舵机
3.PWM驱动直流电机
在这里插入图片描述
IC Input Compare 输入捕获
CC Capture/Compare 输入捕获和输出比较的单元
在这里插入图片描述
输入捕获和输出比较共用的,当使用输入捕获时,就是捕获寄存器
当使用输出比较时,就是比较寄存器。
在输出比较这里,这个电路会比较CNT和CCR的值,CNT计数自增,CCR是我们给定的一个值,当CNT大于CCR、小于CCR或者等于CCR时,这里输出就会对应的置1,置0,置1,置0.这样就可以输出一个电平不断跳变的PWM波形了。这就是输出比较的功能

通用计数器这四个通道有各自的CCR寄存器,但是它们是共用一个CNT计数器的。
高级定时器的前三个输出比较还额外具有死区生成和互补输出的功能。是用于驱动三相无刷电机的。暂时不作为重点内容
先主要学习通用定时器。

PWM简介

在这里插入图片描述
PWM秘诀:天下武功,唯快不破
应用场景必须是一个惯性系统,就是说LED在熄灭的时候,由于余晖和人眼视觉暂留现象。LED不会立马熄灭,而是有一定的惯性,过一小段时间才会熄灭。
电机也是,当电机断电时,电机的转动不会立马停止,而是有一定的惯性,过一会才会停。
具有惯性的系统才能使用PWM

高低电平跳变的数字信号,可以等效为中间虚线所表示的模拟量的。
PWM频率越快,那它等效模拟的信号就越平稳,同时性能开销就越大,一般PWM的频率在几KHz到几十KHz,这个频率就已经足够快了。
如果占空比只能以1%,2%,3%等这样以1%的步距跳变,那它的分辨率是1%,分辨率就是占空比变化的精细程度
分辨率需要多高,看项目的需要。如果既要高频率,又要高分辨率,这就对硬件电路要求比较高了。

在这里插入图片描述

在这里插入图片描述
左边是CNT计数器和CCR第一路的捕获/比较寄存器,它俩进行比较,当CNT>CCR1,或者CNT=CCR1时,就会给输出模式控制器传一个信号,然后输出模式控制器就会改变它输出OC1REF的高低电平。
REF信号实际上就是指信号的高低电平,reference。 参考信号
ETRF输入,这是定时器的一个小功能,一般不用,需要了解。REF信号可以前往主模式控制器。
可以把REF映射到主模式的TRGO输出上去,
不过REF的主要去向还是下面这一路,CC1P是一个极性选择,给这个寄存器写0,信号就会往上走,就是信号电平不翻转。进来啥样出去就是啥样,写1的话,信号就会往下走,就是信号通过一个非门取反。那输出信号就是输入信号高低电平翻转的信号。这就是极性选择,就是选择是不是要把高低电平反转一下。接着就是输出使能电路,选择要不要输出,最后就是OC1引脚,这个引脚就是CH1通道的引脚,在引脚定义表里就可以知道具体是哪个GPIO口了。
这就是输出的通道

接下来还要看输出模式控制器,具体是怎么工作的。什么时候给REF高电平,什么时候给REF低电平。

在这里插入图片描述

此处高级定时器的第4个通道和通用定时器的结构基本是一样的

在这里插入图片描述

左边是CNT和CCR比较的结果,右边是输出比较电路,最后通过TIM_CH1输出到GPIO引脚上,下面还有三个同样的单元,分别输出到CH2、 CH3、 CH4

  • 10
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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%),输出极性为高电平。最后,定时器被使能并开始计数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值