普中STM32-PZ6806L开发板(HAL库函数实现-TIM5 设置 PWM input, 获取频率跟占空比)

2024-01-03 12:44:41

简介

初始化 TIM5 为 PWM input CH1, 获取输入PWM的频率和占空比

电路原理图

连线

将 PC7 与 PA0使用跳线进行连接 

其他知识

APIs

/* Blocking mode: Polling */
HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel); // 堵塞捕获开启
HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); // 堵塞捕获停止
/* Non-Blocking mode: Interrupt */
HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); // 中断捕获开启
HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); // 中断捕获停止
/* Non-Blocking mode: DMA */
HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t 				Channel, uint32_t *pData, uint16_t Length); //DMA捕获开启
HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); // DMA捕获停止
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim); // 捕获时中断回调函数



实现步骤

创建项目

参考 普中STM32-PZ6806L开发板(HAL库函数实现-PWM呼吸灯), 使用同一个GPIO口PC7产生PWM,然后PA0引脚进行捕获

初始化TIM5 CH1

合并通道, 选项为PWM输入到CH1, 这里其实就是合并1和2通道使一个采集上升沿一个采集下降沿
在这里插入图片描述
主从模式开启, 先启动会等待另外一个同步启动
在这里插入图片描述

添加用户代码

main.c

float frequency = 0;
float dutyCycle = 0;
int capture_index = 0;
uint16_t ic_vals[2];
uint32_t difference = 0;

uint32_t ic_val = 0;

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	if ( htim->Instance == TIM5 )
	{
		if ( htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1 )
		{
			ic_vals[1] = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1) + 1; // 周期计数值
			++capture_index;
//			printf("channel1: %d\r\n", capture_index);
		}
		else if ( htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2) 
		{
			ic_vals[0] = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2) + 1; // 高电平计数值
			++capture_index;
//			printf("channel2: %d\r\n", capture_index);
		}
		
		if (2 > capture_index) // PWM数据采集完整才能计算频率
			return;
		
//		printf("vals: %d %d\r\n", ic_vals[0], ic_vals[1]);
		
		frequency = (72000000/72)/(ic_vals[1]); // (主频/预分频)/周期计数
		dutyCycle = ((float)ic_vals[0])/((float)ic_vals[1]) * 100.0; // (高电平计数值/周期计数值) * 100 
		
		capture_index = 0;
	}
}

int main(void)
{
	...
	printf("Very Welcome!\r\n");
	
	__HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_2, 300); // 改变占空比
	HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_2); // 启动PWM输出 

	HAL_TIM_IC_Start_IT(&htim5, TIM_CHANNEL_1);
	HAL_TIM_IC_Start_IT(&htim5, TIM_CHANNEL_2);
	
  while (1)
  {
		HAL_Delay(2000);
		printf ("frequency : %f, duty: %f\r\n", frequency, dutyCycle);
  }
}

共赏在这里插入图片描述

代码

不需要下载, 基本代码上面都提供了

参考

普中STM32-PZ6806L开发板(HAL库函数实现-批量操作GPIO引脚实现跑马灯)
普中STM32-PZ6806L开发板(HAL库函数实现-TIM5捕获上升沿, 获取输入频率)

文章来源:https://blog.csdn.net/halo_hsuh/article/details/135358347
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。