PWM输入捕获PWM实验

PWM输入捕获PWM实验

所用芯片:STM32F407

库:HAL库

实验过程:

使用通用定时器2的输出通道1产生PWM波,使用高级定时器8的输入通道1来输入产生的PWM波,设置捕获通道1来测量周期,通道2来测量占空比,使用基本定时器6定时1s再通过串口1来输出测量值。

引脚设置:

高级定时器TIM8的通道1使用PC6
在这里插入图片描述
通用定时器TIM2的通道1使用PA15
在这里插入图片描述
基本定时器TIM6没有对应的外设引脚。

时钟设置:

TIM2和TIM6使用APB1 Timer clocks,时钟频率为84MHz
TIM8使用APB2 Timer clocks,时钟频率为168MHz
在这里插入图片描述

TIM2设置:

TIM2模式和配置
在这里插入图片描述
参数设置
在这里插入图片描述
中断设置
在这里插入图片描述
GPIO设置
在这里插入图片描述

TIM6设置:

TIM6模式和配置
在这里插入图片描述
参数设置
在这里插入图片描述
中断设置在这里插入图片描述

TIM8设置:

TIM8模式和配置
在这里插入图片描述

在这里插入图片描述
参数设置
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
GPIO设置
在这里插入图片描述
默认设置即可。

系统核心设置:

在这里插入图片描述
在NVIC中可设置中断优先级
在这里插入图片描述

在RCC中可设置系统时钟源以及系统的相关参数
在这里插入图片描述

编写代码

timer2.c

/*
   * @ name    Timer1_Start_IT
   * @ brief   定时器2以PWM模式启动
   * @ param   None
   * @ retval  None
*/
static void Timer2_Start_PWM(void)  //定时器2以中断模式启动	  
{
		HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1); //启动定时器2,通道1输出PWM
}

timer6.c

/*
   * @ name    Timer6_Start_IT
   * @ brief   定时器6以中断模式启动
   * @ param   None
   * @ retval  None
*/
static void Timer6_Start_IT(void)  //定时器6以中断模式启动	  
{
	HAL_TIM_Base_Start_IT(&htim6); //启动定时器6 
}

timer8.c

/*
   * @ name    Timer8_Start_Capture
   * @ brief   // 使能定时器8捕获/比较通道1/2的中断请求
   * @ param   None
   * @ retval  None
*/
static void Timer8_Start_Capture(void)  
{
	HAL_TIM_IC_Start_IT(&htim8,TIM_CHANNEL_1);
	HAL_TIM_IC_Start_IT(&htim8,TIM_CHANNEL_2);
}

定时器6的中断处理函数

/*
 * @ name     HAL_TIM_PeriodElapsedCallback
 * @ brief		定时器6中断回调函数
 * @ param		*htim -> 处理定时器的结构体指针
 * @ retval 	None
*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if(htim->Instance == htim6.Instance)
	{
		// 每间隔 1s 测量值
		if(++Timer6.usMCU_Run_Timer >= TIMER6_1s)
		{
			Timer6.usMCU_Run_Timer = 0;
			printf("IC1Value = %d  IC2Value = %d ", IC1Value, IC2Value);
			printf("占空比:%0.2f%%   频率:%0.2fHz\n", DutyCycle, Frequency);
		}
	}
}

定时器8的中断处理函数
在这里插入图片描述
在这里插入图片描述

/*
 * @ name     HAL_TIM_IC_CaptureCallback
 * @ brief		定时器8捕获回调函数
 * @ param		*htim -> 处理定时器的结构体指针
 * @ 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)
		{
			/* 占空比计算 百分数占空比是百分数,所以要乘以100. */
			/* 因为IC1Value和IC2Value都是从0开始计数的,所以都要加1 */
			DutyCycle = (float)((IC2Value+1) * 100) / (IC1Value+1);
			/* 频率计算 */
			Frequency = 168000000/168/(float)(IC1Value+1);
		}
		else
		{
			DutyCycle = 0;
			Frequency = 0;
		}
	}
}

对这三个定时器进行初始化

/*
 * @name   Peripheral_Set
 * @brief  外设初始化设置
 * @param	None
 * @retval None
 */ 		
static void Peripheral_Set(void)
{
  __HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE); /*使能串口接收中断 */ 
	
	Timer6.Timer6_Start_IT(); 			// 启动定时器6
	Timer2.Timer2_Start_PWM(); 			// 启动定时器2,通道1输出PWM
	Timer8.Timer8_Start_Capture();	// 使能定时器8捕获/比较通道1/2的中断请求

//	TestSRAMWork();
	
	printf("System Init Finish.\r\n");
}

结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuechanba

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值