STM32F407xx系列HAL库配置定时器及PWM输出和输入捕获_小z不会累~的博客-程序员宝宝_hal pwm配置

技术标签: stm32  arm  单片机  

 

 

 HAL库配置基本定时器功能

 TIM7初始化代码CubeMX都帮我们配置好了,我们只需要修改主函数代码即可

main.c

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_TIM7_Init();
	HAL_TIM_Base_Start_IT(&htim7);
  while (1)
  {

  }
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_15);
}

PWM输入捕获

概念理解

输入捕获就是当连接到定时器的引脚上产生电平变化时对应的捕获装置会立即将当前计数值复制到另一个寄存器中。你可以开启捕获中断然后在中断处理函数中读出保存的计数值。

与输入捕获不同的是PWM输入模式会将同一个输入信号(TI1或TI2)连接到两个捕获装置(IC1和IC2)。这两个捕获装置一个捕获上升沿一个捕获下降沿。TI1FP1、TI2FP2它们中的一个被选择为触发输入且从模式控制器被配置为复位模式。

1、每个定时器有四个输入捕获通道IC1、IC2、IC3、IC4。且IC1 IC2一组,IC3 IC4一组。并且可是设置管脚和寄存器的对应关系。

2、同一个TIx输入映射了两个ICx信号。

3、这两个ICx信号分别在相反的极性边沿有效。

4、两个边沿信号中的一个被选为触发信号,并且从模式控制器被设置成复位模式。

5、当触发信号来临时,被设置成触发输入信号的捕获寄存器,捕获“一个PWM周期(即连续的两个上升沿或下降沿)”,它等于包含TIM时钟周期的个数(即捕获寄存器中捕获的为TIM的计数个数n)。

6、同样另一个捕获通道捕获触发信号和下一个相反极性的边沿信号的计数个数m,即(即高电平的周期或低电平的周期)

7、由此可以计算出PWM的时钟周期和占空比了

frequency=f(TIM时钟频率)/n。

duty cycle=(高电平计数个数/n),

若m为高电平计数个数,则duty cycle=m/n

若m为低电平计数个数,则duty cycle=(n-m)/n

PWM输出配置

 

 

 PWM输入捕获配置

 

 

 初始化配置代码CubeMX都帮我们配置好了,我们只需要修改TIM8的中断回调函数以及主函数

中断回调函数

/**
  * @brief  Conversion complete callback in non blocking mode 
  * @param  htim : hadc handle
  * @retval None
  */
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
  if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
  {
	  /* 获取输入捕获值 */
	  IC1Value = HAL_TIM_ReadCapturedValue(&htim8,TIM_CHANNEL_1);
	  IC2Value = HAL_TIM_ReadCapturedValue(&htim8,TIM_CHANNEL_2);	
	  if (IC1Value != 0)
	  {
		/* 占空比计算 */
		DutyCycle = (float)((IC2Value+1) * 100) / (IC1Value+1);

		/* 频率计算 */
		Frequency = 168000000/168/(float)(IC1Value+1);
		
	  }
	  else
	  {
		DutyCycle = 0;
		Frequency = 0;
	  }

  }
}

main.c

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_TIM4_Init();
  MX_TIM8_Init();
  MX_USART1_UART_Init();
	
	/* 定时器通道3输出PWM */
	HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);
	/* 使能捕获/比较2中断请求 */
	HAL_TIM_IC_Start_IT(&htim8,TIM_CHANNEL_1);
	HAL_TIM_IC_Start_IT(&htim8,TIM_CHANNEL_2);
  while (1)
  {
		HAL_Delay(500);
		printf("IC1Value = %d  IC2Value = %d ",IC1Value,IC2Value);
		printf("占空比:%0.2f%%   频率:%0.2fHz\n",DutyCycle,Frequency);	
  }

}

实验结果

TIM8输出四路PWM-------输出比较,后续电机控制中需要用到

 

 初始化配置代码CubeMX都帮我们配置好了,我们只需要修改TIM8的比较中断回调函数以及主函数

中断回调函数

/**
  * @brief  定时器比较中断
  * @param  htim:定时器句柄指针
	*	@note 	无
  * @retval 无
  */
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
{
  __IO uint16_t count;
  
  /*获取当前计数*/
  count = __HAL_TIM_GET_COUNTER(htim);
  
  /*判断触发中断的输出通道并设置新的比较数值*/
  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
  {
    __HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_1, count + 25);
  }
  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
  {
    __HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_2, count + 51);
  }
  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3)
  {
    __HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_3, count + 77);
  }
  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_4)
  {
    __HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_4, count + 103);
  }
}

main.c

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

  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();
  MX_TIM8_Init();
  MX_USART1_UART_Init();
	/* 启动比较输出并使能中断 */
	HAL_TIM_OC_Start_IT(&htim8, TIM_CHANNEL_1);
  /* 启动比较输出并使能中断 */
	HAL_TIM_OC_Start_IT(&htim8, TIM_CHANNEL_2);
  /* 启动比较输出并使能中断 */
	HAL_TIM_OC_Start_IT(&htim8, TIM_CHANNEL_3);
  /* 启动比较输出并使能中断 */
	HAL_TIM_OC_Start_IT(&htim8, TIM_CHANNEL_4);
	
	/* 使能比较通道1 */
	TIM_CCxChannelCmd(TIM8, TIM_CHANNEL_1, TIM_CCx_ENABLE);
  /* 使能比较通道2 */
	TIM_CCxChannelCmd(TIM8, TIM_CHANNEL_2, TIM_CCx_ENABLE);
  /* 使能比较通道3 */
	TIM_CCxChannelCmd(TIM8, TIM_CHANNEL_3, TIM_CCx_ENABLE);
  /* 使能比较通道4 */
	TIM_CCxChannelCmd(TIM8, TIM_CHANNEL_4, TIM_CCx_ENABLE);
  while (1)
  {

  }
}

实验结果可以用示波器进行测量

刚做完PWM输出实验,这里做一个记录,感谢大家的阅读!!!^_^

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_70748084/article/details/125065237

智能推荐

FPGA-时序约束_Vuko-wxh的博客-程序员宝宝

时钟约束:1、时钟2、input delays3、output delays4、时序例外一、时钟1.输入时钟 A.输入是CLK B.输入是差分 C.G或者恢复时钟2.PLL等衍生时钟3.自己分频的时钟二、input delays1.系统同步2.源同步(常用)数据和时钟一起从上游输送到FPGA A.SDR: a)看数据手册...

世界上有两类软件公司:一类像工厂,而另一类像电影摄制组_MikeLee的博客-程序员宝宝

世界上有两类软件公司:一类像工厂,而另一类像电影摄制组前一段时间,程序员问答网站Stackoverflow上有人提问:“我们都知道编程比做甘特图(项目进度管理图表)要更难,而且程序员加班也更多,那为什么 IT 公司里 PM 和 BA 的工资比程序员要高?” 英国的 Vlad Gudim 给出了一个很有意思的答复。这个问题的答案取决于你工作在一个什么样的软件公司和环境。

I3D【Inflated 3D ConvNet】——膨胀卷积网络用于行为识别_&永恒的星河&的博客-程序员宝宝_i3d网络

I3D:Quo Vadis,Action Recognition? A New Model and the Kinetics Dataset 论文地址:https://arxiv.org/pdf/1705.07750.pdf 最近读了一篇行为识别的论文I3D,全名《Quo Vadis,Action Recognition? A New Model ...

NodeJS 创建静态资源服务器_大嘴蝠的博客-程序员宝宝

最近,学习了一下 NodeJS 自己研究了一个静态资源服务器写的不好,希望高手多多指教目录结构文件详解.gitignore 文件这个文件主要是我们将本地项目上传到 GitHub 上时,忽略的文件,因为 GitHub 是我们项目代码的托管平台而不是运行平台,因此我们并不需要将运行所需要的一些包上传到 GitHub 上,例如:node_modules.gitignore 文件有一些规则,在...

计算机基础:一个字节有多少位?_T.S. Blank的博客-程序员宝宝

在前段时间看到一些计算机基础的问题,一时居然犹豫了,那怎么能行,必须加强一下基础知识!Question:一个字节是多少位?Answer:一个字节为8位。字节含义:字节是计算机信息技术用于计量存储容量的一种计量单位,也表示一些计算机编程语言中的数据类型和语言字符。数据存储是以“字节”(Byte)为单位,数据传输是以大多是以“位”(bit,又名“比特”)为单位,一个位就代表一个0或1(即二进制),每8个位(bit,简写为b)组成一个字节(Byte,简写为B),是最小一级的信息单位。位(即比特)含义:

2016Android公司面试题_tiankongchengS的博客-程序员宝宝

2016年4月某公司面试题及面试流程。静态内部类、内部类、匿名内部类,为什么内部类会持有外部类的引用?持有的引用是this?还是其它?静态内部类:使用static修饰的内部类内部类:就是在某个类的内部又定义了一个类,内部类所嵌入的类称为外部类匿名内部类:使用new生成的内部类因为内部类的产生依赖于外部类,持有的引用是类名.thisArrayList和Vector的主要区别是什么?Array

随便推点

单片机的程序架构——时间片轮询【学习笔记】_YU___________的博客-程序员宝宝_单片机时间片轮的设计思想

单片机的程序架构1.顺序执行2.时间片轮寻:==2.0 一个定时器的复用:====2.1 时间片轮询架构:====2.2 具体实现:==2.2.1定义 任务结构体2.2.2初始化 任务结构体2.2.3定义 任务清单&任务数目 枚举类型2.2.4编写 定时器中断函数&任务处理函数2.2.5编写main函数2.2.6编写你的任务函数==2.3 注意点&C语言补坑:==3.操作系统:1.顺序执行/*****************************************

Windows下Qt4.7.4安装的大致过程_两个毫米的博客-程序员宝宝

1、获取Qt开源版源代码压缩包、MinGW编译器并安装Qt:         1)先从地址http://en.sourceforge.jp/projects/sfnet_nasame2013/downloads/sources/MinGW-gcc440_1.zip/处下载MinGW-gcc440_1.zip压缩包,可以解压到C盘(即C:\mingw);         2)从官网地址htt

VMware虚拟机三种网络模式详解(1)_路痴的旅行的博客-程序员宝宝

由于Linux目前很热门,越来越多的人在学习Linux,但是买一台服务放家里来学习,实在是很浪费。那么如何解决这个问题?虚拟机软件是很好的选择,常用的虚拟机软件有VMware Workstations和VirtualBox等。在使用虚拟机软件的时候,很多初学者都会遇到很多问题,而VMware的网络连接问题是大家遇到最多问题之一。在学习交流群里面,几乎每天都会有同学问到这些问题,写这篇详解也是因为群...

Elasticsearch-document的_source元数据以及定制返回结果解析(学习笔记)_Micheal_yang0319的博客-程序员宝宝

1、_source元数据PUT /test_index/test_type/1{ "test_field1": "test field1", "test_field2": "test field2"}GET /test_index/test_type/1{ "_index": "test_index", "_type": "test_type", "_id":...

C++资源之不完全导引 [下]_firectrl的博客-程序员宝宝

 C++资源之不完全导引 [下] 撰文/ 曾毅陶文最后更新:2004年6月12日 声明: .本文2004年5月首发于《CSDN开发高手》,版权归该杂志与《程序员》杂志社所有。杂志限于篇幅部分内容有所删节,此处版本为相对完整版本。 .本文为介绍

从零入门R语言-软件下载,环境搭建,数据导入导出_RookieTrevor的博客-程序员宝宝

1. 为什么是R?现在数据科学,深度学习领域最受欢迎的是Python, 那么为什么要学习R语言,Python 和 R 的优势分别在哪儿?简单来说,R语言更适用与研究,偏数理统计,小而精,适合将来做科研学术。Python更适用于工业领域,普适性,通用性,计算性能更好,更适合做程序员或者进入企业。具体可以参考张敬新老师翻译的R用于研究,Python用于生产, 英文原文地址为R is for Reasearch, Python is for Production。所以首先需要确定自己的需求,R不一定适合每