• 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");
    		}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • ✅新增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;		
    	}
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

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

    void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim)//回调函数
    {
    	if(htim->Instance == TIM1)//判断进入回调函数方式
    	{
    		cnt ++;		
    	}
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 采用滤波算法,在主while循环在只放置打印函数
    while (1)
      {
        /* USER CODE END WHILE */
    
        /* USER CODE BEGIN 3 */
    		HAL_Delay(1000);
    	printf("PWM frequency= %u Hz \n",pwm_final);
    		
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 不采用滤波算法,在主while循环放如下代码:
    while (1)
      {
        /* USER CODE END WHILE */
    
        /* USER CODE BEGIN 3 */
        cnt =0;
    		HAL_Delay(1000);
    	printf("PWM frequency= %u Hz \n",cnt);
    		
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    📗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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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
    
    
    • 1
    • 2
    • 3
  • 相关阅读:
    Mysql 45讲学习笔记(二十九)判断数据库是否可用
    Unity 读取DICOM文件,并支持移动端
    spring boot + mysql8 集成jpa实现增删改(包括分页)
    基于nodejs的阿里云DDNS服务,支持多网卡绑定
    移动云获取推拉流地址
    Python学习路线图
    【设计模式】二、UML 类图与面向对象设计原则 之 UML概述
    vue开发前的入门准备
    springboot+vue农产品销售配送网站
    图片或视频充当网页背景+过渡动画
  • 原文地址:https://blog.csdn.net/weixin_42880082/article/details/127739906