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

简介

初始化 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捕获上升沿, 获取输入频率)

最近更新

  1. TCP协议是安全的吗?

    2024-01-08 16:28:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-08 16:28:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-08 16:28:04       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-08 16:28:04       20 阅读

热门阅读

  1. 【多模态】ALBEF

    2024-01-08 16:28:04       43 阅读
  2. 讲解机器学习中的 K-均值聚类算法及其优缺点。

    2024-01-08 16:28:04       30 阅读
  3. MySQL 8.0中新增的功能(五)

    2024-01-08 16:28:04       30 阅读
  4. 再读Bob大叔三部曲之代码整洁之道

    2024-01-08 16:28:04       40 阅读
  5. Spring Boot 生产就绪中文文档-上

    2024-01-08 16:28:04       42 阅读
  6. Python实现大数据量对比

    2024-01-08 16:28:04       45 阅读