基于stm32的两路正弦波相位差测量

article/2025/8/23 19:57:37

利用stm32测量两路正弦波相位差,有四种主要思路:

1. 两路直接捕获信号直接得到时间差

即将正弦波过比较器变成方波(stm32直接测量正弦波也可以的,频率较大时误差基本上在忍受范围的),开启两路捕获得到上升沿的时间差,即可得到其相位差,但如果系统中信号噪声较大,此方法就很难测准。

辅助比较器电路:
在这里插入图片描述
(input0为比较值,这里是过零比较,接地就好了)

stm32代码:

void TIM2_IRQHandler(void)
{ 		    if((TIM2CH1_CAPTURE_STA&0X80)==0){if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET){	     if(TIM2CH1_CAPTURE_STA&0X40){if((TIM2CH1_CAPTURE_STA&0X3F)==0X3F){TIM2CH1_CAPTURE_STA|=0X80;		TIM2CH1_CAPTURE_VAL=0XFFFFFFFF;}else TIM2CH1_CAPTURE_STA++;}	 }//这是溢出处理,要是采集的信号频率较高,则可以不用这一段代码。if(TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET){	if(TIM2CH1_CAPTURE_STA&0X40)				{	  			TIM2CH1_CAPTURE_STA|=0X80;		TIM2CH1_CAPTURE_VAL=TIM_GetCapture1(TIM2);TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising); }else  								{TIM2CH1_CAPTURE_STA=0;			TIM2CH1_CAPTURE_VAL=0;TIM2CH1_CAPTURE_STA|=0X40;		TIM_Cmd(TIM2,DISABLE ); 	TIM_SetCounter(TIM2,0);TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling);		TIM_Cmd(TIM2,ENABLE ); }		    }			     	    					   }TIM_ClearITPendingBit(TIM2, TIM_IT_CC1|TIM_IT_Update); 
}

2. 两路信号过或非门转换成占空比测量

即将正弦波过比较器变成方波,过或非门得到占空比,使得测量相位差变成测量占空比,这里选用的或非门为SN74HC7002,由于这个或非门具有施密特触发器,使得系统抗噪性得到提高。
电路图:
在这里插入图片描述
电路图做了信号的隔直处理,去处理信号的直流分量。
STM32代码如下:

TIM_ICInitTypeDef  TIM2_ICInitStructure;void TIM2_Cap_Init(u16 arr,u16 psc)
{	 GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;   GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_ResetBits(GPIOA,GPIO_Pin_0);                              	//PA0口为信号接入口					     TIM_TimeBaseStructure.TIM_Period = arr;  TIM_TimeBaseStructure.TIM_Prescaler =psc; 	   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);TIM2_ICInitStructure.TIM_Channel = TIM_Channel_1; TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;	TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;	  TIM2_ICInitStructure.TIM_ICFilter = 0x00;TIM_ICInit(TIM2, &TIM2_ICInitStructure);NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);  TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_CC1,ENABLE);TIM_Cmd(TIM2,ENABLE ); 	
}u8  TIM2CH1_CAPTURE_STA=0;		    				
u16	TIM2CH1_CAPTURE_VAL1;
u16	TIM2CH1_CAPTURE_VAL2;   void TIM2_IRQHandler(void)
{ if((TIM2CH1_CAPTURE_STA&0X80)==0)	{	  if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET){	if((TIM2CH1_CAPTURE_STA&0X40))				{	  			TIM2CH1_CAPTURE_STA|=0X80;		        //捕捉到下降沿,停止计时,即一个周期的时间            TIM2CH1_CAPTURE_VAL2=TIM_GetCapture1(TIM2);}else if((TIM2CH1_CAPTURE_STA&0X20))  								{TIM2CH1_CAPTURE_STA|=0X40;				 //捕捉到第二个上升沿,记录时间,即高电平时间                  TIM2CH1_CAPTURE_VAL1=TIM_GetCapture1(TIM2);TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling);}	else  								{TIM2CH1_CAPTURE_STA=0;TIM2CH1_CAPTURE_VAL1=0;TIM2CH1_CAPTURE_VAL2=0;TIM_SetCounter(TIM2,0);TIM2CH1_CAPTURE_STA|=0X20;	TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising);}		    }			     	    					   }TIM_ClearITPendingBit(TIM2, TIM_IT_CC1|TIM_IT_Update); 
}

占空比即为 (TIM2CH1_CAPTURE_VAL1 / TIM2CH1_CAPTURE_VAL2)
相位差就是占空比乘以180,即为(TIM2CH1_CAPTURE_VAL1 / TIM2CH1_CAPTURE_VAL2)*180
主程序代码:

extern u8  TIM2CH1_CAPTURE_STA;		    				
extern u16	TIM2CH1_CAPTURE_VAL1;	  				
extern u16	TIM2CH1_CAPTURE_VAL2;int main(void){	u16 temp1,temp2,phase_difference; if(TIM2CH1_CAPTURE_STA&0X80){{	temp1=TIM2CH1_CAPTURE_VAL1;temp2=TIM2CH1_CAPTURE_VAL2;phase_difference = temp1/temp2*180;TIM2CH1_CAPTURE_STA=0;}}
}

3. 利用求相关来测量相位差

求相关测相位差在噪声严重的情况下误差还是蛮大的,这里就简单的讲一下,这是利用了互相关函数的两同频正弦信号的互相关函数零时刻值与其相位差的余弦值成正比的原理获得相位差。

具体公式:
在这里插入图片描述
matlab仿真代码(由仿真即可看出噪声影响对结果影响较大)

		SNR = 10 ^( 0.1 * k);          %信噪比的公式:10*lg(PS/PN)N0 = 1/SNR;                    %N0为噪声Sigma = sqrt(N0/2);            t=0:0.00002:0.01;              %采样信号50kHz,持续时间10msf=0.002;                       %被采样信号500Hznum=1/f;                       %num是周期w=pi/4;                       x1=sin(2*pi*num*t);            %产生信号x1y1=sin(2*pi*num*t+w);          %产生信号x2n1=Sigma.*randn(1,num+1);      %n1是噪声y2=y1+n1;                      %给y1信号加噪Ix=sum(x1.^2)/num;Iy=sum(y2.^2)/num;Ixy=sum(x1.*y2)/num;c=180*acos(2*Ixy/sqrt(4*Ix*Iy))/pi; 

http://chatgpt.dhexx.cn/article/jabPpoS8.shtml

相关文章

信号控制基本概念(相位和阶段)

本科上课时都上过这些,但是后来做科研没做这个方向,时间一长就都忘了,最近实习做信号控制相关,得拾起来,要不然被人嘲笑了。内容主要参考这篇文章,写的挺好的,也很全面,接下来概括下…

相位调制

一天一个信号处理小知识 1.相位调制 引言 在通信系统中,当通信设备产生了需要发送的数据,这个数据为一长串比特流,如果使用示波器画出来,那么就是一连串的方波。要想进行通信,就必须得想办法通过空气将这串比特流发送…

求解一个序列的最小相位序列

求解一个序列的最小相位序列 什么是最小相位序列hmin(z)一个例子总结例子说明求解思路零点搬移规律由非最小相位系统构造全通系统和最小相位系统的过程原型 什么是最小相位序列hmin(z) 最小相位系统Hmin(z)是零、极点都在单位圆内的因果稳定系统。 最小相位系统Hmin(z)的逆z变…

1.7 全通滤波器与最小相位系统

1.7 全通滤波器与最小相位系统

最小相位图

概述 在实际的3D成像中,由于投影仪和摄像机的位置必然不同,这会使得打在被测物上的条纹宽度与投影仪投出来的条纹宽度不同,从而导致测量深度与实际深度不符。(例如当我们要测量x轴所在与纸面垂直平面的深度时,测量出的…

数字滤波器(二)--最小相位延时系统和全通系统

最小相位延时系统和全通系统 引1. 系统相位2. 最小相位延时系统2.1 最小相位延时系统2.2 最小相位延时系统的性质 3. 全通系统3.1 定义与系统函数3.2 全通系统的零极点关系3.3 全通系统的应用 引 数字滤波器(一)–IIR与FIR的基本结构与MATLAB实现 1. 系统相位 当输入信号经过…

非最小相位

非最小相位系统(nonminimum phase systems),若控制系统有位于s右半开平面上的极点或零点,则称它为非最小相位系统。 与此同时,相对立的是:最小相位系统 最小相位系统的第一个特征:对同样的输入…

非最小相位系统;频率特性的对称性

非最小相位系统 非最小相位系统是相对最小相位系统来说的。它把最小相位系统的频率特性的实部或虚部取反了。 虚部取反 对实部取反 整体取反 各种非最小相位系统 比例环节 积分环节 微分环节 惯性环节 比例微分环节 二阶欠阻尼环节 实部取反、虚部取反对奈奎斯特曲线的影响 幅…

零点和极点到底影响了什么?什么是最小相位系统?

零点和极点到底影响了什么?什么是最小相位系统? 零点、极点、稳定、因果、最小相位是信号系统中经常听到名词,也许有的同学对这些概念有所了解,但对它们之间的关系却不甚了解,这篇文章我们就来看一下,它们之…

《离散时间信号处理学习笔记》—线性时不变系统的变换分析(二)

注:本博客是基于奥本海姆《离散时间信号处理》第三版编写,主要是为了自己学习的复习与加深。 一、最小相位系统 一)、最小相位和全通系统 1、任何有理系统函数都能表示成 式5.1 式中是最小相位系统,是全通系统。 1&#xff0…

CSkin相当优秀的C#/.Net Winform界面库

CSkin相当优秀的C#/.Net Winform界面库 cskin官网:http://www.cskin.net/ 分享两个不错的Demo 【CSkin_Demo】360安全卫士DEMO(去闪烁)-12.8更新 http://bbs.cskin.net/forum.php?modviewthread&tid93&fromuid2 【CSkin界面库】2015-1-28更新&#xf…

VS引用第三方插件CSkin

前言 机房重构断断续续经过一个星期终于实现了,登陆后更具不同的Level我们会进入不同的页面,我想首先页面一定要看起来让人舒适,在我的第一重构页面主题上我下了下功夫,发现CSkin非常的不错,引用这个第三方的组件可以…

CTF-Crypto

目录 Quoted-printable Rabbit 栅栏加密 RSA 凯撒加密 猪圈密码 uuencode Morse(莫尔斯电码) 异或 MD5爆破 RSA 近期又开始接触到了CTF中的Crypto方向,然后整理一下自己遇到的各种的加密的方式。 Quoted-printable quoted-printable编码方法适合所传输数…

CTF工具-seccomp-tools

seccomp-tools可以分析程序的seccomp状态,哪些被系统被禁用了安装 安装流程: sudo apt install gcc ruby-dev gem install seccomp-tools 之后便可直接分析程序的seccomp状态

Crypto(CTF)

Crypto方向CTF笔记 一些知识 一些知识 -ZIP文件的16进制开头是 504B(0xPK) -观察各种明显的进制 -wireshark异常流量分析,寻找data长度异常的包(将包的大小进行排序)。 -ZERO ONE(01)组合的…

CSK

参考博文:https://blog.csdn.net/qq_32763701/article/details/83691393 以及知乎大佬YaqiLYU的专栏 目标视觉跟踪(Visual Object Tracking),大家比较公认分为两大类:生成(generative)模型方法和判别(discriminative)模型方法,目…

cryptography

出现这个错误是因为缺少cryptography包,可以使用 pip install cryptography 安装cryptography包,如果安装cryptography失败 先检查一下自己的pip包是否为最新版本,在settings>Project>Project Interpreter里查看pip的版本 接下来使用ea…

C#---CSkin

一、都有哪些共功能 二、下载步骤 1、这个CSkin的下载和使用方法的地址:http://www.cskin.net/ 2、找到下载,直接点击下载 使用教程: 1.工具箱右键-新建项-命名CSkin。 2.将CSkin.dll拖到新建的工具箱栏里。 3.控件添加完毕,…

winfrom界面美化(cskin)

1.cskin控件的引用 2.可能会产生闪屏的问题 附: private void SetStyles() { base.SetStyle( ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDo…

CSkin界面库案例分享

【小助手Demo】高仿彗星小助手-2014.8.26更新 http://bbs.cskin.net/forum.php?modviewthread&tid209&fromuid2 【Metro风格】Metro窗体DEMO-14.7.2版本 http://bbs.cskin.net/forum.php?modviewthread&tid84&fromuid2 【动画特效界面】动画特效组件使用DE…