STM32测相位差(根据时间差)

         两路方波输入到stm32的两路定时器通道,通过检测高电平到来的时间差从而算出相位差,

公式  相位差=360*频率*(时间差)

        如果要测正弦波,可以通过电压比较电路转为方波

        

ddb1f5fd884b4a10b96a95a73d7f9ab1.png

定时器初始化及定时器中断代码:

void TIM5_Cap_Init(uint16_t arr,uint16_t psc)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    GPIO_InitTypeDef  GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStructure;
    TIM_TimeBaseStructInit(&TIM_TimeBaseInitStructure);
    TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
    TIM_TimeBaseInitStructure.TIM_Period=arr;
    TIM_TimeBaseInitStructure.TIM_Prescaler=psc;
    TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitStructure);

    
    TIM_ICInitTypeDef  TIM_ICInitStructure;
    TIM_ICInitStructure.TIM_Channel=TIM_Channel_4;
    TIM_ICInitStructure.TIM_ICFilter=0x00;
    TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
    TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;
    TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;
    TIM_ICInit(TIM5,&TIM_ICInitStructure);
    
    TIM_ICInitStructure.TIM_Channel=TIM_Channel_3;
    TIM_ICInitStructure.TIM_ICFilter=0x00;
    TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
    TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;
    TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;
    TIM_ICInit(TIM5,&TIM_ICInitStructure);
    
    NVIC_InitTypeDef  NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
    NVIC_Init(&NVIC_InitStructure);
    
    TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC4|TIM_IT_CC3,ENABLE);
    
    TIM_Cmd(TIM5,ENABLE);
}

u8  TIM5CH4_Cap_State; //第一路信号捕获标志
u16 TIM5CH4_Cap_Value; //第一路信号捕获值
u8  TIM5CH3_Cap_State; //第二路信号捕获标志
u16 TIM5CH3_Cap_Value; //第二路信号捕获值

void TIM5_IRQHandler()
{
    if((TIM5CH4_Cap_State&0x80)==0) //第一路信号未捕获到下降沿
    {
        if(TIM_GetITStatus(TIM5,TIM_IT_Update)==SET)
        {
            if(TIM5CH4_Cap_State&0x40) //第一路信号已捕获到上升沿
            {
                if((TIM5CH4_Cap_State&0x3f)==0x3f) //第一路信号上升沿到下降沿时间过长,捕获失败
                {
                    TIM5CH4_Cap_State|=0x80;       
                    TIM5CH4_Cap_Value=0xffff;
                }
                else TIM5CH4_Cap_State++;
            }
        }
        
        if(TIM_GetITStatus(TIM5,TIM_IT_CC4)==SET) //捕获中断
        {
            if(TIM5CH4_Cap_State&0x40) 		//第一路信号已经捕获到上升沿,则此次为下降沿被捕获
            {
                TIM5CH4_Cap_State|=0x80; 	//标志一次检测完成
                TIM5CH4_Cap_Value=TIM_GetCapture4(TIM5); //取出定时器的值
                TIM_OC4PolarityConfig(TIM5,TIM_ICPolarity_Rising); //设置为上升沿捕获
            }
            else //第一路未捕获到上升沿,则此次为上升沿被捕获
            {
                TIM5CH4_Cap_State=0;
                TIM5CH4_Cap_Value=0;
			    TIM_SetCounter(TIM5,0);
                TIM5CH4_Cap_State|=0X40; //标记捕获到上升沿
                TIM_OC4PolarityConfig(TIM5,TIM_ICPolarity_Falling); //设置为下降沿捕获
            }
        }
    }
    
    if((TIM5CH3_Cap_State&0x80)==0) 
    {
        if(TIM_GetITStatus(TIM5,TIM_IT_Update)==SET)
        {
            if(TIM5CH3_Cap_State&0x40) 
            {
                if((TIM5CH3_Cap_State&0x3f)==0x3f) 
                {
                    TIM5CH3_Cap_State|=0x80;       
                    TIM5CH3_Cap_Value=0xffff;
                }
                else TIM5CH3_Cap_State++;
            }
        }
        
        if(TIM_GetITStatus(TIM5,TIM_IT_CC3)==SET) 
        {
            if(TIM5CH3_Cap_State&0x40) 
            {
                TIM5CH3_Cap_State|=0x80; 
                TIM5CH3_Cap_Value=TIM_GetCapture3(TIM5); 
                TIM_OC3PolarityConfig(TIM5,TIM_ICPolarity_Rising); 
            }
            else 
            {
                TIM5CH3_Cap_State=0;
                TIM5CH3_Cap_Value=0;
			    TIM_SetCounter(TIM5,0);
                TIM5CH3_Cap_State|=0X40; 
                TIM_OC3PolarityConfig(TIM5,TIM_ICPolarity_Falling); 
            }
        }
    }
    
    TIM_ClearITPendingBit(TIM5,TIM_IT_Update|TIM_IT_CC4|TIM_IT_CC3);  
}

在主程序中求其中一路信号的频率,再使用开头给出的公式可求得相位差

下面给出关于求相位差部分的主程序代码:

		if((TIM5CH4_Cap_State&0x80) && (TIM5CH3_Cap_State&0x80))
		{
			timer4_temp=TIM5CH4_Cap_State&0x3f;
			timer4_temp*=65536;
			timer4_temp+=TIM5CH4_Cap_Value;
			
			timer3_temp=TIM5CH3_Cap_State&0x3f;
			timer3_temp*=65536;
			timer3_temp+=TIM5CH3_Cap_Value;
			
			if(timer4_temp > timer3_temp)
				time_diff = timer4_temp - timer3_temp;
			else
				time_diff = timer3_temp - timer4_temp;
			
			phase_diff = 360*F*time_diff/1000000;
			LCD_ShowNum(410,5+24*1,phase_diff,4,24);
			LCD_ShowString(410+4*12,5+24*1,12,24,24,".");
			LCD_ShowNum(410+5*12,5+24*1,(u16)(phase_diff*10)%10,1,24);
			
			TIM5CH4_Cap_State = 0;
			TIM5CH3_Cap_State = 0;
		}

  • 15
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
### 回答1: Multisim是一款功能强大的电路仿真软件,可以帮助工程师们设计、分析和优化电子电路。在Multisim中,我们可以使用波形相位差测量电路来测量两个波形信号之间的相位差。 波形相位差测量电路通常由两个主要部分组成:相位差锁相放大器和相位差计数器。相位差锁相放大器用于将输入信号锁定到参考信号,以确保两个波形信号具有相同的频率和相位。相位差计数器用于测量两个锁相放大器输出之间的相位差。 具体操作步骤如下: 1. 在Multisim中,选择并放置相位差锁相放大器和相位差计数器。可以通过搜索功能来找到这些元件。 2. 连接输入信号和参考信号到相位差锁相放大器的输入端口。确保输入信号和参考信号具有相同的频率和相位。 3. 连接相位差锁相放大器的输出到相位差计数器的输入端口。这将使相位差计数器能够测量两个信号之间的相位差。 4. 设置相位差计数器的参数,如采样率和测量时间。这将影响相位差测量的精度和稳定性。 5. 运行仿真,并观察相位差计数器的输出。该输出将显示两个信号之间的相位差,以角度或时间来表示。 需要注意的是,波形相位差测量电路的准确性受到输入信号和参考信号的频率稳定性和幅度稳定性的影响。因此,在实际应用中,需要选择稳定性较高的信号源,并进行校准和校验以确保测量结果的准确性。此外,对于更高级的相位差测量需求,还可以使用更复杂的测量电路和算法来提高测量的准确性和分辨率。 ### 回答2: 多用途仿真(Multisim)是一种电子电路仿真软件,用于设计、模拟和分析各种电路。通过使用Multisim,可以设计并试各种电路,包括波形相位差测量电路。 波形相位差测量电路是一种用于测量两个或多个信号之间的相位差的电路。相位差是指两个信号的波形在时间上的差异。 波形相位差测量电路通常由几个主要部分组成。首先,需要输入信号的源,可以是信号发生器或其他信号源。其次,需要一个输入信号选择器,用于选择要测量相位差的信号。然后,信号会经过一个放大器或放大电路,以确保信号在测量过程中的准确性和稳定性。接下来,信号会进入一个相位差测量电路,其中包括一个相位比较器,用于比较两个信号的相位差。最后,测量结果可以通过显示屏或数据记录设备进行输出。 波形相位差测量电路的原理是比较两个信号在一个给定时间段内的相位差。相位比较器会对两个信号进行比较,并输出一个表示相位差的电压值或数字值。通过测量这个输出值,可以确定两个信号之间的相位差。 使用Multisim软件可以设计和优化波形相位差测量电路,通过模拟和分析可以预电路在实际应用中的性能。通过调整电路参数和元件数值,可以实现更准确和稳定的相位差测量。 总之,Multisim波形相位差测量电路是一种用于测量电路中信号之间相位差的电路,通过使用Multisim软件可以设计和优化这种电路,以实现准确和稳定的相位差测量。 ### 回答3: 多用途集成电路(Multisim)是一款广泛应用于电子电路仿真和分析的软件工具。波形相位差测量电路是一种用于测量两个信号波形之间相对相位差的电路。 波形相位差测量电路通常由两个主要部分组成:相位比较器和计数器。 相位比较器用于分析信号波形,它可以检两个信号的上升沿或下降沿并产生相应的输出信号。相位比较器的输出信号可以是数字脉冲,也可以是模拟电压。常见的相位比较器有异或门电路,它可以将两个输入信号进行比较并输出一个相应的脉冲信号,脉冲宽度和相位差成正比。 计数器用于测量相位差,它可以计算相位比较器输出的脉冲数量,从而计算出信号波形之间的相位差。计数器可以是数字式计数器或模拟式计数器,根据应用的需求选择。 要进行波形相位差测量,首先将需要测量的两个信号输入到相位比较器中,并将其输出连接到计数器。然后,通过设置计数器的初始值,使其开始计数。当两个信号波形发生相位差时,相位比较器将产生相应的脉冲,计数器将自动递增或递减,直到达到设定条件。通过测量计数器的值,就可以得到两个信号波形之间的相位差。 因此,Multisim波形相位差测量电路可以帮助工程师和研究人员准确测量和分析不同信号波形之间的相对相位差,以便更好地优化电路设计、信号处理和通信系统等应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值