【江科大】STM32:(超级详细)定时器输出比较

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

输出比较单元

  • 名词解释
    IC input capture 输入捕获
    OC outpucompare 输出比较
    CC capture compare 输入捕获和输出比较的单元
    OC(Output Compare)输出比较 :用来输出PWM波形

特点

  • 输出比较可以通过比较CNT(计数器)与CCR(捕获/比较)寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形。

  • 每个高级定时器和通用定时器都拥有4个输出比较通道

  • 高级定时器的前3个通道额外拥有死区生成和互补输出的功能(用于驱动三相无刷电机)
    通用定时器:均有4个通道

【江科大】STM32:(超级详细)定时器输出比较,STM32学习,stm32,嵌入式硬件,单片机

高级定时器:均有4个通道

【江科大】STM32:(超级详细)定时器输出比较,STM32学习,stm32,嵌入式硬件,单片机

PWM简介

PWM(Pulse Width Modulation)脉冲宽度调制

  • 必须是在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速等领域
    PWM参数:
    频率 = 1 / TS
    占空比 = TON / TS
    分辨率 = 占空比变化步距
    (PWM的频率在几千到几十KHZ就已经很快了)(分辨率 表示占空比的精细程度)
  1. TON:高电平的时间
  2. TS:一个周期的时间
    (频率 = 1 / TS 可以看出周期越大,那么频率就越小,就越平稳。
    占空比 = TON / TS)
    TON/TS:高电平相对整个周期的比例
    如果TON = 20% 那么低电平就是80%,占空比越大,等效的模拟电压就越接近于高电平。

(PWM调光,通过高频点亮熄灭,点亮熄灭来实现对灯光强弱的控制,只要闪的够快就发现不了是正常的还是没有的)

原因:LED熄灭时,由于人眼的余辉和视觉暂留现象,LED不会立刻熄灭,过一小段才会熄灭,电机也是因为惯性过一会才会停下来
【江科大】STM32:(超级详细)定时器输出比较,STM32学习,stm32,嵌入式硬件,单片机
【江科大】STM32:(超级详细)定时器输出比较,STM32学习,stm32,嵌入式硬件,单片机

输出比较通道

极性选择:就是选择要不要把高低电平反转一下
【江科大】STM32:(超级详细)定时器输出比较,STM32学习,stm32,嵌入式硬件,单片机
【江科大】STM32:(超级详细)定时器输出比较,STM32学习,stm32,嵌入式硬件,单片机

PWM基本结构

【江科大】STM32:(超级详细)定时器输出比较,STM32学习,stm32,嵌入式硬件,单片机
占空比和CCR值有关
【江科大】STM32:(超级详细)定时器输出比较,STM32学习,stm32,嵌入式硬件,单片机

基本定时器

【江科大】STM32:(超级详细)定时器输出比较,STM32学习,stm32,嵌入式硬件,单片机

参数计算

【江科大】STM32:(超级详细)定时器输出比较,STM32学习,stm32,嵌入式硬件,单片机

  1. PWM输出的通道口时CH1
    【江科大】STM32:(超级详细)定时器输出比较,STM32学习,stm32,嵌入式硬件,单片机
  2. 根据引脚定义表,得出GPIO口时PA0 【江科大】STM32:(超级详细)定时器输出比较,STM32学习,stm32,嵌入式硬件,单片机
  3. 输出模式选用复用推挽输出,原因是采用定时器来进行输出控制
  4. CCR的值
    根据PWM频率
    Freq = CK_PSC / (PSC + 1) / (ARR + 1) :
    72MHZ/(PSC+1)/(ARR+1) = 1000
    PSC+1 =72000000/1000000=720HZ
    PWM占空比:
    Duty = CCR / (ARR + 1) CCR/(ARR+1) = 50% --》 CCR = 50
    PWM分辨率:
    Reso = 1 / (ARR + 1) 1/(ARR+1) = 1% --》ARR+1 = 100
    分辨率是自己给的

捕获/比较通道的输出部分

【江科大】STM32:(超级详细)定时器输出比较,STM32学习,stm32,嵌入式硬件,单片机
对于普通的推挽输出:引脚的控制权来自于输出数据寄存器,来进行输出控制
【江科大】STM32:(超级详细)定时器输出比较,STM32学习,stm32,嵌入式硬件,单片机
而想要定时器来控制引脚就需要使用复用开漏推挽输出。(定时器属于片上外设)
【江科大】STM32:(超级详细)定时器输出比较,STM32学习,stm32,嵌入式硬件,单片机

  • 重复次数计数器:
    实现每隔几个周期再更新一次。之前是,每个周期都更新,对更新信号再分频
  • DTG:死区生成电路,防止电流直通
  • RK刹车输入功能:给电机驱动提供安全保证。如内部时钟失效,控制电路会自动切断电路
  • AFIO:端口重映射
    【江科大】STM32:(超级详细)定时器输出比较,STM32学习,stm32,嵌入式硬件,单片机
    【江科大】STM32:(超级详细)定时器输出比较,STM32学习,stm32,嵌入式硬件,单片机
    【江科大】STM32:(超级详细)定时器输出比较,STM32学习,stm32,嵌入式硬件,单片机

如果要重定义某个端口:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//给AFIO使能
GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,ENABLE);  //重映射 把CH1的PA0换到PA15
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable ,ENABLE);//关闭PA15的调试端口的功能

【江科大】STM32:(超级详细)定时器输出比较,STM32学习,stm32,嵌入式硬件,单片机
【江科大】STM32:(超级详细)定时器输出比较,STM32学习,stm32,嵌入式硬件,单片机

【江科大】STM32:(超级详细)定时器输出比较,STM32学习,stm32,嵌入式硬件,单片机

详细介绍如下:

  1. RCC 把GPIO,TIM外设的时钟打开
  2. 配置时基单元
  3. 配置输出比较单元,时钟源选择
  4. 配置输出比较单元,CCR的值,输出比较模式,极性选择,输出使能
  5. 配置GPIO ,配置为复用推免
  6. 运行控制,启动计数器
 	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//给TIM2使能
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//给GPIO使能
	
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode =  GPIO_Mode_AF_PP;  //由于定时器属于片上外设,所以采用复用推挽输出,
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;   //根据引脚表的出CH_1所在引脚时PA0
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	TIM_InternalClockConfig(TIM2); //选择内部时钟   给时基单元提供时钟
	
	//时基单元
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;  //每一个时钟后面都会加一个滤波器,
	                                                          //作用就是为是信号更加稳定,使用的采样的方式,
	                                                          //在输入的脉冲中采样,按照n/f,因此采样系数越大,延迟越大
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; //计数方式,递增
	
	TIM_TimeBaseInitStruct.TIM_Period = 100-1;  //ARR =100 
	TIM_TimeBaseInitStruct.TIM_Prescaler = 720-1;  // psc = 720
	                                               //预分频器,72MHZ进行7200分频 ,
	                                               //72000/7200 = 10KHZ    1ms = 1KHZ  
	                                               //10KHZ下记10000个数   10000/10000HZ = 1S
	                                                                   //  f = 1/t 
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;  //重复计数器(高级定时器才有)
  TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
    
  //配置比较输出模块
	TIM_OCInitTypeDef TIM_OCInitStruct;
	TIM_OCStructInit(&TIM_OCInitStruct);//给结构体赋初始值
	TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;//输出比较模式
                                                  //TIM_OCInitStruct.TIM_OCNIdleState = ;  //带N的都是高级定时器才用的
                                                  //TIM_OCInitStruct.TIM_OCNPolarity = ;
	TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;  //输出比较极性
                                                  //TIM_OCInitStruct.TIM_OutputNState = ;
	TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; //使能输出状态
	TIM_OCInitStruct.TIM_Pulse = 50;//CCR的值
	
	TIM_OC1Init(TIM2,&TIM_OCInitStruct);  
	
	//运行控制,所有的模块配置完毕,启动时基单元
	TIM_Cmd(TIM2,ENABLE);
  //如果要使用高级定时器,就需要把TIM2改为TIM1,那么结构原来用不到的成员。就需要用到,这些成员又没有赋值,
	//这个时候就会出现奇怪的问题,如果把初始化函数放在的程序第一行没有问题,初始化函数前面出现了其他的代码,那么4路PWM就会有3路不能输出。这竟然和初始化函数在那一行有关。
	//原因是,没有给结构体配置完整,也没有给结构体赋初始值。所以要用到structInit()函数,给结构体赋初始值。

舵机介绍

舵机是一种根据输入PWM信号占空比来控制输出角度的装置
输入PWM(可当作一种输出协议)信号要求:周期为20ms,高电平宽度为0.5ms~2.5ms
【江科大】STM32:(超级详细)定时器输出比较,STM32学习,stm32,嵌入式硬件,单片机
【江科大】STM32:(超级详细)定时器输出比较,STM32学习,stm32,嵌入式硬件,单片机

  • PWM输入到控制板,给控制板一个指定的目标角度,然后这个电位器检测当前的输出角度,如果大于目标角度,电机就会反转

硬件电路

【江科大】STM32:(超级详细)定时器输出比较,STM32学习,stm32,嵌入式硬件,单片机

void Servo_Init(void)
{
	PWM_Init();
}

void Servo_SetAngle(float Angle)
{
	//0  500   
	//180  2500       度数     
	PWM_SetCompare2(Angle / 180 * 2000 + 500);
}

PWM驱动舵机
【江科大】STM32:(超级详细)定时器输出比较,STM32学习,stm32,嵌入式硬件,单片机
【江科大】STM32:(超级详细)定时器输出比较,STM32学习,stm32,嵌入式硬件,单片机

直流电机介绍:

【江科大】STM32:(超级详细)定时器输出比较,STM32学习,stm32,嵌入式硬件,单片机

【江科大】STM32:(超级详细)定时器输出比较,STM32学习,stm32,嵌入式硬件,单片机

直流电机驱动代码

1.RCC使能GPIO
2.选择时钟,给定时器单元使能
3.配置时基单元(也就是计数模块)
4.配置输出比较模块
5.启动时基单元
6.逻辑函数

选用的是通用定时器TIM2,
由于直流电机上的PWMA连接的是PA2口,根据引脚定义表。PA2对应的时钟通道是TIM2_CH3.
所以在选择输出比较通道时,选择初始化3通道。TIM_OC3Init(TIM2,&TIM_OCInitStruct);

void Motor_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); 
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出模式,高低电平均可以亮
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5; 	  //方向控制角
	GPIO_InitStruct.GPIO_Speed =  GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct); 
	
	
	PWM_Init();
}

void Motor_SetSpeed(uint8_t speed)
{
	if(speed >= 0)
	{
		GPIO_SetBits(GPIOA,GPIO_Pin_4);  //给端口4给高 5给低 正转
		GPIO_ResetBits(GPIOA,GPIO_Pin_5);
		PWM_SetCompare3(speed);      //给PWM设置CCR的值 捕获比较值,根据不同CCR的值,得到PWM波也不同,输出的速度自然不同
	}    
	else
	{
		GPIO_ResetBits(GPIOA,GPIO_Pin_4);   //给端口4给低 5给高 反转
	    GPIO_SetBits(GPIOA,GPIO_Pin_5);
		PWM_SetCompare3(-speed);
	}
}

【江科大】STM32:(超级详细)定时器输出比较,STM32学习,stm32,嵌入式硬件,单片机

【江科大】STM32:(超级详细)定时器输出比较,STM32学习,stm32,嵌入式硬件,单片机

输出比较(库函数)

//配置输出比较单元
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);


//配置强制输出模式
//如果暂停输出波形并且强制输出高/低电平,强制设置高电平,和设置100%占空比是一样的
void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);

【江科大】STM32:(超级详细)定时器输出比较,STM32学习,stm32,嵌入式硬件,单片机文章来源地址https://www.toymoban.com/news/detail-818294.html

//用来单独设置输出比较的极性,带N的就是高级定时器,互补通道的配置,OC4没有互补通道,所以没有OC4N的函数。
void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
//用来单独修改输出使能函数
void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx);
void TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN);
//单独修改选择输出比较模式
void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode);
//用来单独修改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);
void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);
//这个函数仅再高级定时器使用!!!!!!,在使用高级定时器输出PWM时,需要调用这个函数使能主输出,否则PWM将不再正常输出
void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState); 

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

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

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

相关文章

  • STM32定时器输出PWM脉冲

    一、什么是PWM脉冲? PWM (Pulse Width Modulation) 脉冲宽度调制,通常应用于惯性系统中,( 不是不能即停的设备,因为如果设备不具有关心,那么运动是断断续续的,不具有连续性 ),通过脉宽调节输出不同的波形作用域受控对象。 二、 PWM中三个重要的参数 1.频率=1/Ts ;这个很

    2024年02月15日
    浏览(54)
  • STM32TIM定时器PWM输出比较(适用于通用,高级定时器)

    在定时器中我们最常用的功能就是输出PWM,大多是用在电机控制方面,目前网络上相关资料也有很多,但是,很多不利于我们“现搜现用”我这里不是说我写的有多好,而是你搜索到此类文章时大部分是急于解决目前的问题,一段相关代码和讲解就行,当然不是学习背后的原

    2024年01月25日
    浏览(58)
  • 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日
    浏览(52)
  • STM32:TIM定时器输出比较(OC)

    一、输出比较简介 1、输出比较 OC(Output Comapre)输出比较 输出比较可以通过比较CNT(时基单元)和CCR(捕获单元)寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率的占空比的PWM波形(CC是捕获/比较的意思,R是Register,寄存器的意思),这个捕获

    2024年02月05日
    浏览(57)
  • STM32F1定时器-PWM输出

    STM32 PWM工作过程 ARR寄存器决定PWM周期,CCR寄存器决定占空比 通道1为例 的PWM输出电路图 CCR1:捕获比较(值)寄存器(x =1,2,3,4):设置比较值。 CCMR1:OC1M[2:0]位:对于PWM方式下,用于设置PWM模式1【110】 或者PWM模式2【111】 CCER:CC1P位:输入/捕获1输出极性。0:高电平有效,1:低电平

    2024年02月09日
    浏览(81)
  • stm32定时器方式精确输出指定脉冲个数

    本例使用芯片为 STM32f407zg 使用标准库编程 输出指定脉冲个数的PWM方法主要有两种:计数器中断方式和定时器同步方式。 项目输出可控双脉冲pwm波形,可根据需要控制输出脉冲个数,查阅网上资料大部分为HAL库配置,自己实际第一次编程有些一头雾水,后查阅官方帮助手册和

    2024年02月16日
    浏览(53)
  • STM32(7)-定时器输出PWM的原理分析

    概念+代码 OC(Output Compare)输出比较 输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形 每个高级定时器和通用定时器都拥有4个输出比较通道 高级定时器的前3个通道额外拥有死区生成和互补输出的功

    2024年02月04日
    浏览(57)
  • STM32使用CubeMx配置定时器输出PWM

            项目中经常使用到STM32来输出PWM,每次配置过后过不了多久就会忘记,稍微需要对配置做出修改时都要翻很久的手册,所以决定结合实例把PWM配置的详细步骤记录下来,这样在下次配置时可以很快的捡起来。         本文档的行文结构如下,首先,说明实际需

    2024年02月03日
    浏览(70)
  • STM32使用高级定时器输出互补pwm波

    最近做的一个项目用到stm32,网上查了很多资料,也踩了很多坑,这里记录一下配置的步骤和说明 硬件使用的是stm32h750vbt6; 软件用到了stm32cubemx和keil5; 打开Debug模式方便调试,可以忽略,不影响代码运行 在用cube配置时钟源时,有下面三个选项 Disable(禁用) BYPASS Clock Sou

    2024年02月16日
    浏览(74)
  • STM32高级定时器输出指定数量PWM(STM32CubeMx配置)

    高级定时器中有一个重复计数器,本实验输出指定个数PWM就是利用了重复计数器的特性,先来看看重复计数器的特性是什么: 计数器每次上溢或下溢都能使重复计数器减1,减到0时,再发生一次溢出就会产生更新事件 这是什么意思呢,这里举个例子比如说我设定重复计数器的

    2024年02月02日
    浏览(88)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包