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

[复制链接]
1399|5
 楼主| DHZFSYJ 发表于 2019-11-18 11:06 | 显示全部楼层 |阅读模式
项目内容:本人测试固定时间内2个同频率方波(频率约为:3KHz,占空比约为:50%,相位差约为:25%)的占空比、周期及相位差,固定时间约为1000个周期,且知道方波A超前于方波B。通过PWM输入模式测量方波A和方波B的占空比及周期,在方波A的上升沿中断时开启定时器,在方波B的上升沿中断时停止定时器,用于测量两者的相位差。
处理器:STM32F103ZET6,系统时钟72M
问题:占空比、周期测量正常,相位差测量偶尔会出现异常,异常一般出现在开始测量的第一个相位差,希望大神帮忙分析?

  1. /**
  2.   * [url=home.php?mod=space&uid=247401]@brief[/url]  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. }
香水城 发表于 2019-11-20 15:08 | 显示全部楼层
不知你具体怎么操作地。
因为你要测周期和占空比,A/B信号至少是各用1个通道吧。

测量相差地话,在A发生捕捉的前提下,再发生B的捕捉即可求出相差。记得每次在A的更新事件里清除上沿发生过捕获的标志。

这里还要注意一点,测量宽度是否可能超过一个定时器计数周期,若是,你还得考虑多次溢出周期的计算。
2606.png
goodluck09876 发表于 2019-11-20 16:09 | 显示全部楼层
高频反而好测,低频不好测量!

不管是高频还是低频,都应该加上一个溢出的计数。计数*定时周期+定时周期内的计数长度吧
wakayi 发表于 2019-12-10 13:39 | 显示全部楼层
舍弃掉第一个数据
renzheshengui 发表于 2019-12-10 13:43 | 显示全部楼层
为什么高频比低频好测呢
paotangsan 发表于 2019-12-10 13:46 | 显示全部楼层
高也是要有限度的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

56

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部