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.

[参考译文] FDC1004:通道翻转问题

Guru**** 678420 points
Other Parts Discussed in Thread: LDC1314, LDC2114, FDC1004, FDC1004EVM, FDC2214
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/1217779/fdc1004-channel-flipping-issue

器件型号:FDC1004
主题中讨论的其他器件:FDC2214、LDC1314、LDC2114

您好、专家!

我们需要您的帮助、以查看下面的客户咨询。 我是代表客户发布此帖子。

我正在使用您的 FDC1004电容数字转换器、通过 Arduino Pro Mini、ESP32-WARM-32E 或 ESP32-Mini-1读取电容传感器的值。  
在所有这些芯片中、我面临同样的问题、即读取时通道翻转。 换句话说、我读取的通道每上传一次前翻一个位置。 例如、在首次读取期间、我会在 CH2上读取放置在通道1上的值、在 CH3上读取放置在通道2上的值、在 CH4上读取放置在通道3上的值、在 CH1上读取放置在通道4上的值。 如果我复位芯片(或再次上传代码)、他们会进行修复、直到我不再上传代码。 这就是为什么每隔一次我上传代码或复位芯片时、我才会按照正确的顺序读取值。 我认为 Arduino 可能存在问题、但 ESP32也存在同样的问题。

我希望能够读取 ea 的正确电容值。

提前感谢您。

此致、

乔纳森

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

    Jonathan、您好!  

    我对此有几个问题:  

    • FDC1004是在您自己的电路板上还是在 FDC1004EVM 上?  
      • 您是否已使用 FDC1004EVM 和 GUI 对此进行了测试?  
    • 您是否可以共享与 FDC1004配置和读取相关的代码?  
      • 此外、对于该测量、FDC1004的寄存器设置是什么?  

    谢谢!  
    贾斯汀·比格尔

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

    大家好、Justin、

    感谢您发送编修。 以下是客户的回答。

    -我在自己的电路板上使用 FDC1004 ,我没有评估板
    -我还没有使用 FDC1004EVM 和 GUI 对其进行测试,我也不能这样做
    -我将向您发送代码,在那里您还可以看到我使用的寄存器设置,我尝试按照数据表上的信息对 FDC 配置寄存器(0x0C)进行编程。 您可以在随附的代码中看到它们。 寄存器设置是否缺少一些东西?
    -我还将附加一个简单的原理图,用于我正在使用的 FDC 和 Arduino pro mini 之间的连接。 I2C 引脚连接到 Arduino 上 GPIO4和 SCL。

    e2e.ti.com/.../FDC1004_5F00_ArduinoProMini.zipe2e.ti.com/.../Schematic_5F00_ArduinoFDC1004.pdf

    -原理图在很大程度上也与我在 ESP32系列的测试相似,在这里我把 SDA 连接到 GPIO 21和 SCL 连接到 GPIO22。 在这种情况下、通道也发生翻转。

    如果您需要其他信息、请告诉我。

    此致、

    乔纳森

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

    Jonathan、您好!  

    您的 FDC1004配置看起来不错。 我有几件事你可以尝试解决这个问题:  

    • 在主循环中、可以在第一次测量之前放置一个 while 循环、以等待第一个数据就绪信号出现。 这将确保第一个数据帧没有任何未对齐的数据。  
    • 您可以尝试在示波器上查看每个通道的波形。 捕捉第一轮测量中每个通道上发生激励的顺序将有助于验证芯片是否按正确的顺序测量通道。  
    • 在进行寄存器配置之后、您可以回读寄存器0x08至0x0B 的所有值、以确保配置已正确保存到器件寄存器中。  

    请告诉我、这些解决方案中是否有任何一项解决了该问题。 如果不是、您能否提供示波器捕获、以便我们对波形进行加倍?  

    此致、  
    贾斯汀·比格尔

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

    大家好、Justin、

    感谢你等待。 这是客户的回应。


    我在循环开始时尝试了第1点、但它没有解决问题。 我将向您随附我在 ESP32中执行的操作、其中我测试了与两个 FDC1004的两个 I2C 连接。 我所做的是、如您建议的那样、在循环开始时为每个 FDC 添加一个 while 循环。 但事实并非如此。

    我还尝试了寄存器检查选项3、实现方式如第二个屏幕截图中所示。 我希望您答对了。

    但是、我通过重置设置中的 FDC1004以及为寄存器0x0C 上升位15 (0x80)来极大地解决了该问题。

    还想问一下、用于打印电容值并将其从字节数组转换为 int 的公式是否正确?

    我在 Arduino Pro Mini 或 ESP32中使用相同的代码得到了非常不同的价值。 在这两种情况下、我都启用 CAPDAC 并在输入中使用可编程偏移量21、但使用 Arduino、我从≈0.63的基准值(无附加电容)开始、而 ESP 在所有通道上都≈30.63。 两个芯片之间的转换是否存在差异?

    它是处理二进制补码的东西吗? 或者我的公式是否错误?

    感谢你能抽出时间。


    此致、

    乔纳森

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

    Jonathan、您好!  

    此器件的测量范围为+-15pF。 得到30pF 的差异似乎是二进制的赞美。 要将寄存器值中的数据转换为电容、可以使用以下公式:  

    看起来您的所有数据都只有16位、而不是24位。 FDC1004中的每个寄存器的长度为16位、因此若要读取 MSB_MEAS 和 LSB_MEAS、您需要总共读取32位:  

    此致、  

    贾斯汀·比格尔

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

    大家好、Justin、  

    这是客户提出的另一个问题。

    当我尝试从配置寄存器中读回值时、每隔几次没有循环模式、我就会在两个 FDC 上获得错误的第一个通道值。 例如、Arduino 和 ESP32皆出现此情况、当拔下 USB 并插回计算机时、每隔几次就会发生此情况。 您可以在针对 ESP 情况的图片中看到错误的寄存器读取示例。 您知道为什么会发生这种情况吗? 它通过重置 Arduino 来修复。
    此外、我发现、当我使用两个 FDC、因此两个 I2C 连接与 ESP32时、我必须在第一个 FDC 连接到默认 I2D 引脚并且两次将第二个 FDC 连接到其他引脚时进行复位。 您知道原因吗? 我还在此处附上用于复位 FDC 的代码。

    这里随附了我用于读出数据并将二进制数组最终转换为 pF 电容值的代码。 这是保存24位数据并执行二进制补码转换的正确方法吗? 就我读出来的价值观而言、我不确定是这样的。

    非常感谢您的支持。

    此致、

    乔纳森

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

    Jonathan、您好!  

    我有几个关于这些问题的澄清问题:  

    • 当 I2C 事务存在错误数据问题时、您能否分享其示波器捕获?  
    • 假设您有两个到两个 ADC 的 I2C 连接、那么 ESP32上是否有单独的 I2C 连接?  

    此致、  

    贾斯汀·比格尔

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

    大家好、Justin、

    以下是客户的答案。

    -我会尽快将示波器捕获信息发送给您
    -两个 FDC2通过独立的 I2C 连接到 ESP32。 第一个 FDC 连接到默认的引脚21-22 (SDA-SCL);第二个 FDC 连接到引脚33-32 (SDA-SCL)

    此致、

    乔纳森

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

    Jonathan、您好!  

    我将等待示波器捕获、但我还有一个问题。  

    如果您读取第一个寄存器两次、不正确的值会消失还是两次都出现?  

    此致、  

    贾斯汀·比格尔

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

    大家好、Justin、

    以下是客户对您最新问题的回答。


    是如果我两次读出问题仍然存在。 我将随附两张关于这次试验的屏幕截图。 其中一个值正确、另一个(在我拔下 USB 并将其插回计算机后获得)寄存器不正确。

    此外、我能否再次询问您用于读取数据并将其转换为以 pF 为单位的电容的公式? 如果我读取了3个字节或4个字节(我将再次附上图片)、答案是否正确?

    感谢您的一贯支持。

    此致、

    乔纳森

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

    Jonathan、您好!  

    我想知道不正确的寄存器值是否只是 I2C 失准。 复位器件时、似乎是在向 CONFIG 寄存器的前半部分发送一个8位值。 如果您更改 RESET 命令以发送完整的16位值(0x8000)、是否仍偶尔出现此问题?  

    为了读取数据、最好读取 MSB 和 LSB 寄存器的所有32个位、然后丢弃这8个保留位。 然后、一旦将 MSB 和 LSB 位组合在一起、就可以使用上面共享的公式。  

    此致、  

    贾斯汀·比格尔

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

    大家好、Justin、

    以下是我们的客户问题和回应。  

    我尝试了您的建议、使用0x8000复位所有16位、但这样、通道翻转的问题仍然存在。

    为了使用您建议的公式来获取电容值、我能否将其复制到 C 中、如下所示? 或者我必须以不同方式执行二进制补码吗?

    此致、

    乔纳森

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

    Jonathan、您好!  

    按照代码中的方式实现二进制补码就可以了。  

    为了澄清您的问题、不正确的寄存器值是否仍然存在、还是仅在此时通道翻转?  

    此致、  

    贾斯汀·比格尔

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

    大家好、Justin、  

    以下是客户的回答。


    是的、如果我使用0x8000复位两个 FDC、则该寄存器设置正确。 但翻转仍然存在、通道现在进行翻转时没有常规模式(例如一次重置是、另两次是否、另两次是、另一次是否等)。 而且 FDC1和 FDC2的模式也不同。

    我在此处附上从寄存器设置回读中看到的内容以及我用于复位 FDC 的函数。

    感谢您的检查。

    此致、

    乔纳森

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

    Jonathan、

    "我有几个问题,但我不知道。"

    如何 将已知输入电容应用到通道、以便可以判断读数是否发生翻转?

    如果您仅使用单个输入端具有稳定值的通道、会观察到什么情况?

    此致、
    约翰

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

    您好、John:

    这是客户的回应。

    我将使用10pF 或4.7pF 的恒定电容器来测试读数。 我尝试了一个具有稳定输入的单通道和所有具有稳定输入的通道的情况。

    此致、

    乔纳森

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

    Jonathan、

    谢谢 Jonathan。

    贾斯汀说,他们显示的代码看起来不错,这给我们留下了一个不明确的路径,如何前进.

    让我们重新开始一些实验。

    1. 如果尚未这样做、请让它们将不同的 电容值连接到输入引脚。
      例如、将0pF 连接到输入 CIN1、将4.7pF 连接到 CIN2、将10pF 连接到 CIN3、将2x10pF 连接到 CIN4输入。
    2. 对于下面的所有测量、将 CAPDAC 设置为0。
    3. 让它们对每个单独的通道进行中等长的单通道测量。
      对于每个通道测量、他们在平均偏差和标准偏差方面看到了哪些电容值?
      它们是否反映了 连接到输入引脚的电容器的值?  
    4. 如果(3)的答案是"是"、则下一步是 对 CIN1和 CIN2、CIN1和 CIN3以及 CIN1和 CIN4进行成对的双通道测量、并注意结果(CIN4读数应饱和)。
      对于每个通道测量、他们在平均偏差和标准偏差方面看到了哪些电容值?
      他们看到的是稳定的、预期的值、还是看到错误的值和/或通道翻转、正如线程前面所描述的那样?
    5. 如果他们在步骤(4)中看到双通道测量的预期稳定值、则转到三通道测量{CIN1、CIN2、CIN3}和{CIN2、CIN3、CIN4}并记录结果。
      对于每个通道测量、他们在平均偏差和标准偏差方面看到了哪些电容值?
      他们看到的是稳定的、预期的值、还是看到错误的值和/或通道翻转、正如线程前面所描述的那样?
    6. 如果步骤2、3和4看起来正常、则转到四通道测量。
      对于每个通道测量、他们在平均偏差和标准偏差方面看到了哪些电容值?
      他们看到的是稳定的、预期的值、还是看到错误的值和/或通道翻转、正如线程前面所描述的那样?

    我知道这将是乏味的。
    此时、我们仍然不知道这是与电路的模拟或数字部分有关的问题、还是与客户的固件有关的问题。

    因此、请他们分享每个实验(3-6)的详细结果、包括 输出在 FDC1004的电容方面的平均和标准偏差 以及他们的一般观察结果 和评论。  

    最后一个问题:它们对不同的处理器使用的代码是否完全相同?

    此致、
    约翰

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

    您好、John:

    感谢你等待。 以下是客户的回答。

    为了更好地理解我正在讨论的内容、我将在此处附加用于读取数据并转换为电容值的代码(" ESP_Acquisition_2FDCs")和用于检查和读回寄存器设置的代码("Readout_register_esp32_2fdcs")。 因此、您的同事可以更好地帮助我、而不是挣扎。
    为了更好地回答 Miller 先生的问题、我想问您一个规格。 "两个通道成对测量"是什么意思? 是差分测量还是简单地通过通道连接到恒定电容并同时读取数据? 请注意、在我看来、这是固件问题、与电路的模拟或数字部分无关。

    对我来说、这是读取问题、因此我的问题是:
    -我是否正确地读出32位,然后考虑只24位转换?
    -二进制补码的实现是否正确?
    -寄存器是否设置正确? (对我来说似乎很好)

    这里有一个简短的答案、但我仍然对他们在第4点提出的问题有几个问题:
    我已经在备用通道上使用10pF 和4.7pF 完成了这一操作、我将使用您建议的电容进行操作。 我 à 的是 Δ Σ FDC1:在 CH1和 CH3上为10pF、在 CH2和 CH4上为4.7pF、在 CH1和 CH3上为4.7pF、在 CH2和 CH4上为10pF。

    3.如果您是要将电容保持插入很长时间并看到读数值…μ F。 平均而言、都会反映输入端的值(从基线中减去该值(可能是寄生电容):例如基线=-3.1pF、值-13.7pF)。 但是、当出现溢出或基线由于超出范围而太接近电容范围的边缘时、值不会反映出来。 如果我不应用复位功能、情况是一样的。

    4.我不确定您问的"双通道成对测量"->我的答案与答案3基本相同、我尝试了许多不同的通道组合、考虑单次测量而不是差分测量。 翻转不是这种组合造成的。 我看到的预期值是稳定的、只是因为多个电容并联放置、所以会稍高一点。 如果我不重置 FDC、也是如此。 我在这两种情况中的任何一种都看不到 CH4饱和。 这话什么意思?
    5.与问题4相同,我认为预期的值是稳定的。 如果我不重置 FDC、也是如此。
    6.在这里也一样。 同样、如果我不对 FDC 进行复位、通道将保持稳定。 不发生任何奇怪的翻转或饱和、除非我以物理方式复位芯片(在这种情况下、发生了翻转、如果我不使用 FDC 的复位函数)。
    7.我只是使用相同的代码,只是有一个额外的库为 ESP (#包括 )、我将使用电线库的 TwoWire 表达式来实现2个 FDC

    我还有一个问题。 选择24位进行最终转换并执行二进制补码、这种实现方式是否也很好?
    如果((c & 0x800000)! = 0){//检查值是否为负-->二进制补码
    c =~c + 1;//反转所有位并加1


    或者只是简单地 c=~c +1?

    if ((c & 0x800000)=0){//检查值是否为正-->二进制补码
    c =~c + 1;//反转所有位并加1

    因为我读取的值相对于所选的位变化很大

    e2e.ti.com/.../2FDCs_5F00_esp32.zip

    此致、

    乔纳森

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

    Jonathan、

    感谢您提供更多详细信息。 我将通读该主题、并在明天更新该主题。

    此致、
    约翰

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

    Jonathan、

    抱歉、我不清楚建议的成对测量策略。

    我在上一次答复的项目(4)中的意思是设置顺序双通道测量、首先是 CIN1和 CIN2、然后是 CIN1和 CIN3、最后是 CIN1和 CIN4。、查看读数的平均和标准偏差、并查找通道翻转。

    如果结果看起来不错、那么按照我上次回复的项目(5)中所述、继续进行三通道测量、以此类推。

    此致、
    约翰

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

    您好、John:

    感谢您的等待、

    这是客户的反馈。

    假设 capdac=0、我获得了所有4个通道的基准电容≈3.5pF 之上的预期稳定值(肯定始终存在以 nF 为单位的一点噪声)。 在所有情况下、我获得了 CH2为≈4.7pF、ch3为≈10pF、以及 CH4为饱和(≈16pf 固定饱和、将20pF 作为恒定电容)。

    如果我不重置 FDC、我仍然每次上传或每隔一个时间都有通道翻转、我重置芯片(通道向前打印一个位置)。 如果我复位寻址(0x8000)、我仍有通道翻转。
    如果我复位寻址(0x80)我没有翻转、在这种情况下、使用的无翻转的代码为:
    Wire.beginTransmission(SLAVE);
    Wire.write (0x0C);
    Wire.write (0x80);
    Wire.endTransmission ();

    请注意、我的意思是通过代码重置 FDC、这不同于使用开发板上的按钮从物理上重置芯片。

    请注意、我使用以下公式进行二进制补码转换:
    如果((c & 0x800000)! = 0){//检查值是否为负-->二进制补码
    c =~c + 1;//反转所有位并加1


    另请注意、对我而言、这是读取问题、因此我的问题是:
    -我是否正确地读出32位,然后考虑只24位转换?
    -二进制补码的实现是否正确?
    -寄存器是否设置正确? (对我来说似乎很好)

    确切地说、我使用两个 FDC。 第二个必须复位两次以避免翻转。 始终考虑(0x80)。 您知道原因吗?

    做了更多的测试后、我得出结论:关键是如何针对 capdac≠0的情况来配置配置寄存器的较低字节。
    我一直使用以下代码、这对我来说似乎是错误的:
    int capdac = round (偏移/3.125);
    for (int i = 0;i < NUM_SENSORS;i++){
    int register_value = 0x1000 +(capdac << 5);
    Wire.beginTransmission(SLAVE);
    Wire.write (0x08 + I);//对4个通道的测量配置寄存器进行寻址
    Wire.write (highByte (register_value)+ 32 * I);
    Wire.write (lowByte (register_value));
    Wire.endTransmission ();


    如果我考虑 capdac=0、则我使用了以下命令:
    Wire.beginTransmission(SLAVE);
    Wire.write (0x08 + I);
    Wire.write (0x10 + 32 * I);
    Wire.write (0x00);

    显然该错误位于 capdac≠0的设置中

    此致、

    乔纳森

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

    Jonathan、您好!  

    感谢您提供更多信息。 对于他们的反馈、我有几条评论:  

    请注意,对我来说,这是读取问题,因此我的问题是:
    -我是否正确地读出32位,然后考虑只24位转换?
    -二进制补码的实现是否正确?
    -寄存器是否设置正确? (对我来说似乎没问题)

    寄存器读取、二进制补码和寄存器设置看起来没有问题。 我看不到任何可能导致您遇到这些问题的问题。  

    如果我使用两个 FDC,请更加精确。 第二个必须复位两次以避免翻转。 始终考虑(0x80)。 您知道原因吗?

    我不知道为什么 他们必须将第二个重置两次。 是否可以将示波器连接到 I2C 通道并在复位前后检查事务?  

    显然 capdac≠0
    的设置中存在错误

    您是否尝试过将"highByte (register_value)"命令更改为固件中 capdac 的固定寄存器值偏移量?  

    此致、  

    贾斯汀·比格尔

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

    大家好、Justin、  

    非常感谢。 以下是我们客户的反馈。

    我已经修正了寄存器配置(高字节和低字节现在应该正确)。 读取以及二进制补码转换可能仍然会成为问题。 使用此代码时、如果我向通道输入一个恒定电容、那么我将无法读取 Capdac 非0值的预期值。 您能帮我解决读数和转换问题吗? 32位数据的最后8位应全部为0、但在本例中、它们都为1。

    请参阅随附的 zip 文件。

    e2e.ti.com/.../ESP32_5F00_OneFDC_5F00_4channels.zip

    此致、

    乔纳森

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

    Jonathan、您好!  

    感谢您提供的信息。  我有几个跟进问题:

    对于所有恒定电容测量值、电容读数是不正确还是仅对于电流 CAPDAC 设置(基于共享的代码、除20pF 电容外的所有测量值)应为负值的测量值?  

     测量值与预期值相差多远? 这些值是恒定的还是有噪声的?  

    此致、  

    贾斯汀·比格尔

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

    大家好、Justin、

    大多数通道的电容读取不正确。 有时它提供一个较小的值、有时它甚至不会相对于基线值发生变化。 所有的值都有很大的噪声(仅为0.05/0.1pF)。

    我有几个问题:
    1.如果我定义一个"int"值、考虑到"有符号整数类型使用二进制补码作为负值"、这是否意味着二进制补码已经完成、我不需要通过代码来实现?
    2、我必须始终执行二进制补码、还是只对负值执行补码? 还是仅用于正电压? 还是从不?
    3.使用 ESP32,将这些变量定义为"int"而不是"uint"是正确的吗?:int c_data[4]={0};/ int c = 0;/ int msb = 0;... 显然、在这两种情况下、结果在二进制输出方面变化很大(uint 为错误)。

    我将在此处附上较新版本的 sketch、其中使用"int 变量"、我将向您发送带2补码的结果。

    请注意、在随附的两个屏幕截图中:
    我在 CH1上放置了0pF、在 CH2上放置了4.7pF、在 CH3上放置了10pF、在 CH4上放置了20pF。 初始偏移为15pF。

    对于屏幕截图和提供的代码中"offset=15"的初始设置、在不含二进制补码的情况下、我在所有四个通道上读取的基线值为≈35、在使用二进制补码对同一初始偏移的情况下为≈26.9/27.4。

    如果我设置初始偏移=0、因此没有 capdac、则基线为≈3.5/3.0

    再次感谢您的一贯支持。
    此致、
    乔纳森
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jonathan、您好!  

    1. 如果我定义一个"int"值、考虑到"有符号整数类型使用二进制补码作为负值"、这是否意味着二进制补码已完成、我不必通过代码来执行?

    如果变量已经是有符号整数、您应该不需要对其执行二进制补码转换。 尽管当数据仅为24位时、整数为32位、但可能无法正确检测负部分。 如果您检查负24位数、以确保正确找到该负数、则可以屏蔽8MSB。  

    3. 使用 ESP32、将这些变量定义为"int"而不是"uint"是否正确?:int c_data[4]={0};/ int c = 0;/ int MSB = 0;... 显然结果在两种情况下变化很大,在二进制输出方面( uint 不正确)。[/报价]

    我不太熟悉 ESP32、但您可以通过从寄存器读取中打印出位来仔细检查数据是否被整数格式更改、并在将这些位分配给不同的整数类型后将其与进行比较。  

    看起来 MSB 和 LSB 数据寄存器有一条线 、用于在 提供的代码中打印到终端。 输出是否与器件的预期相符?  

    此致、  

    贾斯汀·比格尔

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

    大家好、 Justin、

    这 是客户的回应。

    1.根据您的同事所说的内容、并定义:
    C =(msb << 8)+(lsb >> 8);
    c =(c & 0x00FFFFFF);-->屏蔽仅考虑位[23:0]

    在哪种情况下、我必须执行二进制补码?
    a)仅为正 c 值(如屏幕截图所示)
    b)如果只有负 c 值
    c)从不
    d)始终
    我的面罩是否正确? 此外、请参阅为草图的这一部分附加的屏幕截图。

    2.二进制形式的 MSB 和 LSB 的输出与 c_data 元素一致,但不与我的预期结果一致。 初始偏移= 0时、我有正值"c"、1、有时2和3时也是如此。 则所有值均为负值。
    从正值(0、1作为初始偏移量)变为负值时、基线读数上会出现大约20pF 的巨大差距(如果我不插入任何物理电容、则会得到这个差距)。 您能告诉我为什么吗? 我很快就会向您发送一个带示例的 Excel 文件。

    3.您是否有过类似我的案例的示例? 例如使用 ESP32作为微控制器或与 Arduino 一起读取 FDC1004全部四个通道的电容值? 与涉及电容读数和最终转换公式应用(包括负/正值差异和二进制补码转换)的任何情况类似。 我找不到任何在线,但如果你能帮助我发送一些他们,他们将是非常有用和感激,谢谢。

    4.在与(+ Coffset)相关的部分的转换公式中、我应该在代码开头添加定义为常量 int 变量的初始偏移(例如、int offset = 15;)、还是应该考虑从 capdac 开始获取的值。 考虑到" int capdac = round (offset / 3.125);"、新的 coffset 将为" int coffset= round (capdac * 3.125);"。 哪一个是正确的、会增加失调电压或 Coffset?

    5.如果我理解正确、增加初始偏移(因此增加了 capdac 值)会增加我可以读出的电容值。 例如:
    - offset=10 -->允许我读取电容(-5至25 pF)
    - offset = 15-->允许我读取0到30pF 的电容
    - offset = 30-->允许我读取15到45 pF 的电容
    -直到 Coffset 为96.875pF 且 capdac 值为11111=31。
    是这样吗? 在这种情况下、我的可读值范围应向前移动与偏移增加成比例的若干位置、但这不会发生。

    6. 我的最终电容器值应该是哪种类型的变量? 是否可以使用以下转换公式以这种方式对其进行定义? 按最小数量对其进行更改会更改以下所有内容:
    双 CAP=(c/524288.0)+偏移;

    我很快就会向您发送 Excel 和示例、我无法读出任何正确的值。

    此致、

    乔纳森

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

    Jonathan、您好!

    1. 屏蔽最好确保只有适当的位数、但如果它分配到32位变量中、可能会导致负数不显示为1。 例如、如果您有-657 (可由12位表示)作为16位数(方便键入)、则为:1111 1101 0110 1111。 如果你将其掩码为一个12位的数字、但你的变量仍然是16位、它将变为0000 1101 0110 1111。 这会导致它仍然是一个负12位数字、但我的16位变量不再自动将其识别为负数。
      1. 我建议在掩码前后打印出您的数字的按位或十六进制代码、以了解您的代码中是否发生了这种情况。 然后、您可以确定是否需要手动执行二进制补码。  
    2. 我不知道您的设置为什么会发生这种情况。 当您发送这些文件时、我会查看这些 Excel 文件、希望您能更好地理解这些文件。  
    3. 我们没有任何 ESP32或为此器件使用 Arduino 的示例。 我们 必须分享的所有开发都围绕 FDC1004EVM 和 GUI。  
    4. Coffset 会更精确。 您需要的是器件实际用于偏移测量值的值、而不是目标值。  
    5. 是的、这种理解是正确的。  

    请在 Excel 准备就绪后通知我、以及此后是否还会出现任何其他问题。  

    此致、  

    贾斯汀·比格尔

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

    大家好、Justin、

    这里是我们客户的最新情况。

    很抱歉尚未重放、我仍在处理 Excel 文件。 我会在一周结束前将其发送给您。 我有其他工作优先事项重叠。

    同时、可否请您是否可以使用其他 T.I.部件来代替 FDC1004?
    具体而言、我是否可以将 FDC2214用于相同的用途? 还是仅适用于范围过大的接近传感器?

    如何使用 LDC2114或 LDC1314等电感数字转换器以基于谐振的方法从电感读回电容? 这也是可能的吗? 在最后一种情况下、您是否有相关示例?

    此致、

    乔纳森

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

    Jonathan、您好!  

    由于 EMI 存在问题、我们不建议在大多数设计中使用 FDC2214。 FDC1004的内置屏蔽驱动器有助于缓解这些问题。  

    对于 LDC 产品、对于感应区域中的任何移动金属、对传感器的任何电容效应都将非常小。 因此、如果传感器附近有任何金属、则很难持续测量电容影响。 我们不建议将它们比 FDC1004用于电容式感应。  

    当 Excel 文件准备就绪时、告诉我、并且希望我们能够解决您在使用 FDC1004时遇到的问题。  

    此致、  

    贾斯汀·比格尔

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

    大家好、Justin、

    再次感谢您的支持。

    以下是客户的更新:

    在附件中、您可以找到一个文件夹、其中包含我用于测试的 sketch、即我在不同通道中针对不同初始偏移获取的不同电容值的 Excel 文件。 为简单起见、我在通道1和2中添加了一个10pF 电容、将其他电容留空。 我还添加了几张截图、其中显示了草图的一些相关部分以及我面临的问题:
    -"2comp_passage"->用于二进制补码的公式。 我检查 C 值的位[31]是1还是0。 如果为1 (负)、我将只执行屏蔽以保存24位。 如果它为0 (pos)、我将同时执行掩码和二进制补码。 我现在的问题是、如果我发现值为负数(位置31为1)、是否需要在位置23处添加"1"。
    -"bit_problem/example"->打印出二进制文件后,我意识到在一些段落中(随机),msb 和 lsb (因此 c 值)被错误地组合,对从 FDC 读取的4个8位元素执行了移位操作。

    e2e.ti.com/.../ESP32_5F00_FDC1004.zip

    此致、

    乔纳森

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

    Jonathan、您好!  

     有关电子表格的一些问题:  

    • 基准值是否在代码的二进制补码部分之后?  
    • 基线未连接到传感器引脚是否正确?  
    • 在对 Excel 工作表进行任何处理之前、是否可以添加寄存器读取的相应二进制值?
      • 如果您仍在努力解决将 C_DATA 数组与 MSB/LSB 的组合问题、则可以将 C_DATA 值添加到4个不同的卷积中

    此致、  

    贾斯汀·比格尔

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

    大家好、Justin、

    以下是客户的回答。

    -基线值是我在最后读的,已经在二进制补码之后和转换公式之后,以使值到 pF。
    -基线是我得到什么,如果没有传感器引脚连接,它改变不同的初始偏移,但不是以线性方式。
    -我会将二进制值添加到 Excel 工作表并将其返回给您。

    下面是我身边的几个问题、Pelase:
    -我什么时候必须做二进制补码呢? 仅在正值的情况下?
    -你的意思是,对于 MSB/LSB 我只能在4个不同的列中添加 C_DATA 值? 您的意思是这样的:C =(c_data[0]<< 16)+(c_data[1]<< 8)+ c_data[2];? 甚至不同呢?

    更准确地说、使用字节的问题可能与使用的变量类型和移位有关、原因也如您在前面的屏幕截图中所见。 二进制补码之前的 msb/lsb 和 c 值不对应于读取后被移位的4个字节。

    请注意、Excel 文件中的所有电容值都是在使用以下公式转换为 pF 后得到的:
    双 CAP =(c/524288.0)+ Coffset;

    谢谢你。

    此致、

    乔纳森

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

    Jonathan、

    你知道,贾斯汀在几天没有工作。

    我会通读这个话题,并由 COB 在星期一回复, .

    约翰

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

    Jonathan、

    我对您的问题没有任何有用的建议或答案。
    Justin 明天应该可以提供一些反馈。

    约翰

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

    Jonathan、您好!  

    使用 Swtick 到"int32_t"变量类型时、我不确定您是否需要执行二进制补码。 正如位问题图像中所示、MSB 和 LSB 寄存器的组合何时不正确很难说。  

    您认为对于 MSB/LSB,我只需在4个不同的列中添加 C_DATA 值,这是什么意思? 您的意思是这样的:C =(c_data[0]<< 16)+(c_data[1]<< 8)+ c_data[2];? 或甚至不同的?

    我建议您在 Excel 工作表中为 c_data[n]创建4个新列、而不是先将它们合并或处理它们。  

    此致、  

    贾斯汀·比格尔

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

    大家好、Justin、  

    希望您仍然可以支持该线程。 客户在一个月后回复。

    我正在使用两个 FDC1004从总数为5到8个的纺织传感器读取数据、从两个 FDC 读取时、串扰效应。 我使用的是 ESP32-mini-1。 这只会通过物理纺织传感器发生、而不会通过恒定电容发生。 如果我仅从 f1st FDC (连接到默认 I2C 引脚21-22)中读取4个通道、我就不会遇到任何问题。 但是、一旦我添加第二个 FDC 的通道(引脚33-32)、两个 FDC 的所有通道都将开始产生振荡噪声。 您能帮助我解决这个问题吗? 我应该在物理上屏蔽传感器还是在固件中执行某些操作? 当我不读取 FDC 时、是否有办法可以开启/关闭其中一个 FDC、以便它们不会同时打开?

    希望得到您的良好响应。

    -标记

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

    Mark、您好!  

    借助 FDC1004、您可以使器件在返回待机模式之前仅进行一次测量。 您可以通过将 FDC 配置寄存器的 REPEAT 位设置为0来执行此操作:  

    这样、您可以一次在一个 FDC 上启动测量、以防止发生串扰。  

    此致、  

    贾斯汀·比格尔