零基础STM32单片机编程入门(八)定时器PWM输入实战含源码视频

一.概要

脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用单片机数字输出(1或0)来对外部模拟电路进行控制的一种非常有效的技术。
在这里插入图片描述
在闭环控制系统中,通过实时监测PWM信号的频率变化,可以及时做出反馈调整,保证系统稳定工作。 对于外部输入的PWM信号,需要获取其精确的频率值来匹配内部PWM模块,实现精准同步或者解码其他信息。当PWM信号出现异常(如频率超出预设范围),可以通过输入捕获快速检测并采取相应的保护措施,所以研究PWM输入也有意义。

二.PWM输入框架图

定时器部分框图如下,其中PWM相关的主要是基本定时器和PWM输入控制部分。

PWM输入检测部分信号流向

在这里插入图片描述

该模式是输入捕获模式的一个特例,除下列区别外,操作与输入捕获模式相同:
● 两个ICx信号被映射至同一个TIx输入。
● 这2个ICx信号为边沿有效,但是极性相反。
● 其中一个TIxFP信号被作为触发输入信号,而从模式控制器被配置成复位模式。

在这里插入图片描述

如下图所示:
TI1为输入PWM波信号波形,TIMx_CNT为计数器计数值,当第一个下降沿信号到来,IC2会先进行捕获,然后到下一个上升沿到来,IC1进行捕获!在捕获的同时,IC1和IC2会把CNT的值映射到对应的CCR1、CCR2的寄存器里面,这个值就是我们需要的计数值!

那么我们所需测量的周期就是IC1捕获的值,脉冲宽度即为IC2测量的值。

在这里插入图片描述

三.CubeMX配置一个PWM输入例程

1.硬件准备

STLINK接STM32F103C8T6小系统板,STLINK接电脑USB口。

在这里插入图片描述

2.创建工程

打开STM32CubeMX软件,新建工程
在这里插入图片描述
Part Number处输入STM32F103C8,再双击就创建新的工程
在这里插入图片描述
配置下载口引脚
在这里插入图片描述
配置外部晶振引脚
在这里插入图片描述
配置系统主频
在这里插入图片描述
配置TIM1,1ms定时器,TIM1内部时钟是72MHZ,72分频就是1MHZ,计数1000次归零,计数时间就是1ms,脉冲宽度是500us,根据上述配置,PWM波频率就是1KHZ,占空比就是50%。
在这里插入图片描述

配置定时器3通道2为PWM输入引脚,TI2FP2触发,CH2采样上升沿,CH1采样下降沿

在这里插入图片描述
定时器3中断使能
在这里插入图片描述

配置工程文件名,保存路径,KEIL5工程输出方式
在这里插入图片描述
生成工程
在这里插入图片描述
用Keil5打开工程
在这里插入图片描述

增加代码
在这里插入图片描述

在这里插入图片描述
主要代码

/* Duty Cycle Value */
__IO uint32_t            TempDutyCycle = 0,DutyCycle;//占空比
/* Frequency Value */
__IO uint32_t            TempFrequency = 0,Frequency;//频率
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
  /* Prevent unused argument(s) compilation warning */
 if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
  {
    /* Get the Input Capture value */
    TempDutyCycle = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);//捕捉占空比

  }
	 if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
  {
    /* Get the Input Capture value */
    TempFrequency = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);//捕捉周期

  }
  /* NOTE : This function should not be modified, when the callback is needed,
            the HAL_TIM_IC_CaptureCallback could be implemented in the user file
   */
}

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_TIM1_Init();
  MX_TIM3_Init();
  /* USER CODE BEGIN 2 */
	if (HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1) != HAL_OK)//启动定时器通道1,PWM输出
  {
    /* PWM generation Error */
    while(1);
  }
	if (HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_2) != HAL_OK)//使能TIM3通道2捕捉
  {
    /* Starting Error */
    while(1);  
	}
  if (HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1) != HAL_OK)//使能TIM3通道1捕捉
  {
    /* Starting Error */
    while(1);
  }
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
		HAL_Delay(1000);//等待1秒
		if(TempFrequency!=0)
		{
		Frequency=1000000/TempFrequency;
		DutyCycle=TempDutyCycle*100/TempFrequency;
			
		}

    /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */
}

3.调试

用杜邦线把板子的PA7和PA8连接起来,这样PA8引脚输出的PWM波,就能被PA7采集到。
进入调试模式,把Frequency跟DutyCycle放入到Watch窗口,就能看到PWM输入的信号的周期跟占空比
在这里插入图片描述

四.CubeMX工程源代码下载

链接:https://pan.baidu.com/s/1gq_kl9D9f6LEp5Ng4jZG4Q
提取码:ryf8
如果链接失效,可以联系博主给最新链接

程序下载下来之后解压就行

五.讲解视频链接地址

PWM输入讲解视频

六.小结

PWM输入虽然没有PWM输出使用那么广泛,但通过PWM信号进行两个设备之间握手已经很普遍的使用,比如新能源充电枪之间握手等应用。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 18:58:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 18:58:03       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 18:58:03       58 阅读
  4. Python语言-面向对象

    2024-07-12 18:58:03       69 阅读

热门阅读

  1. tomcat

    2024-07-12 18:58:03       15 阅读
  2. 【jxls 单元格合并】

    2024-07-12 18:58:03       16 阅读
  3. 基于Hadoop的区块链海量数据存储的设计与实现

    2024-07-12 18:58:03       21 阅读
  4. 1 HTML and CSS

    2024-07-12 18:58:03       19 阅读
  5. 通用脚本大全

    2024-07-12 18:58:03       19 阅读
  6. c#猜数字小游戏

    2024-07-12 18:58:03       22 阅读
  7. TCP/IP模型和OSI模型的区别

    2024-07-12 18:58:03       18 阅读
  8. 补充一下MySQL的索引用法及应用场景

    2024-07-12 18:58:03       20 阅读
  9. LeetCode //C - 213. House Robber II

    2024-07-12 18:58:03       22 阅读
  10. 云WAF如何帮助政府网络进行安全防御

    2024-07-12 18:58:03       21 阅读
  11. 一个简单的基于Qt的MVC框架

    2024-07-12 18:58:03       21 阅读