This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 使用校准电阻器计算相位偏移

Guru**** 2595770 points
Other Parts Discussed in Thread: MSP430FR4133, AFE4300

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/671145/calculating-phase-offset-using-calibration-resistors

主题中讨论的其他器件:MSP430FR4133AFE4300

我正在尝试准确计算 RC 网络的相位。 在这里的几篇文章(包括我自己的文章)中、我意识到每次使用新频率时校准相位偏移可能是最简单的事情。

我使用 MSP430FR4133 Launchpad 来控制 AFE4300EVM。 我让它发挥了大部分作用、我可以从多个频率读取连续阻抗数据、而不会出现任何问题(在 IQ 模式下)。 不过、计算相位有点困难。 因此、我当前的方法是初始化所有寄存器、设置初始频率、设置 ISW 和 VSENSE 多路复用器以从100欧姆校准电阻器读取数据、读取相应的 I 和 Q、清除 ISW 和 VSENSE 多路复用器、设置 ISW 和 VSENSE 多路复用器以从750欧姆校准电阻器读取数据、增加频率并重复。 我的目标是1。 确保我能够正确读取750欧姆 、然后按2。 确保我可以偏移已经存在的任何相位。

//命令'mIIIi?' 使程序进入频率扫描模式
// IIIi 是 ISW_MUX 和 VSENSE_MUX 的十六进制代码

//输出采用格式- frequency、I_Cali、Q_Cali /n frequency、I_calc、Q_calc /n

否则、如果(uartRxBuffer[uartRxRdBufPtr]='m')
{
int 索引= 0;
initDRDY ();

//获取 I 和 V 的输出引脚
uartRxRdBufPtr++;
IF (uartRxRdBufPtr >= MAXRXBUF)
uartRxRdBufPtr = 0;

//将 ASCII 字节转换为引脚地址。
afe4300输出= ascii2uint8 (uartRxBuffer[uartRxRdBufPtr])<<12;

uartRxRdBufPtr++;
IF (uartRxRdBufPtr >= MAXRXBUF)
uartRxRdBufPtr = 0;
afe4300输出|= asci2uint8 (uartRxBuffer[uartRxRdBufPtr])<<8;

uartRxRdBufPtr++;
IF (uartRxRdBufPtr >= MAXRXBUF)
uartRxRdBufPtr = 0;
afe4300输出|= asci2uint8 (uartRxBuffer[uartRxRdBufPtr])<<4;

uartRxRdBufPtr++;
IF (uartRxRdBufPtr >= MAXRXBUF)
uartRxRdBufPtr = 0;
afe4300输出|= ascii2uint8 (uartRxBuffer[uartRxRdBufPtr]);


字符 afeStringData[8];

//设置初始频率
spiWrite (AFE4300_BCM_DAC_FREQ、0x0000);
spiWrite (AFE4300_DEVICE_CONTROL2、0x0000);
spiWrite (AFE4300_BCM_DAC_FREQ、FREQ[索引]);
spiWrite (AFE4300_DEVICE_CONTROL2、fares[index+1]);


//当按下'S'时,while 循环退出
while (UCA0RXBUF!="S"){

//选择 PCB 上的校准电阻器-选择 CAL 100
spiWrite (AFE4300_ISW_MUX、0x0101);
spiWrite (AFE4300_VSENSE_MUX、0x0101);

itoa (频率[索引]、&afeStringData[0]、10);

uartTXByte ('、');

//校准
//将外设设置为 I
spiWrite (AFE4300_ADC_CONTRAL_REGISTER2、ADC_REF_SEL_VREF | PERSIS_BCM_I);

while (readADCFlag=0);//等待中断
readADCFlag = 0;
P4OUT ^= BIT0;
afe4300Data = spiRead (0);
itoa (afe4300Data、&afeStringData[0]、10);

uartTXByte ('、');

//将外设设置为 Q
spiWrite (AFE4300_ADC_CONTRAL_REGISTER2、ADC_REF_SEL_VREF | PERSIS_BCM_Q);

while (readADCFlag=0);//等待中断
readADCFlag = 0;
P4OUT ^= BIT0;
afe4300Data = spiRead (0);
itoa (afe4300Data、afeStringData、10);

uartTXByte ('\n');
spiWrite (AFE4300_ISW_MUX、0x0000);
spiWrite (AFE4300_VSENSE_MUX、0x0000);

//将引脚设置为所需的引脚排列
spiWrite (AFE4300_ISW_MUX、afe4300输出);
spiWrite (AFE4300_VSENSE_MUX、afe4300输出);
itoa (频率[索引]、&afeStringData[0]、10);
uartTXByte ('、');

//计算
//将外设设置为 I
spiWrite (AFE4300_ADC_CONTRAL_REGISTER2、ADC_REF_SEL_VREF | PERSIS_BCM_I);

while (readADCFlag=0);//等待中断
readADCFlag = 0;
P4OUT ^= BIT0;
afe4300Data = spiRead (0);
itoa (afe4300Data、&afeStringData[0]、10);

uartTXByte ('、');

//将外设设置为 Q
spiWrite (AFE4300_ADC_CONTRAL_REGISTER2、ADC_REF_SEL_VREF | PERSIS_BCM_Q);

while (readADCFlag=0);//等待中断
readADCFlag = 0;
P4OUT ^= BIT0;
afe4300Data = spiRead (0);
itoa (afe4300Data、afeStringData、10);

uartTXByte ('\n');

索引+=2;
if (index>8){index = 0;}
//写入新频率
spiWrite (AFE4300_BCM_DAC_FREQ、0x0000);
spiWrite (AFE4300_DEVICE_CONTROL2、0x0000);
spiWrite (AFE4300_BCM_DAC_FREQ、FREQ[索引]);
spiWrite (AFE4300_DEVICE_CONTROL2、fares[index+1]);


}
readADCFlag = 0;
DRDYIEL();
uartRxRdBufPtr = 0;
uartRxWRBufPtr = 0;
uartRxBufLength = 0;
}
} 

当我使用此代码收集数据时、我希望数据在我通常看到的750欧姆和我通常看到的100欧姆之间波动。 相反、I 和 Q 值介于两者之间。 我可以想到的唯一原因是、如果以某种方式并联电阻器、就会发生这种情况。 但 I 和 Q 值远距离不接近100欧姆、这样才会正确。 我应该对其他寄存器进行编程吗? 我不确定该代码为什么不起作用。

750欧姆的 I、Q 典型值(未校准 Z_Magnitude、计算公式为 sqrt (I^2 + Q^2)、Phase = atan (Q/I)))

频率、I、Q、Z_Magnitude、Phase

8   7424   -3595   8248.624   -25.8381
16   7053   -5756   9103.645   -39.2181
32   7096   -2662   7578.883   -20.5631
64   8522   557   8540.183   3.7395
128   8198   -1405   8317.525   -9.7251
8   7363   -3580   8187.195   -25.9297
16   7041   -5752   9091.82   -39.2464
32   7120   -1438   7263.762   -11.4182
64   8630   1018   8689.835   6.7276
128   8074   2671   8504.335   18.305

100欧姆时的典型 I、Q 值

频率、I、Q、Z_Magnitude、Phase

8   1049   -415   1128.107   -21.5845
16   994   - 875   1324.259   - 41.3569
32   1013   -188   1030.298   -10.5138
64   1235   130   1241.823   6.009
128   1137   355   1191.131   17.3397
8   1043   -417   1123.271   -21.7919
16   1045   484   1151.643   24.8516
32   1153   190   1168.55   9.3575
64   1262   186   1275.633   8.3842

在两个校准电阻器之间切换的值(奇数行具有100欧姆电阻器值(校准)、偶数行具有测试值(750欧姆))。

频率、I、Q、Z_Magnitude、Phase

8   4350   179   4353.681   2.3564
8   3798   -3733   5325.42   -44.5055
16   4386   -672   4437.182   -8.7108
16   3783   4010   5512.82   46.6685
32   4806   1426   5013.094   16.5263
32   4544   731   4602.423   9.139
64   5393   3735705.206      3.7486
64   4645   1315   4827.551   15.8068
128   5432   725   5480.169   7.6022
128   3769   2499   4522.208   33.546
8   4369   260   4376.73   3.4057
8   3897   -3439   5197.435   -41.4276
16   4494   -1830   4852.312   -22.1566
16   3332   -5095   6087.795   -56.8163
32   3823   -1848   4246.226   -25.7987
32   4270   -1204   4436.498   -15.7467
64   5499   -181   5501.978-1.8852    
64   4586   1195   4739.137   14.6051
128   5421   697   5465.624   7.3266.
128   3765   2474   4505.097   33.3091

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Mathews:

    您能否分享校准电阻器如何连接到 AFE4300?

    此致、
    Prabin
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Prabin、

    我使用的是 AFE4300EVM。 因此、我使用的是 Sbaud201 (www.ti.com/.../sbau201.pdf)中详述的 R58 (100欧姆)和 R56 (750欧姆)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Mathews:

    如果我理解正确、您可以单独测量两个校准电阻器的正确 I/Q 值。
    上述用于切换 ISW_MUX/VSENSE_MUX 的代码有问题,我说对吗?

    此外、"afe4300outputs"在第90行和第91行中的值是什么?

    此致、
    Prabin
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Pravin、

    没错。 我正在使用 GUI (在 MATLAB 上)与 MSP430进行通信、以向 MSP430发送命令。 在我注意到的示例中、
    afe4300输出= 0x0201 (连接到750欧姆、即 R56)。
    我也尝试使用 EVM 外部的电阻器进行校准(在双极配置中使用 J38连接器的 IOUT)。 这会产生相同的结果。 我可以单独读取所有内容、但无法进行适当切换。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Mathews:

    在更改 MUX (ISW_MUX 和 VSENSES)和读取 ADC 输出之间、是否可以插入一些延迟(~ 300ms)?
    您还可以尝试调整延迟并查看读数。
    出现此延迟的原因是数据表图8中所示的"OUTP_Q_FILT 和 OUTM_Q_FILT (以及 OUTP_I_FILT 和 OUTM_I_FILT)"处的 LPF 为1.59Hz。
    您还可以手动测量 OUTP_Q_FILT 和 OUTM_Q_FILT (以及 OUTP_I_FILT 和 OUTM_I_FILT)之间的电压、以确保正确切换多路复用器(ISW_MUX 和 VSENSE)。

    此致、
    Prabin
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Prabin、

    感谢您帮助我解决这个问题。 我可以报告、添加500ms 延迟解决了 ADC 速率为16SPS 时的问题。 您能否解释一下您是如何得出~300ms 延迟值的? 我无法完全理解这与 LPF 有何关系。 是稳定时间吗?

    但是、这使得我的应用程序的整体数据收集速度太慢。 我设法弄清楚如何将 SPI 时钟与器件时钟同步、并且我已经获得非常稳定的相位值。 我想我现在将坚持这种方法。

    感谢你的帮助。