源代码中,这里应该是个错误
ad8302 只能判断量输入信号的0到180度的相位差,不能判断两个输入信号的先后顺序.为了得到0到360度的测量,也就是要判断两个输入信号谁在前 谁在后, 硬件电路里给出了两路相差90度的正交参考信号, i 和 q. i 路信号与输出的信号同相, q路信号输出的信号相差90度.
这样呢,每个频点的相位测量至少要测量次, 硬件要分别给出 i 和 q两路参考信号,得到 i和q 两次的相位测量值.
如何由两次测量的相位值计算出真实的 0到360度的相位差呢?
源代码算法如下
degrees = arctg(90-q)/(i-90)) ----- (i 和 q分别是0到180度的测量值)
不能理解原作者为什么用这样计算,这样的结果使得相位差大于30度的是时候 引入非常大的误差。
为了补偿这样的误差,也是为了补偿ad8302固有的在0度和180度两点的测量误差,源代码里添加了检测器校准功能,分别使用两段固定长的同轴线来判断相位的误差。
经过分析,给出了如下改进的算法:
degrees = arctg(cos(q))/(cos(i))) ----- (q=i+90度, cos(q)=sin(i))
这样的结果在实际测量时对比源算法得到了比较满意的效果。源代码的检测器校准步骤可以省略了。
大家讨论