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.

[参考译文] BOOSTXL-PGA460:多个器件的高分辨率回波波形

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

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/1235629/boostxl-pga460-high-resolution-echo-waveform-with-multiple-devices

器件型号:BOOSTXL-PGA460
主题中讨论的其他器件:PGA460ENERGIA

你(们)好!

我们正在研究通过各种器件实现的超声衰减。 我们发现、由于传输脉冲的距离很短、在双静态模式下、传输线和接收线之间存在一些电容、因此我们可以在波形一开始看到信号尖峰、这种情况掩盖了信号。 根据我们的理解、这不应该出现、在观察与换能器连接的示波器时、我们看不到尖峰。 有关此尖峰的示例、请参阅下图:

为了解决这一问题、我们购买了另一个 PGA460板来将超声波脉冲的传输与接收分开、从而消除电容问题。 但是、我们也需要可通过在数据监控页面上选择 DSP - LP Filter On Graph Mode 获得的高分辨率数据。

在使用 UART 和从 BusDemo Energia 草图中工作时、这似乎并不容易实现。 我看到过使用 SPI 来获取数字化 ADC 信号、然后做我们自己的 DSP、 但我不太擅长电子学、在想我们能否获得一些指导来了解如何使用一个 PGA460板传输信号、并使用一个 PGA460板接收信号、从而获得高分辨率 ADC 波形。

感谢您提供的任何帮助

插孔

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

    您好、Jack:  

    感谢您在传感器论坛发帖!

    为了消除在信号开始时看到的尖峰、您需要额外的 PGA460、所以这样做是正确的。 此处的问题并不是真正的电容问题、而是在脉冲命令期间从驱动电路耦合到返回电路中的内部噪声、因此它不是电路板设计所固有的、而只是部件本身内部的噪声。 与单静态系统相比、尖峰降低了、但不等于理想双静态系统中的尖峰。

    您提到的上述更高分辨率的数据称为"直接数据突发"、这是可以在使用 DP_MUX 寄存器控制的数字信号路径的各个点从器件中提取的原始数字数据、请参阅下图:

    您仍可以使用标准 UART 命令器件执行测量、但请注意、UMR 命令5在此模式下无效。 仅通过 USART 收集突发数据、因此无法使用 UART 收集这些数据。 原因是该模式需要时钟引脚上的时钟、若要在直接数据突发期间获取数据、所有数据将在 TXD 引脚上输出。 请记住、CLK 引脚用于提供时钟脉冲、直到所有数据都已发送并将所有数据进行传递、USART 帧中没有起始或停止、它们本质上都是数据帧、直到您在最后接收到校验和。 数据包在8位段中以 LSB 的形式传输到 MSB。 需要注意的一点是、USART 没有启用或禁用  

    安装两个 EVM 应该不会太困难、因为您可以对每个板使用相同的通信线路进行寻址、因此您可以更改每个器件上的地址。 您可以将一个器件设置为突发、另一个器件设置为监听、您需要通过 Energia 执行此操作、因为 GUI 不支持此操作。 我们正努力在 GUI 上实现此目标、因此您可能会看到一些相关选项、但此操作从未完成、因此设置会使 GUI 崩溃。

    希望这对您有所帮助!

    此致!

    艾萨克

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

    尊敬的 Isaac:

    谢谢你这么快的答复。 我想我明白您关于如何获取直接突发数据的看法、但我仍然不十分清楚如何在代码中实现这一点。

    您是否有可能为我提供一些有关如何接收完整数据突发的代码提取?

    插孔

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

    嘿 Jack、

    我无法在 GUI 上找到用于此函数的代码、但我至少可以提供示波器捕获数据线中发生的情况。

    白色波形为 RXD、棕色为 TXD、红色为 CLK。 在这里、我们发送一个 BURST 和 LISTEN 命令以开始测量、我们开始以8位块运行时钟:

     

    在这段时间内、需要运行时钟并从 TXD 引脚收集数据、因此、您首先应该会看到大量零、但最终会开始接收数据、如下所示:

    收集数据的时间长度取决于在传感器上配置的记录长度。 数据完成后、您会看到 TXD 引脚下拉至零并保持不变。 在我们的代码中、时钟运行时间比所配置的记录窗口稍长、仅为了确保收集到每个数据位。 这是另一个捕获。

    此致!

    艾萨克

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

    尊敬的 Isaac:

    感谢您的答复。 不过、我仍然非常不确定如何将其转换为可以在 Energia 上运行的代码、以便获取完整波形。 如上所述、我真的不具备电气知识、因此示波器捕获让我更加困惑!

    我可以在 Energia 库的 PGA460_USSC.cpp 文件中看到、存在通过 SPI 进行的通信-这是您讨论 USART 时的意思吗?

    您是否知道如何从此代码轮询 TXD 引脚?

    真的很感谢你的帮助-这个区域不是我的专长!

    插孔

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

    您好、Jack:

    纠正 Energia 库已有支持 USART 的配置、在该库上标记为 SPI 通信。 您只需要以正确的模式初始化器件。 例如在 GetDistance 示例中,您将看到名为  initPGA460()的函数;但函数中没有任何参数。

    如果您转到 PGA460_USSC.cpp 文件、您可以确切地看到该函数的作用、请参阅下面的屏幕截图、但其中一个参数用于通信模式、一个参数用于 UART 地址更新。 这意味着、如果您希望保持 UART 地址不变、则需要为 SPI 或 USART 通信模式发送3和0。

    我认为、在函数  pullEchoDataDump (byte element)中可以看到对如何采集大量数据进行类似比较。 这会从由 MCU 采样的回波数据转储中输出128字节的数据。 在直接数据突发选项中、与单次读取相比、收集的数据量更大。 数据量主要取决于记录窗口的长度、但在执行此 pullEchoDataDump 示例之后、您可以对收集进行建模。 查看 SPI、其中、comm=3。

    希望这对您有所帮助!

    此致!

    艾萨克

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

    尊敬的 Isaac:

    谢谢您的支持-我今天就来试试。 我曾经反复查看过这段代码、但我的印象是 pullEchoDataDump 函数只能从 PGA460电路板的内部存储器中采样128个字节的数据、 并且这可以在发送超声波命令后的任何时间点完成。

    对于直接数据突发、我是否应该尝试以类似的方式提取数据? -我看到 SPI 通信模式使用函数 spiMosiIdle 来实现这一点。 同样、我认为是从内部存储器中提取数据、而不是像以前建议的那样直接从 TXD 线路读取。  

    我想再说明一下,我多么感谢你的帮助-已经非常有用!

    插孔

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

    您好、Jack:

    轻微校正、我意思是 pullEchoDataDumpBulk。 稍微正确一点、pullEchoDataDumpBulk 函数对存储在内部 PGA460存储器中的128个字节的数据进行采样、但像直接数据模式一样、这些数据都通过 TXD 引脚传递到 MCU。 如前所述、这两者之间的主要区别是回波数据转储是在测量命令完成后请求的、但一旦您发送突发和监听命令、就会收集直接数据、因此必须立即收集数据。  

    因此、您的函数将与 pullEchoDataDumpBulk 公式不同、因为如果没有函数的这一部分、您就不必请求基本上已经删除的数据、并且一旦请求突发、基本上就会开始收集。

    else if (comm == 3) // SPI
    	{
    		// run read bulk transducer echo data dump command on first iteration
    		byte buf7[3] = {syncByte, TEDD, calcChecksum(TEDD)};
    		spiTransfer(buf7, sizeof(buf7));
    		// MOSI transmit 0xFF to pull MISO return data
    		spiMosiIdle(129);
    		for(int n=0; n<128; n++)
    		{			
    		   bulkString = bulkString + "," + misoBuf[n];		   
    		}
    		return bulkString;

    编写函数的一些提示:

    由于 SPI 仅在直接数据模式下工作、因此可以将您创建的函数设置为在 PGA460未配置为 SPI 模式时返回错误。 这不是必需的、但具有它可能会很好。

    不需要 byte buf7[3]和 spiTransfer()行,因为它们将命令发送到设备以传递批量数据,并由 MCU 执行。

    如上所述、spiMosiIdle 函数只会强制 MCU 通信线路处于高电平、以允许数据从 PGA460流向 MCU 并收集该数据。 值129是预期的字节数、因此该数字需要更大才能容纳所有数据。

    n < 128的 for 循环值指示将读取多少个数据包。 这需要根据您的记录长度进行更改、因此此值与您在 spiMosiIdle 中输入的值密切相关。 请记住、使该值大于其所需值、因为始终可以对其进行微调、使其更小。 这将创建一个字符串、其值由 bulkString 中存储的逗号分隔、但如果更适合您、可以通过另一种方式重写该函数、以保存您的数据。 不过、这可能是转到 CSV 格式的一种简单方法。

    当然、您可以在函数开始时使用 ultrasonicCmd 函数发送测量命令。

    如果您有任何其他问题、请随时帮助告知我!

    此致!

    艾萨克

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

    尊敬的 Isaac:

    好的、有些进展-我通过 SPI 协议进行通信-但在触发 P1突发和监听命令后、我只会得到0 (或者从技术上讲、如果下面的代码只是0、那么不会打印)离线!

    下面是我创建的用于触发突发和记录直接数据突发的代码:

    /*------------------------------------------------- runEchoDirectDataBurst -----
     |  Function runEchoDirectDataBurst
     |
     |  Purpose:  Runs a preset 1 or 2 burst and or listen command to capture the full direct data burst.
     |
     |  Parameters:
     |		preset (IN) -- determines which preset command is run:
     |			• 0 = Preset 1 Burst + Listen command
     |			• 1 = Preset 2 Burst + Listen command
     |			• 2 = Preset 1 Listen Only command
     |			• 3 = Preset 2 Listen Only command
     |			• 17 = Preset 1 Burst + Listen broadcast command
     |			• 18 = Preset 2 Burst + Listen broadcast command
     |			• 19 = Preset 1 Listen Only broadcast command
     |			• 20 = Preset 2 Listen Only broadcast command
     |
     |  Returns:  comma delimited string of all direct data burst values
     *-------------------------------------------------------------------*/
    void pga460::runEchoDirectDataBurst(byte preset)
    {
    	if (comm == 3) // SPI
    	{
    		// enable Echo Data Dump bit
    		regAddr = 0x40;
    		regData = 0x80;
    		byte writeType = SRW; // default to single address register write (cmd10)
    		if (preset > 16)	  // update to broadcast register write if broadcast TOF preset command given
    		{
    			writeType = BC_RW; // cmd22
    		}
    
    		byte buf10[5] = {syncByte, writeType, regAddr, regData, calcChecksum(writeType)};
    		spiTransfer(buf10, sizeof(buf10));
    		// delay(10);
    
    		// run preset 1 or 2 burst and or listen command
    		pga460::ultrasonicCmd(preset, 1);
    
    		// disbale Echo Data Dump bit
    		regData = 0x00;
    		buf10[3] = regData;
    		buf10[4] = calcChecksum(writeType);
    		spiTransfer(buf10, sizeof(buf10));
    
    		// Read out full amount of data
    		readFullDirectDataBurst();
    	}
    	else
    	{
    		// do nothing
    	}
    	return;
    }
    
    /*------------------------------------------------- readFullDirectDataBurst -----
     |  Function readFullDirectDataBurst
     |
     |  Purpose:  Bulk read out all bytes of the direct data burst from the latest burst and/or listen command.
     |		This is only valid for SPI mode, and must be performed directly after a burst and/or listen command,
     |		as there is no storing of the signal on the PGA460 board.
     |
     |  Parameters:
     |		none
     |
     |  Returns:  comma delimited string of all direct data burst values
     *-------------------------------------------------------------------*/
    void pga460::readFullDirectDataBurst()
    {
    	if (comm == 3) // SPI
    	{
    		// run read bulk transducer echo data dump command on first iteration
    		// byte buf7[3] = {syncByte, TEDD, calcChecksum(TEDD)};
    		// spiTransfer(buf7, sizeof(buf7));
    		// MOSI transmit 0xFF to pull MISO return data
    		spiMosiIdleFullData(16000);
    	}
    	else
    	{
    		// do nothing
    	}
    	return;
    }
    
    /*------------------------------------------------- spiMosiIdleFullData-----
     |  Function spiMosiIdleFullData
     |
     |  Purpose:  Forces MOSI of 0xFF to idle high master output, while
     |			MISO pin returns all direct data burst values
     |
     |  Parameters:
     |		size (IN) -- number of MISO data bytes expected from slave
     |
     |  Returns: none
     *-------------------------------------------------------------------*/
    void pga460::spiMosiIdleFullData(byte size)
    {
    #ifdef EnSPI
    	// memset(misoBuf, 0x00, sizeof(misoBuf)); // idle-low receive buffer data
    	digitalWrite(SPI_CS, LOW);
    	while (true)
    	{
    		digitalWrite(SPI_CS, LOW);
    		// misoBuf[i] = usscSPI.transfer(0xFE);
    		misoValue = int(usscSPI.transfer(0xFE));
    		if (misoValue != 0)
    		{
    			Serial.println(misoValue);
    		}
    		digitalWrite(SPI_CS, HIGH);
    	}
    	digitalWrite(SPI_CS, HIGH);
    	return;
    #endif
    }

    我在标准 initBoostXLPGA460 ()和 defaultPGA460 ()之后从 Energia sketch 中像这样触发此函 数:

    void loop() {
      Serial.println("Getting data:");
      Serial.println(ussc.runEchoDirectDataBurst(edd-1));
      delay(5000);
    }

    没有太多的运气!

    SPI 线路只产生0。 我目前怀疑我需要向 PGA460发送命令、以便触发它在 SPI 线路上发送正确的数据、但我不知道如何操作。 我还认为将 test_mux 寄存器设置为0x01 (要发送的数字 LP 滤波器的值)可能是值得的,我曾尝试在 defaultPGA460 ()中执行此操作,如下所示,但也不幸运:

    	if ((comm == 0 || comm == 2 || comm == 3) && (comm != 6)) // USART or OWU mode and not busDemo6
    	{
    		byte buf12[59] = {syncByte, EEBW, USER_DATA1, USER_DATA2, USER_DATA3, USER_DATA4, USER_DATA5, USER_DATA6,
    						  USER_DATA7, USER_DATA8, USER_DATA9, USER_DATA10, USER_DATA11, USER_DATA12, USER_DATA13, USER_DATA14,
    						  USER_DATA15, USER_DATA16, USER_DATA17, USER_DATA18, USER_DATA19, USER_DATA20,
    						  TVGAIN0, TVGAIN1, TVGAIN2, TVGAIN3, TVGAIN4, TVGAIN5, TVGAIN6, INIT_GAIN, FREQUENCY, DEADTIME,
    						  PULSE_P1, PULSE_P2, CURR_LIM_P1, CURR_LIM_P2, REC_LENGTH, FREQ_DIAG, SAT_FDIAG_TH, FVOLT_DEC, DECPL_TEMP,
    						  DSP_SCALE, TEMP_TRIM, P1_GAIN_CTRL, P2_GAIN_CTRL, EE_CRC, EE_CNTRL, BPF_A2_MSB, BPF_A2_LSB, BPF_A3_MSB,
    						  BPF_A3_LSB, BPF_B1_MSB, BPF_B1_LSB, LPF_A2_MSB, LPF_A2_LSB, LPF_B1_MSB, LPF_B1_LSB, TEST_MUX, calcChecksum(EEBW)};
    
    		if (comm == 0 || comm == 2) // UART or OWU mode
    		{
    			Serial1.write(buf12, sizeof(buf12)); // serial transmit master data for bulk EEPROM
    		}
    		if (comm == 3) // SPI mode
    		{
    			spiTransfer(buf12, sizeof(buf12));
    		}
    		delay(50);

    奇怪的是、当我将板连接到 GUI、进行刷写、使其进行 LP 滤波器模式回波形、然后 上传 Energia sketch 时、我确实得到了一些下行值。 非常奇特

    有什么建议吗? 在 GUI 中进行代码提取是一件令人惊异的事情、尽管我相信你说你找不到它。 希望我和您的辛勤工作将使未来也想做类似事情的人受益!

    插孔

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

    嘿 Jack、

    我今天未能查看您的回答、但让我看看我是否能找到 PGA460 EVM 的代码、以便了解我能否为您提供这些答复。 我将在周一回到您的身边。

    此致!

    艾萨克

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

    尊敬的 Isaac:

    谢谢-我很感激  

    插孔

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

    您好、Jack:

    我找到了 GUI 固件的源代码、但代码不是以可读性很好的方式编写的、因此很难弄清楚代码中到底发生了什么。 我认为最好是通读已开始的 Energia sketch。

    我在查看上面的第一块代码时注意到了一些问题:

    1.我看到您在 EE_CNTRL 寄存器中启用了数据转储。 我们不使用此模式、因此不需要设置值并将其写入器件的代码行。  在执行命令7指令之前、数据转储不会提供数据、但这将只提供128个字节。

    2.我没有看到任何 DP_MUX 配置来选择数据多路复用器输出。 这是寄存器0x4B 的前三位。 如果未配置该设置、器件将不会进入直接数据突发模式。 这就是为什么通过 SPI 线路只拾取零点的原因。 在发送 pga460::ultrasonicCmd (预设,1)之前,请输入此配置;

    3.删除直接数据突发禁用代码,因为该代码永远不会启用。

    将 TEST_MUX 设置为0x01会将 AFE 输出直接输出到 TEST 引脚、因此这不是您在系统中寻找的工作模式、因此请确保将此配置回零。 希望这将产生比以前更好的结果。

    此致!

    艾萨克

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

    尊敬的 Isaac:

    不幸的是,仍然没有运气。

    1.我禁用了 EE_CNTRL 地址中的数据转储位。

    2.我认为 TEST_MUX 和 DP_MUX 信息存储在0x4B 的同一地址。 我已尝试仅将 DP_MUX 设置为0x01至0x04、以及各种其他组合。 查看下面的照片:

    3.我不确定你在这里提到的代码是什么。

    我设法更好地理解了代码、现在可以可靠地从寄存器中写入和读取;但是、我仍然得不到我需要的数据。 我已经从  pga460:ultrasonicCmd (preset、0)函数中删除了任何延迟、现在我从 SPI 行中得到一些东西:64、0、0191、0、 0、0、...、 但在191之后、它无限期地为0。 我认为这可能只是对超声 Cmd 功能的反应。

    以下是我更新后的代码。 请注意、我正在循环遍历多个值以设置 DP_MUX/TEST_MUX 寄存器以使其正常工作、但未成功完成:

    void pga460::runEchoDirectDataBurst(byte preset)
    {
    	if (comm == 3) // SPI
    	{
    
    		// Set DATA_MUX register to allow for Direct Data Burst:
    		// 0x01, 0x02, 0x03, 0x04, 0x09, 0x0A, 0x0B, 0x0C, 0x81, 0x82, 0x83, 0x84, 0xA1, 0xA2, 0xA3, 0xA4
    		byte dataMuxVals[16] = {0x01, 0x02, 0x03, 0x04, 0x09, 0x0A, 0x0B, 0x0C, 0x81, 0x82, 0x83, 0x84, 0xA1, 0xA2, 0xA3, 0xA4};
    		regAddr = 0x4B;
    		// regData = 0x01;
    		for (size_t i = 0; i < 8; i++)
    		{
    			Serial.print("DATA_MUX Value = ");
    			Serial.println(dataMuxVals[i]);
    
    			registerWrite(0x40, 0x00);
    			delay(10);
    			registerWrite(regAddr, dataMuxVals[i]);
    			delay(10);
    
    			Serial.println("Value written.");
    
    			Serial.println("Reading value back.");
    
    			pga460::registerRead(regAddr);
    
    			Serial.println("Sending ultrasound command");
    
    			// run preset 1 or 2 burst and or listen command
    			pga460::ultrasonicCmd(preset, 0);
    
    			// Read out full amount of data
    			readFullDirectDataBurst();
    
    			pga460::registerRead(regAddr);
    
    			Serial.println("Data received, restarting.");
    
    			delay(1000);
    		}
    
    		Serial.println("Done.");
    	}
    	else
    	{
    		// do nothing
    	}
    	return;
    }
    
    
    void pga460::readFullDirectDataBurst()
    {
    	if (comm == 3) // SPI
    	{
    		unsigned long length = 1000000;
    		spiMosiIdleFullData(length);
    	}
    	else
    	{
    		// do nothing
    	}
    	return;
    }
    
    
    void pga460::spiMosiIdleFullData(unsigned long size)
    {
    #ifdef EnSPI
    	// memset(misoBuf, 0x00, sizeof(misoBuf)); // idle-low receive buffer data
    	digitalWrite(SPI_CS, LOW);
    	for (unsigned long i = 0; i < size; i++)
    	{
    		digitalWrite(SPI_CS, LOW);
    		misoValue = int(usscSPI.transfer(0xFF));
    		if (misoValue != 0)
    		{
    			Serial.print(i);
    			Serial.print(", ");
    			Serial.println(misoValue);
    		}
    		digitalWrite(SPI_CS, HIGH);
    	}
    	digitalWrite(SPI_CS, HIGH);
    	return;
    #endif
    }

    如果我可以通过某种方法浏览相关的 GUI 代码、我可以尝试对我应该执行的操作提供一些说明。 否则,我不知道什么会出问题!

    插孔

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

    您好、Jack:

    如果您可以向我发送一个朋友请求、以便我们可以通过私人消息进行交谈。

    此致!

    艾萨克