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

这篇具有很好参考价值的文章主要介绍了STM32测相位差(根据时间差)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

        

stm32测相位,单片机,单片机

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

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);  
}

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

下面给出关于求相位差部分的主程序代码:文章来源地址https://www.toymoban.com/news/detail-594996.html

		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;
		}

到了这里,关于STM32测相位差(根据时间差)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mysql怎么求时间差

    1、使用TIMEDIFF()函数 TIMEDIFF(dt1, dt2):计算两个TIME或DATETIME值之间的差值,两个必须为相同类型的参数,即TIME或DATETIME。 TIMEDIFF函数返回表示为时间值的dt1 - dt2的结果,如果任一参数为NULL,TIMEDIFF函数将返回NULL 2、使用IMESTAMPDIFF()函数 TIMESTAMPDIFF(unit,begin,end):计算两个DATE或DAT

    2024年02月13日
    浏览(43)
  • shell脚本计算时间差

    https://www.cnblogs.com/abclife/p/15828229.html

    2024年02月11日
    浏览(46)
  • Excel如何计算时间差

    =HOUR(B1-A1)\\\"小时 \\\"MINUTE(B1-A1)\\\"分钟 \\\"SECOND(B1-A1)\\\"秒\\\"

    2024年04月23日
    浏览(53)
  • 飞书-多维文档-计算时间差

    如图所示,字段类型选择 公式 单击 公式编辑器 在弹出的公式编辑框中输入公式 TEXT([终结时间]-[开始时间],\\\"HH:MM\\\") [终结时间] 和 [开始时间] 请替换成你的表格中对应的字段名称 HH:MM 表示输出的时间格式为 时:分 其中 “YYY/MM/DD HH:MM” 表示 年月日时分,可以自行选取合适的值

    2024年02月07日
    浏览(69)
  • 面试算法35:最小时间差

    给定一组范围在00:00至23:59的时间,求任意两个时间之间的最小时间差。例如,输入时间数组[“23:50”,“23:59”,“00:00”],\\\"23:59\\\"和\\\"00:00\\\"之间只有1分钟的间隔,是最小的时间差。 这个题目最直观的解法是求出任意两个时间的间隔,然后比较得出最小的时间差。如

    2024年02月06日
    浏览(47)
  • 解决时间差太大导致Windows无法同步时间

    按微软文档进入注册表修改: HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesW32TimeConfig MaxPosPhaseCorrection和MaxNegPhaseCorrection为:0xffffffff (8个F) 但是发现W32TimeConfig里面是空的,而且无法创建 查看config目录权限,发现权限丢失,重新继承权限后修改成功。 另外设置同步时间间隔

    2024年02月16日
    浏览(65)
  • Java计算时间差、日期差

    在java中,计算时间差或日期差有多种方法,以下提供五种示例: 目录 一、使用 Instant 和 Duration 类计算时间差 二、使用 LocalDate 和 ChronoUnit 类计算日期差 三、使用 Joda-Time 库计算时间差和日期差 四、使用 Instant 和 Period 类计算日期差 五、使用 Java 8 的 java.time.tempo

    2024年02月14日
    浏览(50)
  • LocalDate、LocalDateTime计算时间差

    LocalDateTime计算天数和时间差 以下是Jdk1.7存在的问题以及Jdk1.8新特性 Jdk1.7的问题   在Jdk1.8版本发布了新的Date-Time API来加强对时间、日期的处理。这是因为在Jdk1.7中时间、日期的处理上存在如下的一些问题。 非线程安全。Date类是非线程安全的,这是Java时间日期类中最大的

    2023年04月15日
    浏览(41)
  • 【hive 】时间差(天、小时、分、秒)和常用时间格式转

    unix_timestamp()是hive系统时间,格式是timestamp,精确到秒。 unix_timestamp(ymdhms)是把时间转换成timestamp格式,是2018-05-23 07:15:50格式。 unix_timestamp() - unix_timestamp(ymdhms)是两个时间转换为timestamp之后相减,timestamp单位是秒,相减之后是两个时间之间相差的秒数。 CAST((unix_timestamp() - un

    2024年02月03日
    浏览(38)
  • Java计算Date类时间差

    在Java中,我们可以使用Date类来表示日期和时间。如果我们想要计算两个日期之间的时间差,我们可以使用以下步骤: 创建两个Date对象,表示要比较的两个日期。 使用getTime()方法获取每个Date对象的时间戳。 计算两个时间戳之间的差值,以毫秒为单位。 将毫秒转换为所需的

    2024年02月15日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包