零基础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打开工程

增加代码

主要代码

c 复制代码
/* 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信号进行两个设备之间握手已经很普遍的使用,比如新能源充电枪之间握手等应用。

相关推荐
芋头莎莎16 分钟前
STM32 51单片机设计半导体制冷片温控设计
stm32·嵌入式硬件·51单片机
ღ 金龍戲水 ღ2 小时前
蓝桥杯竞赛单片机组备赛【经验帖】
经验分享·单片机·蓝桥杯
搬砖的小码农_Sky2 小时前
单片机和FPGA有什么区别?
单片机·嵌入式硬件·fpga开发
折途4 小时前
拆解一下用了两年的三十多块的剃须刀
嵌入式硬件
电子科技圈4 小时前
Works With线上开发者大会将提供物联网行业深入的专业知识和技能
科技·mcu·物联网·iot
BT-BOX5 小时前
STM32仿真proteus位带操作和keil增加头文件C文件
c语言·stm32·proteus
7yewh6 小时前
嵌入式硬件实战提升篇(一)-泰山派RK3566制作多功能小手机
linux·arm开发·驱动开发·嵌入式硬件·物联网·智能手机·硬件架构
@晓凡7 小时前
STM32编程遇到的问题随笔【一】
stm32·单片机·嵌入式硬件
虾球xz8 小时前
游戏引擎学习第11天
stm32·学习·游戏引擎
DevinLGT9 小时前
6Pin Type-C Pin脚定义:【图文讲解】
人工智能·单片机·嵌入式硬件