STM32F103VET6基于STM32CubeMX利用EXTI外部中断测量PWM频率

STM32F103VET6基于STM32CubeMX利用EXTI外部中断测量PWM频率


🌼本篇利用上面两篇示例综合,利用STM32F103VET6引脚PB1测量STM32G070RBT6引脚上的PA8引脚上产生的PWM频率。

📝STM32F103VET6重写EXTI回调函数代码

  • 🔨在原工程项目中新增了PB1作为EXTI中断输入口。
    在这里插入图片描述
  • 🔧中断优先级分组设置
    在这里插入图片描述
static uint16_t cnt = 0;
//重写回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
		
/*判断是中断引脚*/
			if(GPIO_Pin == GPIO_PIN_1)
		{
				cnt++;		    
		}
		if(GPIO_Pin == GPIO_PIN_7)
		{
				HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_5);//状态翻转
			 printf("PE7 KEYPRESS \n");
		}
		if(GPIO_Pin == GPIO_PIN_8)
		{
				HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);//状态翻转
		    printf("PE8 KEYPRESS \n");
		}
}
  • ✅新增TIM1定时器对EXTI中断接收的数据进行滤波处理。
  • 定时时间=(Prescaler +1)* (Counter Period +1)/ 频率
  • 这里定时时间是0.1s
    在这里插入图片描述

在这里插入图片描述

//TIM1中断回调函数
uint32_t pwm_sum =0;
uint32_t pwm_avg =0;
uint32_t pwm_final =0;
void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim)//回调函数
{
	if(htim->Instance == TIM1)//判断进入回调函数方式
	{
	  	pwm_sum += cnt*10  ;//累加
		pwm_sum -= pwm_avg;//减去上次的平均值
		pwm_avg = pwm_sum *1.0/5;//更新pwm平均值,5根据实际误差自行调整
		pwm_final = pwm_avg;//当前PWM的频率
		cnt =0;		
	}

}

这里需要说明的是以上代码涉及到滤波算法,不采用滤波算法代码如下:

void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim)//回调函数
{
	if(htim->Instance == TIM1)//判断进入回调函数方式
	{
		cnt ++;		
	}

}
  • 采用滤波算法,在主while循环在只放置打印函数
while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		HAL_Delay(1000);
	printf("PWM frequency= %u Hz \n",pwm_final);
		
  }
  • 不采用滤波算法,在主while循环放如下代码:
while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    cnt =0;
		HAL_Delay(1000);
	printf("PWM frequency= %u Hz \n",cnt);
		
  }

📗STM32G070RBT6PWM频率输出参数设置

  • 🛠通过调整TIM1初始化相关参数,进行PWM输出频率的调整
 htim1.Instance = TIM1;
  htim1.Init.Prescaler = 63;
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim1.Init.Period = 80 -1;//500 -> 2KHz, 1000 -> 1KHz,100 ->10KHz,80 ->12.5KHz
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim1.Init.RepetitionCounter = 0;

htim1.Init.Period = 50 -1;小于60时,需要调整main.c主循环while中的__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1,25);//设置PWM占空比

  • 🌿2KHz测量频率打印:
    在这里插入图片描述
  • 🍂1KHz的PWM频率测量
    在这里插入图片描述
  • 🎋10KHz的PWM测量
    在这里插入图片描述
  • 🌴12.5KHz的PWM测量数据
    在这里插入图片描述
  • 20KHz的PWM测量数据
    在这里插入图片描述
  • 通过逻辑分析仪采集到20KHz的PWM波形
    在这里插入图片描述

⛳工程源码

链接:https://pan.baidu.com/s/1Pq9X8zCguQM2dzNscgmUGw
提取码:qfbq

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值