你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32CUBEMX开发GD32F303----定时器TIM捕获PWM测量频率与占空比

[复制链接]
STMCU小助手 发布时间:2022-9-4 16:24
生成例程
这里准备了自己绘制的开发板进行验证。

5c8d9e195fc3443ea31ec04d71494f6d.png

查看原理图,PA9和PA10设置为开发板的串口。

338e0c9674804c4284c02d8088fa2181.png

配置串口

203b38412b8b483c972ebbf38267a692.png

查看原理图,PB0设置为PWM输出管脚,PB10设置为定时器输入捕获管脚。

135560a44b1447c69a726d81886da77a.png

配置时钟树

配置时钟为64M。

b2e134ac7ecd41e38c831cffc2866f64.png

配置PWM
配置定时器1输出pwm的频率为1K。

7efb907021554b3fb39490af318996f2.png
9966a87b34254fb9b517c3ff7ba8ba23.png

配置输入捕获

c39e2934b8674901ba15a7da1c084fb0.png

开启中断

46c1fa01fa564dc68ee2bd57ca50c37a.png

keil配置

microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。 某些库函数的运行速度也比较慢,如果要使用printf(),必须开启。

4791387d2b3f4840804573b0096a52e7.png

代码
在main.c中,添加头文件,若不添加会出现 identifier “FILE” is undefined报错。

  1. /* USER CODE BEGIN Includes */
  2. #include "stdio.h"
  3. /* USER CODE END Includes */
复制代码

函数声明和串口重定向:

  1. /* USER CODE BEGIN PFP */
  2. int fputc(int ch, FILE *f){
  3.         HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
  4.         return ch;
  5. }
  6. /*
  7. /* USER CODE END PFP */
复制代码

空比与频率计算
占空比=(t1-t0)/(t2-t0)
频率=(t2-t0)/时钟频率= =(t2-t0)/(64M/(psc+1))

eeac9827bd9d4eb3ae3b2b88e784b15d.png

周期需要2个上升沿去判断,设定第一个上升沿time_flag由0->1,下降沿time_dowm_flag由0->1,此时就知道正占空比时间,当在产生上升沿时候,就可以计算出周期使用的时间。

8a4bde1a18004981ac7d022440519d57.png

变量定义
  1. #define IR_IN1 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_10)
  2. uint8_t time_up_flag=0;//上升沿标志位
  3. uint8_t time_dowm_flag=0;//下降沿标志位

  4. uint32_t time_up_num=0;//上升沿计数
  5. uint32_t time_dowm_num=0;//下降沿计数



  6. float time_frequency;//频率
  7. float time_duty;//占空比
复制代码

设置PWM占空比以及开启输入捕获
  1.   /* USER CODE BEGIN 2 */
  2.         HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_3);
  3.         __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 300);
  4.         HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_3);//函数用于使能定时器某一通道的输入捕获功能,并使能相应的中断
  5.         HAL_Delay(1);//加个延时,否则会配置错误
  6.         __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_3, TIM_INPUTCHANNELPOLARITY_RISING); // 重新设置位上升沿捕获
  7.         HAL_Delay(100);
  8.   /* USER CODE END 2 */
复制代码

回调函数
  1. /* USER CODE BEGIN 4 */
  2. // 捕获中断回调函数,每次捕获到信号就会进入这个回调函数
  3. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
  4. {
  5.         // 判断是否是定时器1的外部捕获口2
  6.         if(htim->Instance == TIM2)
  7.         {
  8.                 if(IR_IN1&&time_up_flag==0)//第一次上升
  9.                 {
  10.                         time_up_flag=1;
  11.                         __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_3, TIM_INPUTCHANNELPOLARITY_FALLING); // 改变捕获极性为下降沿捕获
  12.                         __HAL_TIM_SET_COUNTER(&htim2, 0); // 计数清零,从头开始计
  13.                
  14.                 }
  15.                 else if(IR_IN1==0&&time_dowm_flag==0)//下降
  16.                 {
  17.                         
  18.                         time_dowm_num = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_3); // 读取捕获计数,这个时间即为上升沿持续的时间
  19.                         __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_3, TIM_INPUTCHANNELPOLARITY_RISING); // 改变捕获极性为上升沿沿捕获
  20.                         time_dowm_flag=1;
  21.                 }               
  22.                 else if(IR_IN1&&time_dowm_flag==1)//第二次之后上升
  23.                 {               
  24.                         time_up_num = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_3); // 读取捕获计数,这个时间即为上升沿持续的时间
  25.                         __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_3, TIM_INPUTCHANNELPOLARITY_FALLING); // 改变捕获极性为下降沿捕获
  26.                         time_dowm_flag=0;
  27.                         __HAL_TIM_SET_COUNTER(&htim2, 0); // 计数清零,从头开始计
  28.                
  29.                 }        
  30.         
  31.         }        
  32. }
  33. /* USER CODE END 4 */
复制代码

主函数
  1.   /* Infinite loop */
  2.   /* USER CODE BEGIN WHILE */
  3.   while (1)
  4.   {
  5.     /* USER CODE END WHILE */

  6.     /* USER CODE BEGIN 3 */
  7.                 time_frequency=1000000/time_up_num;//频率
  8.                 time_duty = (float)time_dowm_num/(float)time_up_num;//占空比        
  9.                 printf("\ntime_frequency=%.2f,time_duty=%.2f",time_frequency,time_duty*100);
  10.                 time_duty=0;
  11.                 time_frequency=0;
  12.                 __HAL_TIM_SET_AUTORELOAD(&htim3, 500-1);
  13.                 __HAL_TIM_SET_PRESCALER(&htim3, 32-1);
  14.                 HAL_Delay(1000);               
  15.   }
  16.   /* USER CODE END 3 */
复制代码

测试结果
当输出1k频率,30%正占空比。

a8096dc2a6414611978994ac42673b8d.png

b0d3fa45a16e4881980ac1529c842d4e.png

当输出4k频率,60%正占空比。

949ddc41a2dd431aab1577de9319f125.png

fba8106abbe446ce8e8b78121ae63bd2.png

————————————————
版权声明:记帖


收藏 评论0 发布时间:2022-9-4 16:24

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版