STM32:TIM定时器输出比较(OC)

这篇具有很好参考价值的文章主要介绍了STM32:TIM定时器输出比较(OC)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、输出比较简介
1、输出比较
OC(Output Comapre)输出比较
输出比较可以通过比较CNT(时基单元)和CCR(捕获单元)寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率的占空比的PWM波形(CC是捕获/比较的意思,R是Register,寄存器的意思),这个捕获/比较寄存器是输入捕获和输出比较共用的,当使用输入捕获时,他就是捕获寄存器,当时用输出比较时,它就是比较寄存器。
每个高级定时器和通用定时器都有4个输出比较通道
高级定时器的前3个通道额外拥有死区生成和互补输出的功能
注:简单来说就是在输出比较这里这块电路会比较CNT和CCR的值,CNT计数自增,CCR是我们给定的一个值,当CNT大于CCR、小于CCR、等于CCR时,输出就会输出对应的置1或置0。

STM32:TIM定时器输出比较(OC)

 文章来源地址https://www.toymoban.com/news/detail-445951.html

 对应的数字电路框图为红圈部分

STM32:TIM定时器输出比较(OC)

 

2、PWM简介


PWM(Pluse Width Modulation)脉冲宽度调制
在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟量,常用于电机控速等领域,也就是说,使用这个PWM波形,是用来等效地实现一个模拟信号的输出,也就是以一个很快的频率,给电机通电、断电,也就使电机维持在一个中等速度
PWM参数:频率=1/Ts     占空比=Ton/Ts   分辨率=占空比变化步距
STM32:TIM定时器输出比较(OC)

 

3、定时器的结构

1、输出比较(OC)通道(通用定时器模块)

STM32:TIM定时器输出比较(OC)

 图解:在这个图里,左边就是CNT计数器(时基单元模块中的)和CCR1第一路的捕获/比较寄存器 ,他俩进行比较,当CNT>CCR1或者CNT=CCR1时就会给输出模式控制器传一个信号,然后输出模式控制器就会改变它输出OC1REF的高低电平(REF时reference的缩写,意思是参考信号),然后上面还有个ETRF输入,这是定时器的一个小功能一般不用了解,接着REF信号可以前往主模式控制器,你可以把这个REF映射到主模式的TRGO输出上去,但主要还是下面那一路(极性选择部分),给这个寄存器写0,信号会往上走,就是信号电平不翻转进来啥样出去啥样,写1的话,信号就会往下走,就是信号通过一个非门取反,那输出信号就是输入信号高低电平反转的信号,再往后就是输出使能电路就是选择要不要输出,最后就是OC1引脚,这个引脚就是CH1的通道的引脚。

2、输出比较通道(高级定时器)

STM32:TIM定时器输出比较(OC)

 

 右侧为外围电路,则OC1和OC1N为互补输出,分别控制上管和下管的导通和截止
理想情况下,上管导通的瞬间下管要在同一瞬间关闭,但是实际情况下可能会因为器件的不理想导致上管未完全关闭,下管就导通了,出现了短暂的上下管短暂导通的情况,引起器件发热,所以有了死区生成电路,它会在上管关闭的时候延迟一小段,再导通下管,下管导通的时候,延迟一小段,在导通上管。

4、输出模式控制器模式

下图为输出模式控制器可以设置的模式(就是通用定时器的输出模式控制器模块的功能

STM32:TIM定时器输出比较(OC)

1:第一个模式是冻结,描述的实CNT=CCR时,REF保持原态,比如在输出PWM波,突然想暂停一会儿输出,就可以设置成这个模式,高低电平维持在暂停时刻
2:匹配时值置有效电平,匹配时值置无效电平,匹配时值电平翻转,就是CNT=CCR时,REF分别置高电平,低电平,电平翻转,在匹配时值电平翻转模式下,可以产生一个占空比为50%的方波
3:强制为无效电平和强制为有效电平两个模式和冻结模式相似,如果你想暂停波形输出,并且在暂停期间保持低电平或者高电平,那你就可以设置这两个模式
4:PWM2就是PWM1的取反。最常用的就是PWM1模式。

5、PWM 产生原理及输出比较的抽象出来主要模块

STM32:TIM定时器输出比较(OC)

 

首先左上角这里,是时基单元和运行控制的部分,再左边是时钟源选择,这里省略了,配置好时基单元,这里的CNT就可以开始不断地自增运行。

输出比较单元电路最开始,是CCR捕获/比较寄存器,CCR是我们自己设置的,CNT不断自增运行同时他俩还在不断的比较,后面就是输出模式控制器,以PWM1模式为例,在右上角的图中,在CNT还未计数到CCR时,置高电平,大于CCR时,置低电平,当计数到ARR然后归零时,又置高电平,往复循环,且占空比随CCR改变,如果CCR设置的高,那么输出的占空比就大,CCR设置的低一些,占空比就小一些,最后经过极性选择和输出使能就可以输出了。
 

6、参数计算

STM32:TIM定时器输出比较(OC)

 

注:PWM的频率等于计数器的更新频率

二、外部设备

1、舵机

STM32:TIM定时器输出比较(OC)

 

型号SG90

STM32:TIM定时器输出比较(OC)执行逻辑:PWM信号输入到控制板,给控制板一个指定的目标角度,然后,电位器检测输出轴的当前角度,如果大于目标角度,电机会反转,如果小于目标角度,电机会正转最终使输出轴固定在指定角度

 

2、直流电机

STM32:TIM定时器输出比较(OC)

 

STM32:TIM定时器输出比较(OC)

 

代码部分:

1、PWM驱动LED呼吸灯

初始化步骤

  1. RCC开启时钟,把我们要用的TIM外设和GPIO外设的时钟打开
  2. 配置时基单元,包括前面的时钟源选择
  3. 配置输出比较单元包括CCR的值、极性选择、输出使能
  4. 配置GPIO(复用推挽输出) 
  5. 运行控制

PWM.C

#include "stm32f10x.h"                  // Device header

void PWM_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
//	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//	GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);
//	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
	
	//对应输出比较的GPIO口配置
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;		//GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	TIM_InternalClockConfig(TIM2);  //用内部72MHZ时钟
	选择时基单元的时钟,选择内部时钟,可以不写,因为定时器上电后默认选择内部时钟
	
	//时基单元配置
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;		//ARR
	TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1;		//PSC
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;  //0:不重复计数,高级定时器用的
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
	
	//输出比较模块配置
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);  //用默认值填充每个TIM_OCInitStruct成员。因为只需要配置部分结构体参数
	给结构体赋初始值 里面定义默认给的初始值,防止高级定时器出错
	
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;   //PWM1模式
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //输出比较极性 high 高级性 极性不翻转 有效电平为高电平
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  //输出比较使能
	TIM_OCInitStructure.TIM_Pulse = 0;		//CCR  指定要加载到捕获比较寄存器的脉冲值
	TIM_OC1Init(TIM2, &TIM_OCInitStructure);//PA0口对应第一个输出比较通道OC1
	
	TIM_Cmd(TIM2, ENABLE);
}

void PWM_SetCompare1(uint16_t Compare)
{
	TIM_SetCompare1(TIM2, Compare);  //设置TIM2捕获Compare1寄存器值。CCR为0,通过setcompare可以设置CCR的值,单独更改通道1的CCR的值
}

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "PWM.h"

uint8_t i;

int main(void)
{
	OLED_Init();
	PWM_Init();
	
	while (1)
	{
		for (i = 0; i <= 100; i++)
		{
			PWM_SetCompare1(i);
			Delay_ms(10);
		}
		for (i = 0; i <= 100; i++)
		{
			PWM_SetCompare1(100 - i);
			Delay_ms(10);
		}
	}
}

其它函数介绍:

输出比较的函数介绍

这四个函数就是配置输出比较模块,一个函数配置一个单元

void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

用来给输出比较结构体赋一个默认的值的

void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct);

//——————————————————————————————————————————————★★★★★★★★★★———————————————————————————————到这里,输出比较的配置基本完成————————————————————————



单独修改CCR寄存器值的函数————————————————————————————————————★★★★★★★★★★——————————————————更改占空比所用到的四个函数—————————————————————————

void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3);

STM32:TIM定时器输出比较(OC)

 

十、重映射(重映像)

使用AFIO复用功能引脚重映射
重映射方式和引脚对应关系 ,选择重映射方式 查看参考手册

STM32:TIM定时器输出比较(OC)

 STM32:TIM定时器输出比较(OC)

 

GPIO_PartialRemap1_TIM2 //部分重映射1
GPIO_PartialRemap2_TIM2//部分重映射2
GPIO_FullRemap_TIM2//完全重映射

STM32:TIM定时器输出比较(OC)

 

解除调试端口参数:

  *     @arg GPIO_Remap_SWJ_NoJTRST      : Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRST//解除JTRST引脚的复用   PB4------>GPIO
  *     @arg GPIO_Remap_SWJ_JTAGDisable  : JTAG-DP Disabled and SW-DP Enabled//解除JTAG调试端口的复用 PA15、PB3、PB4
  *     @arg GPIO_Remap_SWJ_Disable      : Full SWJ Disabled (JTAG-DP + SW-DP)//把SWD和JTAG的调试端口全部解除掉

把SWD和JTAG的调试端口全部解除掉,5个引脚全部变成GPIO,没有调试功能了,之后st-link下载不进去程序了,只能使用串口下载,下载一个新的没有调试端口的程序,这样才能把调试端口弄回来,这个参数不能乱用

STM32:TIM定时器输出比较(OC)

 

到了这里,关于STM32:TIM定时器输出比较(OC)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【STM32学习】——定时器输出比较功能&PWM脉宽调制&通用/高级定时器输出比较通道&舵机/直流电机简介&PWM驱动呼吸灯/舵机/直流电机代码实操

    声明:学习笔记根据b站江科大自化协stm32入门教程编辑,仅供学习交流使用!

    2024年02月03日
    浏览(57)
  • STM32F4使用高级定时器(TIM1和TIM8)输出PWM问题

    STM32F4使用高级定时器(TIM1和TIM8)输出PWM时要使用TIM_CtrlPWMOutputs使能PWM输出,否则不会输出PWM波形,这一点是和通用定时器输出PWM不一样的地方,通用定时器是不用配置TIM_CtrlPWMOutputs函数的。、

    2024年02月15日
    浏览(43)
  • STM32——高级定时器输出比较模式实验

    1,配置定时器基础工作参数 HAL_TIM_OC_Init() 2,定时器PWM输出MSP初始化 HAL_TIM_OC_MspInit() 配置NVIC、CLOCK、GPIO等 3,配置PWM模式/比较值等 HAL_TIM_OC_ConfigChannel() 4,使能通道预装载 __HAL_TIM_ENABLE_OCxPRELOAD() 5,使能输出、主输出、计数器 HAL_TIM_OC_Start() 6,修改捕获/比较寄存器的值 _HAL

    2024年02月02日
    浏览(51)
  • 【江科大】STM32:(超级详细)定时器输出比较

    输出比较单元 名词解释 IC input capture 输入捕获 OC outpucompare 输出比较 CC capture compare 输入捕获和输出比较的单元 OC(Output Compare)输出比较 :用来输出PWM波形 特点 输出比较可以通过比较CNT(计数器)与CCR(捕获/比较)寄存器值的关系,来对输出电平进行置1、置0或翻转的操作

    2024年01月23日
    浏览(46)
  • STM32笔记——定时器输出比较功能(产生PWM波)

    目录 一、概述 二、PWM简单介绍  三、通用定时器输出比较 3.1 输出比较简介 3.2 输出比较通道 3.3 产生PWM的过程 四、实验硬件介绍及PWM模块程序 4.1 舵机简介 4.2 直流电机及驱动芯片TB6612  4.3 PWM模块驱动程序         主要介绍通用定时器输出比较功能,在GPIO口输出PWM来控

    2024年02月13日
    浏览(48)
  • STM32F105RBT6 使用定时器TIM3输出PWM波

    2.1 相关函数 RCC_APB1PeriphClockCmd、GPIO_Init、TIM_TimeBaseInit、TIM_OC4Init、TIM_OC4PreloadConfig、NVIC_Init、TIM_ITConfig、TIM_Cmd、 3.1 在启动文件里面找到TIM3 对应的中断入口函数,也就是中断服务函数 TIM3_IRQHandler 4.1 中断服务函数需要快速地执行完毕。中断服务函数应该避免执行太多的计算复

    2024年02月08日
    浏览(50)
  • HAL库STM32常用外设教程(五)—— 定时器 输出比较

    有关于定时器 输出PWM功能 不了解的可以看这篇文章 :HAL库STM32常用外设教程(一)—— 定时器 输出PWM 有关于定时器 定时功能 不了解的可以看这篇文章 :HAL库STM32常用外设教程(四)—— 定时器 基本定时 1、STM32F407ZGT6 2、STM32CubeMx软件 3、keil5 内容简述: 通篇文章将涉及以

    2024年03月27日
    浏览(63)
  • STM-32:TIM定时中断—定时器定时中断/定时器外部时钟

    定时器可以对输入的时钟进行计数,并在达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时 不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等

    2024年02月09日
    浏览(58)
  • TIM-定时器——STM32

    TIM(Timer)定时器 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时 不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器

    2024年02月02日
    浏览(64)
  • STM32—定时器(TIM)_基本定时

    本文主要通过介绍定时器基本结构去学习如何使用定时器进行定时。 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断,从而达到计时功能。 本文从通用定时器介绍。本文所使用芯片为 STM32F103C8T6,拥有TIM1-TIM4 四个定时器资源。 图.2为基本定时器结构  

    2024年02月02日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包