打印
[STM32F1]

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

[复制链接]
1167|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
DHZFSYJ|  楼主 | 2019-11-18 11:06 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
项目内容:本人测试固定时间内2个同频率方波(频率约为:3KHz,占空比约为:50%,相位差约为:25%)的占空比、周期及相位差,固定时间约为1000个周期,且知道方波A超前于方波B。通过PWM输入模式测量方波A和方波B的占空比及周期,在方波A的上升沿中断时开启定时器,在方波B的上升沿中断时停止定时器,用于测量两者的相位差。
处理器:STM32F103ZET6,系统时钟72M
问题:占空比、周期测量正常,相位差测量偶尔会出现异常,异常一般出现在开始测量的第一个相位差,希望大神帮忙分析?

/**
  * [url=home.php?mod=space&uid=247401]@brief[/url]  Input Capture callback in non blocking mode
  * @param  htim : TIM IC handle
  * @retval None
  */
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
        
        /* Prevent unused argument(s) compilation warning */
  UNUSED(htim);
  /* NOTE : This function Should not be modified, when the callback is needed,
            the __HAL_TIM_IC_CaptureCallback could be implemented in the user file
   */
        
        if(htim==&htim3)
        {               
                  //CH1上升沿中断
                        if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
                        {
                                        switch(a)
                                        {
                                                case 0:
                                                        HAL_TIM_IC_Start_IT(&htim4,TIM_CHANNEL_1);//开启方波B的PWM输入模式
                                                        HAL_TIM_IC_Start_IT(&htim4,TIM_CHANNEL_2);//开启方波B的PWM输入模式
                                                        a=1;
                                                        break;
                                                case 1:
                                                        IC1Value1 = HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_1);
                                                        HAL_TIM_Base_Start(&htim6);
                                                        duty_A = IC1Value2*1.0/IC1Value1;
                                                        duty_Asum+=duty_A;
                                                        if(flag_z==1)//规定时间到后停止测量
                                                        {
                                                                HAL_TIM_IC_Stop_IT(&htim3,TIM_CHANNEL_1);
                                                                HAL_TIM_IC_Stop_IT(&htim3,TIM_CHANNEL_2);
                                                                condition++;
                                                        }
                                                        if((duty_A<0.40) | (duty_A>0.60))//方波A的占空比不符合条件
                                                        {
                                                                HAL_GPIO_WritePin(GPIOG, LED3_Pin, GPIO_PIN_RESET);//LED报警
                                                                //condition=0;
                                                        }
                                                        break;
                                        }        
                        }
                        //CH2下降沿中断
                        else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
                        {
                                IC1Value2 = HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_2);
                                A++;
                        }
        }
        else if(htim==&htim4)
        {
                        if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
                        {
                                switch(b)
                                {
                                                case 0:b=1;break;
                                                case 1:
                                                        IC1Value3 = HAL_TIM_ReadCapturedValue(&htim4, TIM_CHANNEL_1);
                                                        HAL_TIM_Base_Stop(&htim6);
                                                        duty_B = IC1Value4*1.0/IC1Value3;
                                                        duty_Bsum+=duty_B;
                                                        IC1ValueAB=htim6.Instance->CNT;
                                                        phase_AB = IC1ValueAB*1.0/IC1Value1;
                                                        phase_ABsum+=phase_AB;
                                                        htim6.Instance->CNT=0;
                                                        if(flag_z==1)//规定时间到后停止测量
                                                        {
                                                                HAL_TIM_IC_Stop_IT(&htim4,TIM_CHANNEL_1);
                                                                HAL_TIM_IC_Stop_IT(&htim4,TIM_CHANNEL_2);
                                                                condition++;
                                                        }
                                                        if((duty_B < 0.40)|(duty_B > 0.60))//方波B的占空比不符合条件
                                                         {
                                                                        HAL_GPIO_WritePin(GPIOG,LED4_Pin,GPIO_PIN_RESET);//LED4报警
                                                                  //condition=0;
                                                         }
                                                         else if((phase_AB < 0.20)|(phase_AB > 0.30))//相位差不符合条件
                                                         {
                                                                phase=phase_AB;
                                                                HAL_GPIO_WritePin(GPIOC,LED5_Pin,GPIO_PIN_RESET);//LED5报警
                                                                //condition=0;
                                                         }
                                                         break;        
                           }
                         }
                        //CH2下降沿中断
                        else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
                        {
                                IC1Value4 = HAL_TIM_ReadCapturedValue(&htim4, TIM_CHANNEL_2);
                                B++;
                        }        
        }
}

使用特权

评论回复
沙发
香水城| | 2019-11-20 15:08 | 只看该作者
不知你具体怎么操作地。
因为你要测周期和占空比,A/B信号至少是各用1个通道吧。

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

这里还要注意一点,测量宽度是否可能超过一个定时器计数周期,若是,你还得考虑多次溢出周期的计算。

使用特权

评论回复
板凳
goodluck09876| | 2019-11-20 16:09 | 只看该作者
高频反而好测,低频不好测量!

不管是高频还是低频,都应该加上一个溢出的计数。计数*定时周期+定时周期内的计数长度吧

使用特权

评论回复
地板
wakayi| | 2019-12-10 13:39 | 只看该作者
舍弃掉第一个数据

使用特权

评论回复
5
renzheshengui| | 2019-12-10 13:43 | 只看该作者
为什么高频比低频好测呢

使用特权

评论回复
6
paotangsan| | 2019-12-10 13:46 | 只看该作者
高也是要有限度的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

55

帖子

1

粉丝