STM32_HAL__TIM_输出比较

news2024/9/24 21:27:53

概述

STM32的输出比较功能通常是指在微控制器的PWM(脉冲宽度调制)生成能力中的一个方面。STM32微控制器拥有一个或多个定时器/计数器,这些定时器/计数器可以用来生成PWM信号。PWM信号是一种重要的控制信号,广泛应用于电机控制、亮度调节、功率控制等领域。

在STM32中,输出比较功能指的是定时器/计数器的比较寄存器(如TIMx_CCRx)与定时器的计数寄存器(如TIMx_CNT)的值进行比较的过程。当计数器的值达到比较寄存器的值时,PWM模块会根据输出比较模式改变输出引脚的电平状态。

STM32的输出比较模式通常有以下几种:

  1. 翻转(Toggle)模式:当计数器的值达到比较寄存器的值时,输出引脚的电平状态会翻转。

  2. 置位(Set)模式:当计数器的值达到比较寄存器的值时,输出引脚被设置为高电平。

  3. 复位(Reset)模式:当计数器的值达到比较寄存器的值时,输出引脚被设置为低电平。

  4. PWM模式1和PWM模式2:这两种模式用于生成标准的PWM信号。在PWM模式1下,当计数器值小于比较寄存器值时,输出为有效电平(通常是高电平),反之则为无效电平(低电平)。PWM模式2与PWM模式1相反,计数器值小于比较寄存器值时输出为无效电平。

 区别

 

区别

  • 输出波形:比较输出模式通常产生非周期性的脉冲或者控制信号,而PWM模式产生周期性的信号。
  • 用途:比较输出更多地用于事件定时和单脉冲生成,而PWM则用于模拟信号的数字控制。
  • 占空比控制:PWM模式允许通过改变CCR的值来精确控制输出信号的占空比,而比较输出模式通常不涉及占空比的控制。

 PWM指在一个周期中改变占空比,输出比较是在定时器到一个值时产生一个事件或电平反转

如在1kHz中PWM不是低电平就是高电平(在的是反转时间)

而输出比较则是值到了为低或高(看的是值)

STM32Cude的配置讲解

输出比较

  1. Mode(模式):

    • Frozen(冻结)

      • 在这种模式下,比较寄存器的值不会影响输出电平,输出保持不变。
      • 这对于需要固定电平输出而不受定时器计数影响的场景非常有用。(可以接收一个中断但不会引脚状态)
    • Active Level on match(匹配时激活电平)

      • 当定时器的计数器值与比较寄存器值匹配时,输出电平将被设置为激活电平(通常是高电平)。
      • 一旦匹配发生,输出将保持激活电平,直到定时器计数器重新开始计数。
    • Inactive Level on match(匹配时非激活电平)

      • 当定时器的计数器值与比较寄存器值匹配时,输出电平将被设置为非激活电平(通常是低电平)。
      • 类似于"Active Level on match",一旦匹配发生,输出将保持非激活电平,直到定时器计数器重新开始计数。
    • Toggle on match(匹配时翻转)

      • 每当定时器的计数器值与比较寄存器值匹配时,输出电平会在高电平和低电平之间翻转。
      • 这种模式适用于需要生成方波或脉冲信号的场景。
    • Forced Active(强制激活)

      • 在这种模式下,输出电平被强制设置为激活电平,不论定时器的计数器值和比较寄存器值是否匹配。
      • 这适用于需要输出始终保持激活电平的场景。
    • Forced Inactive(强制非激活)

      • 与" Forced Active"相反,输出电平被强制设置为非激活电平,不论定时器的计数器值和比较寄存器值是否匹配。
      • 这适用于需要输出始终保持非激活电平的场景。
  2. Pulse (16 bits value)(脉冲(16位值))

    • 这个选项设置定时器在PWM模式下的脉冲宽度,也就是占空比。
    • 它是一个16位的值,代表定时器计数器的一个计数周期内,输出为高电平的时间长度。
    • 例如,如果你的定时器时钟频率是1 MHz(即时钟周期为1微秒),并且你想要一个50%的占空比,那么你需要将Pulse值设置为定时器计数周期的一半。如果你的定时器是16位的,并且你设置的自动重装载值(TIMx_ARR)是65535(即计数器从0计数到65535),那么Pulse值应该是32768(65535的一半)。
  3. Output compare preload(输出比较预加载)

    • 这个选项决定是否在下一个定时器周期开始时预加载比较寄存器的值。(。当输出比较预加载功能被使能时,你在任何时候写入TIMx_CCRx的值都不会立即影响当前的PWM周期,而是会等到下一个PWM周期开始时才生效。这样,PWM波形的改变就会更加平滑,不会在中间突然跳变。)
    • 如果启用(Enable),则在当前周期结束前,比较寄存器的值会被更新,但不会影响当前周期。
    • 如果禁用(Disable),则比较寄存器的值立即生效。
  4. CH Polarity(通道极性)

    • 这个选项设置输出比较信号的极性。
    • "High"表示在比较匹配时,输出被置为高电平。
    • "Low"表示在比较匹配时,输出被置为低电平。

 HAL输出比较实验

实验效果

每次点亮的时间会增加

1定时器配置

将在程序中改变Pulse(16 bits values)的值

打开中断

代码设置

HAL有哪些函数

HAL_TIM_OC_Start() - 启动定时器的输出比较。
HAL_TIM_OC_Stop() - 停止定时器的输出比较。
HAL_TIM_OC_Start_IT() - 启动定时器的输出比较并使能中断。
HAL_TIM_OC_Stop_IT() - 停止定时器的输出比较并禁用中断。
HAL_TIM_OC_IRQHandler() - 定时器输出比较中断处理函数。
HAL_TIM_OC_GetState() - 获取定时器输出比较的状态。
__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_x, compareValue);改变其比较值
1为定时器2为通道3为比较的值(0-重装的值)

main源码

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2024 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "tim.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
uint32_t compareValue =0;
	void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim){
			if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2){//判断是否为通道2
					if(compareValue> htim->Instance->ARR){//比较直必须小于从装置
							compareValue=0;
					}
					compareValue=compareValue+100;//增加的值设置越大闪烁越慢     (其改的是一个周期内产生几个信号)
					__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,compareValue);//修改比较值
					
			}
	}
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */
//打开比较定时的中断
	HAL_TIM_OC_Start_IT(&htim2,TIM_CHANNEL_2);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

总结

输出比较是一个周期内产生几个信号(信号分成几份)

PWM为特殊的输出比较   是一个周期内低平和高平如何分配

区别

  • 功能目的:输出比较通常用于产生精确的定时事件,而PWM用于模拟信号的生成和控制。
  • 信号形式:输出比较产生离散的脉冲或电平变化,PWM产生连续的脉冲信号。
  • 调节能力:PWM可以通过改变占空比来调节输出功率或电压,而输出比较通常不具备这种调节能力。
  • 使用场景:输出比较适用于需要精确时间控制的场合,PWM适用于需要连续模拟量控制的场合。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1701332.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1分钟快速掌握JSON格式

文章目录 先说理论代码举例对象型数组型总结 先说理论 下面是JSON的几种简单数据类型: 数据类型描述数字型JavaScript中的双进度浮点类型,通常根据具体情况定义,这里是没有特殊的整形的。字符串型带双引号的Unicode,带反斜杠转义布尔型true…

探索python循环逻辑的魅力:从无限到有限

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言:循环逻辑的初步认识 二、无限循环:持续运转的引擎 三、有…

等保服务是一次性服务吗?为什么?怎么理解?

我国等保政策已经严格落地执行,但还有不少企业对于等保服务不是很了解。例如有人问,等保服务是一次性服务吗?为什么?怎么理解?今天我们就来简单回答一下,仅供参考哈! 等保服务是一次性服务吗&…

前端Vue自定义顶部搜索框:实现热门搜索与历史搜索功能

前端Vue自定义顶部搜索框:实现热门搜索与历史搜索功能 摘要: 随着前端开发复杂性的增加,组件化开发成为了提高效率和降低维护成本的有效手段。本文介绍了一个基于Vue的前端自定义顶部搜索框组件,该组件不仅具备基本的搜索功能&am…

PLC无线通讯模块在触摸屏与台达PLC之间的应用教程

本方案可以作为信捷触摸屏与台达PLC之间在台达专用协议下将有线通讯改为无线通讯的应用实例。此方案中信捷TG765触摸屏作为主站,台达DVP-32EH PLC作为从站,采用西安达泰电子日系PLC无线通讯终端——DTD435MA-V384,作为实现无线通讯的硬件设备…

十分钟精通MinIO:minio的原理、部署、操作

一、认识MinIO Minio是一个简单易用的云存储服务,就像是一个放在网络上的大文件柜。想象一下,你有一间放满了各种文件的房间,有时候你需要把这些文件分享给朋友或者在不同地方访问它们。Minio就是帮你做到这一点的工具,它让你可以…

力扣:236.二叉树的最近公共祖先(C++)

文章目录 1. 题目描述2. 题目解析2.1 思路一2.1 思路二 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 题目来源: 力扣…二叉树的最近公共祖先 1. 题目描述 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表…

JUC框架(Semaphore、CountDownLatch、CyclicBarrier)

文章目录 Semaphore(信号量)Semaphore介绍Semaphore基本概念Semaphore使用场景Semaphore示例 CountDownLatch (计数器/闭锁)CountDownLatch 介绍CountDownLatch 基本概念CountDownLatch 使用场景CountDownLatch 基本方法CountDownLatch 示例 CyclicBarri…

新能源锂电池行业创业的财富方案,锂电池回收高阶课

课程下载:https://download.csdn.net/download/m0_66047725/89292234 更多资源下载:关注我。 实战攻略 12年锂电池回收行业经验与坑全收录 课程内容: 001-课程介绍.mp4 002-锂电池的全种类认识.mp4 003-废品锂电池到级片粉末价值估算,mp…

Go微服务: Grpc服务注册在Consul的示例(非Go-Micro)

概述 现在,我们使用consul客户端的api来把GRPC服务实现注册到consul上,非Go-Micro的形式其实,consul官方提供了对应的接口调用来实现,golang中的consul/api包对其进行了封装我们使用consul/api来进行展示 目录结构 gitee.com/g…

纯CSS丝滑边框线条动画

在这个网站(minimal-portfolio-swart.vercel.app)发现一个不错的交互效果,用户体验效果很不错。如封面图所示,这个卡片上有一根白色的线条围绕着卡片移动,且在线条的卡片内部跟随这一块模糊阴影,特别是在线…

Execel 数据分析-如何使用筛选-图表-透视图-处理多变量数据集

如果你的数据有很多个变量,比如横轴X有a,b,c,d等几个变量,Y轴也有个变量,那么这时候就用得到。 比如下面的例子,测试GPU的kernel吞吐量,其中stream cnt,grid dim,block dim 产生后面几个变量&am…

如何给出好的“文言一心”指令?

一、文言一心是什么? 在现代技术背景下,“文言一心”还是百度公司创建的一款大语言模型。这款模型基于飞桨深度学习平台和文心知识增强大模型,并拥有强大的中文语料库,可以理解和生成富含文化内涵和哲理的文本内容。其核心技术架构…

第三方软件测试机构进行代码审计需要哪些专业的知识?

代码审计 进行代码审计需要专业的知识,包括编程语言、操作系统、数据库、网络知识以及安全知识等。 1.编程语言知识是进行代码审计的基础,因为你需要理解代码的语法和结构。对于不同的应用程序,你需要了解其所使用的编程语言的特点和语法规…

如何利用InputStream类实现文件读取与处理?

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一…

嵌入式UI开发-lvgl+wsl2+vscode系列:2、label(标签)+button(按钮)+slider(滑块)控件熟悉及其示例demo运行

文章目录 一、前言二、常见控件示例demo模拟环境运行及接口熟悉(重要)如何修改示例main函数测试各种示例1、label示例1.1、label示例1(标签基础示例)1.2、label示例2(标签带阴影效果)1.3、label示例3&#…

在微信公众号怎么添加留言板功能

在如今信息爆炸的时代,微信公众号已成为企业与用户互动的重要桥梁。如何在这个平台上脱颖而出,吸引用户的眼球,提升用户黏性,成为每一个公众号运营者都需要思考的问题。今天,我们就来聊聊如何在微信公众号中巧妙添加留…

新浪测试社招要个25K,第一次面大厂挂了

一面 1、讲下被测系统和你负责测试的模块功能? 2、为什么选择这个测试框架,这个测试框架有什么优缺点? 3、测试文件的目录,包含哪些包,这些之间是怎么调用的? 4、UI自动化和接口自动化都是怎么做的&…

【C语言】大小端字节序存储

引子 不知道你是否像我一样好奇过一个问题:为什么每当我们在调试查看内存窗口时,(以int类型为例)4个字节内容存储的顺序好像是倒着的。 比如下面这张图,十进制数2077转换为十六进制是0x81d,四个字节分别是…

Windows 11 HBuilder X的安装和环境搭建教程

文章目录 目录 文章目录 安装流程 小结 概要安装流程技术细节小结 概要 HBuilder X是一个由DCloud推出的集成开发环境(IDE),主要用于构建基于HTML、CSS和JavaScript的跨平台应用程序,如微信小程序、App、H5等。它提供了丰富的功能…