OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2666|回复: 0

STM32F103测量2个同频率相位差为25%的方波,偶尔会在测量第一个相位差时测量值错误

[复制链接]

5

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2019-6-14
在线时间
41 小时
发表于 2019-11-18 10:51:32 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 DHZFSYJ 于 2019-11-18 11:01 编辑

  • 项目内容:本人测试固定时间内2个同频率方波(频率约为:3KHz,占空比约为:50%,相位差约为:25%)的占空比、周期及相位差,固定时间约为1000个周期,且知道方波A超前于方波B。通过PWM输入模式测量方波A和方波B的占空比及周期,在方波A的上升沿中断时开启定时器,在方波B的上升沿中断时停止定时器,用于测量两者的相位差。
  • 处理器:STM32F103ZET6,系统时钟72M
  • 问题:占空比、周期测量正常,相位差测量偶尔会出现异常,异常一般出现在开始测量的第一个相位差,希望大神帮忙分析?
  1. /**
  2.   * @brief  Input Capture callback in non blocking mode
  3.   * @param  htim : TIM IC handle
  4.   * @retval None
  5.   */
  6. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
  7. {
  8.         
  9.         /* Prevent unused argument(s) compilation warning */
  10.   UNUSED(htim);
  11.   /* NOTE : This function Should not be modified, when the callback is needed,
  12.             the __HAL_TIM_IC_CaptureCallback could be implemented in the user file
  13.    */
  14.         
  15.         if(htim==&htim3)
  16.         {               
  17.                   //CH1上升沿中断
  18.                         if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
  19.                         {
  20.                                         switch(a)
  21.                                         {
  22.                                                 case 0:
  23.                                                         HAL_TIM_IC_Start_IT(&htim4,TIM_CHANNEL_1);//开启方波B的PWM输入模式
  24.                                                         HAL_TIM_IC_Start_IT(&htim4,TIM_CHANNEL_2);//开启方波B的PWM输入模式
  25.                                                         a=1;
  26.                                                         break;
  27.                                                 case 1:
  28.                                                         IC1Value1 = HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_1);
  29.                                                         HAL_TIM_Base_Start(&htim6);
  30.                                                         duty_A = IC1Value2*1.0/IC1Value1;
  31.                                                         duty_Asum+=duty_A;
  32.                                                         if(flag_z==1)//规定时间到后停止测量
  33.                                                         {
  34.                                                                 HAL_TIM_IC_Stop_IT(&htim3,TIM_CHANNEL_1);
  35.                                                                 HAL_TIM_IC_Stop_IT(&htim3,TIM_CHANNEL_2);
  36.                                                                 condition++;
  37.                                                         }
  38.                                                         if((duty_A<0.40) | (duty_A>0.60))//方波A的占空比不符合条件
  39.                                                         {
  40.                                                                 HAL_GPIO_WritePin(GPIOG, LED3_Pin, GPIO_PIN_RESET);//LED报警
  41.                                                                 //condition=0;
  42.                                                         }
  43.                                                         break;
  44.                                         }        
  45.                         }
  46.                         //CH2下降沿中断
  47.                         else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
  48.                         {
  49.                                 IC1Value2 = HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_2);
  50.                                 A++;
  51.                         }
  52.         }
  53.         else if(htim==&htim4)
  54.         {
  55.                         if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
  56.                         {
  57.                                 switch(b)
  58.                                 {
  59.                                                 case 0:b=1;break;
  60.                                                 case 1:
  61.                                                         IC1Value3 = HAL_TIM_ReadCapturedValue(&htim4, TIM_CHANNEL_1);
  62.                                                         HAL_TIM_Base_Stop(&htim6);
  63.                                                         duty_B = IC1Value4*1.0/IC1Value3;
  64.                                                         duty_Bsum+=duty_B;
  65.                                                         IC1ValueAB=htim6.Instance->CNT;
  66.                                                         phase_AB = IC1ValueAB*1.0/IC1Value1;
  67.                                                         phase_ABsum+=phase_AB;
  68.                                                         htim6.Instance->CNT=0;
  69.                                                         if(flag_z==1)//规定时间到后停止测量
  70.                                                         {
  71.                                                                 HAL_TIM_IC_Stop_IT(&htim4,TIM_CHANNEL_1);
  72.                                                                 HAL_TIM_IC_Stop_IT(&htim4,TIM_CHANNEL_2);
  73.                                                                 condition++;
  74.                                                         }
  75.                                                         if((duty_B < 0.40)|(duty_B > 0.60))//方波B的占空比不符合条件
  76.                                                          {
  77.                                                                         HAL_GPIO_WritePin(GPIOG,LED4_Pin,GPIO_PIN_RESET);//LED4报警
  78.                                                                   //condition=0;
  79.                                                          }
  80.                                                          else if((phase_AB < 0.20)|(phase_AB > 0.30))//相位差不符合条件
  81.                                                          {
  82.                                                                 phase=phase_AB;
  83.                                                                 HAL_GPIO_WritePin(GPIOC,LED5_Pin,GPIO_PIN_RESET);//LED5报警
  84.                                                                 //condition=0;
  85.                                                          }
  86.                                                          break;        
  87.                            }
  88.                          }
  89.                         //CH2下降沿中断
  90.                         else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
  91.                         {
  92.                                 IC1Value4 = HAL_TIM_ReadCapturedValue(&htim4, TIM_CHANNEL_2);
  93.                                 B++;
  94.                         }        
  95.         }
  96. }
复制代码






正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-25 19:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表