搜索
bottom↓
回复: 50

单片机怎么检测两个同频率、同幅度的正弦波的相位差?

[复制链接]

出0入0汤圆

发表于 2013-8-9 17:19:11 | 显示全部楼层 |阅读模式
用单片机怎么检测两个频率,幅值相同的正弦波?
查过一些资料,说用过零检测电路来将正弦波转变成方波。
但具体不知道怎么计算,程序怎么写?思路有点乱。
还请知道的网友提醒,建议下。。。谢谢!

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2013-8-9 17:28:24 | 显示全部楼层
用过零检测电路来将正弦波转变成方波,然後应用单片机的输入捕获工能,第一个方波开启输入捕获,第二个方波停止输入捕获,计时器内的值便是和相位有关。

出0入0汤圆

 楼主| 发表于 2013-8-9 17:32:40 | 显示全部楼层
alias 发表于 2013-8-9 17:28
用过零检测电路来将正弦波转变成方波,然後应用单片机的输入捕获工能,第一个方波开启输入捕获,第二个方波 ...

能否具体点?是不是算出两个波形的时间差?

出0入0汤圆

发表于 2013-8-9 17:45:52 | 显示全部楼层
本帖最后由 alias 于 2013-8-9 17:50 编辑

第二个方波开启输入捕获,第二个方波停止输入捕获,计时器内的值便是周期,即 360 度。
第一个方波开启输入捕获,第二个方波停止输入捕获,计时器内的值除以上边的值再乘以360便是相位差。

出0入0汤圆

 楼主| 发表于 2013-8-10 09:56:28 | 显示全部楼层
alias 发表于 2013-8-9 17:45
第二个方波开启输入捕获,第二个方波停止输入捕获,计时器内的值便是周期,即 360 度。
第一个方波开启输入 ...

第二个方波开启输入捕获?第二个方波又停止输入捕获?

出0入0汤圆

发表于 2013-8-10 10:10:03 | 显示全部楼层
本帖最后由 alias 于 2013-8-10 10:13 编辑

是不是非常之玄?

MCU 输入捕获工能启动之後,第一次发生捕获时首先记下捕获记存器的现值。第二次发生捕获时捕获记存器的值减去先前的值就是周期了。

出0入0汤圆

 楼主| 发表于 2013-8-10 14:02:51 | 显示全部楼层
alias 发表于 2013-8-10 10:10
是不是非常之玄?

MCU 输入捕获工能启动之後,第一次发生捕获时首先记下捕获记存器的现值。第二次发生捕获 ...

刚刚测了一个方波的频率,就是这样子,先同你说的那样测出了周期。这个已经通过了,接下去准备测相位了。
你能否详细讲下原理?

出0入0汤圆

发表于 2013-8-10 14:10:08 | 显示全部楼层
楼主做什么仪表吗?

出0入0汤圆

发表于 2013-8-10 15:52:39 | 显示全部楼层
>>你能否详细讲下原理?

就两个频率一样的方波,相位定义就是上升缘出现的时间差别。当然亦可说成为两个波形的下降缘之时间差别。我在4搂提出的方法就是依从这要求而得出来的。

出0入0汤圆

 楼主| 发表于 2013-8-11 20:55:00 | 显示全部楼层
alias 发表于 2013-8-10 15:52
>>你能否详细讲下原理?

就两个频率一样的方波,相位定义就是上升缘出现的时间差别。当然亦可说成为两个波 ...

嗯,我查下资料。根据时间差求相位差,就是求出时间差,然后时间差比上周期,求出的就是相位差时间占周期的多少份,再乘以360度,就是相位差了

出0入0汤圆

发表于 2013-8-11 21:04:47 | 显示全部楼层
可以这样:两路信号放大至饱和变成方波,分别与两路同频方波做数字乘法,然后低通滤波,滤波后的幅值绝对值等比于相位差。

出0入0汤圆

发表于 2013-8-11 21:07:37 | 显示全部楼层
成本=低性能运放+异或门+R+C    这在较高频率下成本也很低。  当然频率更低的话用过零检测+单片机捕获就好了。

出0入17汤圆

发表于 2013-8-11 21:46:17 | 显示全部楼层
两个方波异或后捕捉正脉宽即可。

出0入17汤圆

发表于 2013-8-11 21:46:50 | 显示全部楼层
yiming988 发表于 2013-8-11 21:04
可以这样:两路信号放大至饱和变成方波,分别与两路同频方波做数字乘法,然后低通滤波,滤波后的幅值绝对值 ...

馊点子;精度差还麻烦

出0入0汤圆

发表于 2013-8-11 22:00:26 | 显示全部楼层
hhxb 发表于 2013-8-11 21:46
馊点子;精度差还麻烦

您一棒子打死了吧  频率低的话您的方法最好最省事,但是频率高的话单片机检测脉宽困难才用这个方法 精度就看楼主需要了。

出0入17汤圆

发表于 2013-8-11 22:20:05 | 显示全部楼层
yiming988 发表于 2013-8-11 22:00
您一棒子打死了吧  频率低的话您的方法最好最省事,但是频率高的话单片机检测脉宽困难才用这个方法 精度 ...

没有搭过电路不要瞎说;
用运放放大至饱和??!!!
你知不知道运放有两个特性,
首先BJT和老的MOS型运放输出不能至电源,至于差多少是一个不稳定的值(用示波器看饱和波形不是方波,高电压的地方不平),所以精度差。
能输出接近电源电压的叫轨到轨运放,这个应该算常识了。

其次运放输出饱和以后再推出饱和状态需要一段时间,这个参数在PDF里有,这个很影响速度和精度(如果没标很可能是太差了,厂商认为没人会这样用)。

所以应该用比较器;但是常见的比较器有的是集电极开路,我自己感觉驱动能力不强;





出0入4汤圆

发表于 2013-8-11 22:56:21 | 显示全部楼层
信号频率低的话,2楼的办法就行。频率高的话,需要加硬件电路,基本上就是等精度频率计的原理。

出0入0汤圆

发表于 2013-8-12 00:30:15 | 显示全部楼层
hhxb 发表于 2013-8-11 22:20
没有搭过电路不要瞎说;
用运放放大至饱和??!!!
你知不知道运放有两个特性,

您较真了,不用您来教我什么叫轨对轨运放,我提出一种办法让楼主来甄选而已,何必动肝火。SA604和门电路一起用是能把几百kHz信号相位差转换为幅值信号的,当然SA604是带放大的FM解调器,这点我前面回复的不对,这里道歉了  对不住误导了一些人。

同意楼上的回答,有比我方法更简便精确的方法。

出0入0汤圆

 楼主| 发表于 2013-8-12 09:26:18 | 显示全部楼层
hhxb 发表于 2013-8-11 22:20
没有搭过电路不要瞎说;
用运放放大至饱和??!!!
你知不知道运放有两个特性,

我是用比较器,来转成方波

出0入0汤圆

 楼主| 发表于 2013-8-12 09:27:10 | 显示全部楼层
wajlh 发表于 2013-8-11 22:56
信号频率低的话,2楼的办法就行。频率高的话,需要加硬件电路,基本上就是等精度频率计的原理。 ...

嗯,频率不高,用捕获看看

出0入0汤圆

发表于 2013-8-12 09:48:53 | 显示全部楼层
alias 发表于 2013-8-9 17:28
用过零检测电路来将正弦波转变成方波,然後应用单片机的输入捕获工能,第一个方波开启输入捕获,第二个方波 ...

正解,这个方法可行!

出0入4汤圆

发表于 2013-8-12 10:04:55 | 显示全部楼层
本帖最后由 baal 于 2013-8-12 10:09 编辑

没有提要求,不同的要求用不同方法。用在哪?

出0入4汤圆

发表于 2013-8-12 10:06:48 | 显示全部楼层
hhxb 发表于 2013-8-11 21:46
馊点子;精度差还麻烦

见过有这么用的,要求不高用这个方法很好,稳定,简单

出0入17汤圆

发表于 2013-8-12 10:51:50 | 显示全部楼层
wt418995874 发表于 2013-8-12 09:26
我是用比较器,来转成方波

我会的是yiming988
他说用的运放。

出0入17汤圆

发表于 2013-8-12 10:53:29 | 显示全部楼层
yiming988 发表于 2013-8-12 00:30
您较真了,不用您来教我什么叫轨对轨运放,我提出一种办法让楼主来甄选而已,何必动肝火。SA604和门电路 ...

以前我一个同学做过类似的电路,很麻烦,效果还不好。白白浪费了一天宝贵时间

出0入0汤圆

发表于 2013-8-12 10:58:06 | 显示全部楼层
软件可以实现全部,只需要采集到两个正弦的数量值就可以了。缺点是,很难跟踪到大于100Hz的正弦波,一般用于电网频率和相位检测。

出0入4汤圆

发表于 2013-8-12 10:58:50 | 显示全部楼层
hhxb 发表于 2013-8-12 10:51
我会的是yiming988
他说用的运放。

运放作比较器也不是不可以的,看精度需求了。

出0入12汤圆

发表于 2014-3-11 21:08:57 | 显示全部楼层
alias 发表于 2013-8-9 17:28
用过零检测电路来将正弦波转变成方波,然後应用单片机的输入捕获工能,第一个方波开启输入捕获,第二个方波 ...

当相位差接近0时,会出错

出0入0汤圆

发表于 2014-3-11 22:53:59 | 显示全部楼层
本帖最后由 alias 于 2014-3-11 23:31 编辑

当相位差向0接近,输入捕获得到的数值是渐渐变小,由於中断处理及改变捕获的讯号源都要些时间,处理完毕后另外一个方波的上升缘已出现,要等到下一次的上升缘才能发生输入捕获,固捕获得到的数值会特然大於方波周期N。当相位差等於0时,输入捕获得到的数值便相等於方波周期N。

你说会出错,是你不明白如何处理捕获得到的数值。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-3-12 12:10:05 | 显示全部楼层
看下面有人提出了正确的解决办法,顶

出0入0汤圆

发表于 2014-3-12 13:38:24 | 显示全部楼层
最简单的办法。ADC测量周期和峰值。计数峰值时间差即可。
当然也可以施密特整形成方波比较上升沿……

出0入12汤圆

发表于 2014-4-5 15:24:52 | 显示全部楼层
alias 发表于 2014-3-11 22:53
当相位差向0接近,输入捕获得到的数值是渐渐变小,由於中断处理及改变捕获的讯号源都要些时间,处理完毕后 ...

我是这样处理的,不知道为什么相位差接近0时会出错
void TIM4_IRQHandler(void)
{                     
        u32 temp = 0;
        temp = TIM4->SR;
        if (temp & 0x02)                        //捕获1发生捕获事件
        {
                TIM4->SR&=~(1<<1);            //清除1通道中断标志位
                ReadValue1[0] = TIM4->CCR1;
                TIM4->DIER&=~(1<<1);           //禁止1通道捕获中断
                LED1 =!LED1;               
        }
        else if(temp & 0x04)                  //捕获2发生捕获事件
        {                                                                  
                TIM4->SR&=~(1<<2);                  //清除2通道中断标志位
                ReadValue1[1] = TIM4->CCR2;
                Getnum[0]= (ReadValue1[1] - ReadValue1[0]);
                TIM4->DIER&=~(1<<2);          //禁止2通道捕获中断
                LED2 =!LED2;
        }   
}

出0入0汤圆

发表于 2014-4-5 17:41:29 | 显示全部楼层
精度要到多少?
直接AD采样,并做FFT,即可算出2个的相位差,精度一般都可以做到0.2度

出0入0汤圆

发表于 2014-4-5 17:44:02 | 显示全部楼层
本帖最后由 alias 于 2014-4-5 17:52 编辑

我上面提到的是AVR上单一个的捕获寄存器,其它有多个捕获寄存器的 MCU 可能更好做。

先确定要测量方波的周期,假设周期 = Timer4 的 2345 个计数,我的做法如下:

1. 禁止通道2捕获中断
2. 使能通道1捕获中断
.
.
3. 通道1捕获中断出现及进入Handler
4. ReadValue[0]
5. 禁止通道1捕获中断
6. 使能通道2捕获中断
7. 中断返回
.
.
8. 通道2捕获中断出现及进入Handler
9.  ReadValue[1]
10. 禁止通道2捕获中断
11. Result=ReadValue[1]-ReadValue[0]. If Result >= 2345 then Result = Result - 2345
12. 中断返回

出0入12汤圆

发表于 2014-4-9 18:14:47 | 显示全部楼层
alias 发表于 2014-4-5 17:44
我上面提到的是AVR上单一个的捕获寄存器,其它有多个捕获寄存器的 MCU 可能更好做。

先确定要测量方波的周 ...

我知道我的为什么会出错了:我在测出30次角度差后取了个平均值,结果当相位差接近0度时,
参与计算中的数象这样(359,0,1,359,358,0,1,359,359.........),虽然一眼看出来平均值是接近0度的,但单片机计算下来,就是乱的了。
这个怎么解决呢??

出0入0汤圆

发表于 2014-4-9 18:31:01 来自手机 | 显示全部楼层
hhxb 发表于 2013-8-11 22:20
没有搭过电路不要瞎说;
用运放放大至饱和??!!!
你知不知道运放有两个特性,

比较器比起运放的一个优势就是在重载的情况下也能保证响应速度。所以比较器的带载能力还是挺强的。

出0入0汤圆

发表于 2014-4-9 18:53:49 | 显示全部楼层
学习了!!!!

出0入0汤圆

发表于 2014-4-9 18:55:32 | 显示全部楼层
以前做的是方波或者PWM波异或后检测,但是正弦波还真没有太好的方法,毕竟触发前沿不够陡峭。个人感觉看频率范围而定,低频部分可以过零迟滞变方波检测,高频个人感觉还是通过A/D用软件算吧。33楼我认同,具体没试过FFT算后的精度,但是要求你的MCU要强。功耗可能会稍高一些。

出0入0汤圆

发表于 2014-4-9 18:56:45 | 显示全部楼层
上传一个相关论文吧,网上一搜一大堆。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-4-9 19:03:47 | 显示全部楼层
>>这个怎么解决呢??

359 变成 -1,358 变成 -2 如此类推,取平均值后,如果是负值,就加 360。

出0入0汤圆

发表于 2014-4-9 19:28:08 | 显示全部楼层
zhaoxukiller 发表于 2014-4-9 18:56
上传一个相关论文吧,网上一搜一大堆。

大学的电路基础中,有个叫做相关函数的东西,他可以解决楼主的问题

出0入12汤圆

发表于 2014-4-9 20:03:34 | 显示全部楼层
alias 发表于 2014-4-9 19:03
>>这个怎么解决呢??

359 变成 -1,358 变成 -2 如此类推,取平均值后,如果是负值,就加 360。 ...

照你的方法,数组会变成这样(357,-2,-1,357,-1,0,-1.........)
结果还是不对,只是出错不是0度附近,而是358度附近,呵呵。。。

出0入0汤圆

发表于 2014-4-9 22:49:02 | 显示全部楼层
if value>179 then value = value - 360

出0入12汤圆

发表于 2014-4-9 23:31:25 | 显示全部楼层
alias 发表于 2014-4-9 22:49
if value>179 then value = value - 360

会不会变成180度出错

出0入0汤圆

发表于 2014-4-9 23:46:53 | 显示全部楼层
本帖最后由 alias 于 2014-4-10 00:37 编辑

试了的确 180度会出错,除5后得出36度而不是180度。

+178 = 178
+179 = 179
+180 = 180
+181 = -179
+182 = -178

那(359,0,1,359,358,0,1,359,359.........) 又如何取平均呢?

把每一数值当成是极座标,然后用Sin()及Cos()转为Y及X座标值,把30个Y轴及30个X轴的座标相加后各取平均,及后将它转为单一角度。

出0入12汤圆

发表于 2014-4-11 15:19:42 | 显示全部楼层
alias 发表于 2014-4-9 23:46
试了的确 180度会出错,除5后得出36度而不是180度。

+178 = 178

应该是个方法,不过太麻烦,计算耗时

出0入10汤圆

发表于 2014-4-11 15:46:01 | 显示全部楼层
hhxb 发表于 2013-8-11 21:46
馊点子;精度差还麻烦

LZ频率高了,怎么办?

出0入10汤圆

发表于 2014-4-11 15:49:27 | 显示全部楼层
定频还是频率要变化?频率多大?频率不同,处理方法不同哦

出0入0汤圆

发表于 2014-4-11 15:52:23 | 显示全部楼层
你这是要区别两个正弦波?

出0入17汤圆

发表于 2014-4-11 17:26:17 | 显示全部楼层
chengtina 发表于 2014-4-11 15:46
LZ频率高了,怎么办?

高速比较器

出0入0汤圆

发表于 2015-8-28 18:21:00 | 显示全部楼层
能具体讲一下,用软件怎么计算编程的吗?给个思路
我现在是采样AC两相电压,B相电流,想计算线路的有功、无功和功率因数?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-6 07:01

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表