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.

[参考译文] ADS131M08:连续数据读取

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1399837/ads131m08-continuous-data-reading

器件型号:ADS131M08
主题中讨论的其他器件: ADS131M04

工具与软件:

大家好、您好吗?

我对 ADS131M08的配置和数据读取有一些问题。 我使用这个 ADC 已经有很短的时间了、但是遇到了一些困难。 我相信我已正确配置了 ADC 以用于连续读数、但即使更改模拟输入值、我也看不到任何值(示波器上的位)变化。

我使用的是 ST 微控制器、到目前为止、我已经能够写入寄存器并读回它们以验证写入情况。 我设法通过命令而不是引脚将其复位。 我现在要执行连续数据读取。 我要更改模拟输入值并使用示波器监视 SPI 通信、但与模拟读数值相对应的帧不会改变。

我已将程序配置为在 AI1上只读取、而 ADC 发送的 SPI 字由10个帧组成、其中帧3至10是模拟输入、我不知道前两个帧代表什么。 请帮帮我。

void reset_ads (void)
{
HAL_SPI_Transmit(&hspi3, reset, 3, 100);

	int i = 0;
	int num_repeticoes = 9;
	
	while (i < num_repeticoes)
	{
		HAL_SPI_Receive(&hspi3, data_readed, 3, 100);
		
		data_readed[0] = 0b00000000;
		data_readed[1] = 0b00000000;
		data_readed[2] = 0b00000000;
		i++;
	}
}

void standby (void)
{
	uint8_t standby [3];

	standby [0] = 0b00000000;
	standby [1] = 0b00100010;
	standby [2] = 0b00000000;

	HAL_SPI_Transmit (&hspi3, standby, 3, 100);
}

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  MX_SPI3_Init();
  MX_UART4_Init();
  MX_UART5_Init();
  
  	pre_data [0] = 0b10100001;
	pre_data [1] = 0b10000000;
	pre_data [2] = 0b00000000;
	
	data_readed [0] = 0b00000000;
	data_readed [1] = 0b00000000;
	data_readed [2] = 0b00000000;
	
	reset [0] = 0b00000000;
	reset [1] = 0b00010001;
	reset [2] = 0b00000000;
	
	wrdata[0] = 0b01100001;
	wrdata[1] = 0b10000000;
	wrdata[2] = 0b00000000;
	
	clkreg [0] = 0b00000010;
	clkreg [1] = 0b01001110;
	clkreg [2] = 0b00000000;
	
	//--------------------
	
	reset_ads();
	HAL_Delay(1);

	//STAND-BY
	HAL_GPIO_WritePin (CS_ADS131M08_GPIO_Port, CS_ADS131M08_Pin, GPIO_PIN_RESET);
	standby();
	HAL_Delay(1);
	HAL_GPIO_WritePin (CS_ADS131M08_GPIO_Port, CS_ADS131M08_Pin, GPIO_PIN_SET);
	
	//CONFIGURAÇÃO DOS CANAIS DE LEITURA DO ADC EM 03H
	HAL_GPIO_WritePin (CS_ADS131M08_GPIO_Port, CS_ADS131M08_Pin, GPIO_PIN_RESET);
	HAL_SPI_Transmit (&hspi3, wrdata, 3, 100); //WRITE IN 03H
	asm("nop");
	HAL_SPI_Transmit (&hspi3, clkreg, 3, 100); //DATA 03H
	HAL_GPIO_WritePin (CS_ADS131M08_GPIO_Port, CS_ADS131M08_Pin, GPIO_PIN_SET);
	
	//WAKEUP ADC
	HAL_GPIO_WritePin (CS_ADS131M08_GPIO_Port, CS_ADS131M08_Pin, GPIO_PIN_RESET);
	HAL_SPI_Transmit (&hspi3, wakeup, 3, 100); //COMANDO WAKEUP
	HAL_GPIO_WritePin (CS_ADS131M08_GPIO_Port, CS_ADS131M08_Pin, GPIO_PIN_SET);
	
	HAL_GPIO_WritePin (CS_ADS131M08_GPIO_Port, CS_ADS131M08_Pin, GPIO_PIN_RESET);
	data_readed [0] = 0b00000000;
	data_readed [1] = 0b00000000;
	data_readed [2] = 0b00000000;
	
	while (1)
	{
		int i = 0;
		int num_repeticoes = 10;

		while (i < num_repeticoes)
		{
			HAL_SPI_Receive(&hspi3, data_readed, 3, 100);

			data_readed[0] = 0b00000000;
			data_readed[1] = 0b00000000;
			data_readed[2] = 0b00000000;

			i++;
		}
	}
}

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

    尊敬的 Felipe de Andrade:

    欢迎来到 E2E 论坛。 您是否试图说您每帧收到10个字(每个字24位)? 如果是、则第一个字是状态字、字2-9是通道数据、最后一个字应该是 CRC、请参阅下面 ADS131M08上的典型时序帧:

    您能否检查 REFIN 上的电压? 您似乎正在使用 while 循环、但未选中/DRDY 信号来检索数据、请确认。 您能否提供上面我刚才展示的时序图这样的时序图? 您是否将/SYNC/RESET 引脚连接至高电平(DVDD)?

    BR、

    戴尔

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

    您好、Dale

    是的、我接收到10个字、每帧24位。 但是、在论坛上这里发送消息后不久、我意识到我可以读取模拟输入、但输入信号高于我的参考信号、因此该值变饱和。 目前、我正在调整 ADC 通道1上0至1.25V 之间的电压。

    在上图中、两个较大的深蓝色信号是 DRDY 脉冲。 在这些脉冲之间、我有一个包含10个字(24位)的帧(黄色是时钟、浅蓝色是 MISO)。 在编程中、我通过发送命令0b00000010 01001110 00000000来配置03h 寄存器(时钟寄存器)、其中我在末尾填充8个零来完成24位(这是否正确?)。 根据数据表、该命令将通道1配置为启用、将其他通道配置为禁用。 那么、分析示波器上接收到的10个字、我有:(状态-??? CH0 - CH1 - CH2 - CH3 - CH4 - CH5 - CH6 - CH7)、其中只有 CH1具有读数、因为它是唯一启用的读数。 我想知道第二个字是什么、因为如果我启用 CH0、它是接收信号的第三个字。

    SYNC/RESET 引脚处于高电平、我的基准电压为1.25V。

    此致、

    Felipe。

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

    尊敬的 Felipe de Andrade:

    在命令末尾填入8个额外的零来 实现24位字是正确的、但您发送到 ADC 的命令"0b00000010 01001110 0000000000000000"不是写入03h 时钟寄存器的有效命令、正确的命令是0x61 80 00 +寄存器数据。 下面是使用0x0F0E 数据写入 CLOCK 寄存器的时序示例。 请注意、该时序是在 ADS131M04上捕获的、该 ADS131M08具有与 ADS131M08相同的时序、但只有4个输入通道。 您可以查看表8-11。 ADS131M08数据表中的图8-25所示为命令定义和时序。 因此、您的命令实际上并没有对时钟寄存器进行编程、也没有禁用通道。 您展示的时序是 ADS131M08器件的正确响应。

    BR、

    戴尔

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

    早上好、Dale!

    大家可能没有注意到、但我在发送我想保存在03H 的值之前、将发送写入03H 寄存器的命令。 我发送的第一条消息中的程序中对此进行了介绍。

        wrdata[0] = 0b01100001;
    	wrdata[1] = 0b10000000;
    	wrdata[2] = 0b00000000;
    	
    	clkreg [0] = 0b00000010;
    	clkreg [1] = 0b01001110;
    	clkreg [2] = 0b00000000;
    
    	//03H REG CONFIGURATION
    	HAL_GPIO_WritePin (CS_ADS131M08_GPIO_Port, CS_ADS131M08_Pin, GPIO_PIN_RESET);
    	HAL_SPI_Transmit (&hspi3, wrdata, 3, 100); //WRITE COMMAND 03H
    	asm("nop");
    	HAL_SPI_Transmit (&hspi3, clkreg, 3, 100); //DATA 03H
    	HAL_GPIO_WritePin (CS_ADS131M08_GPIO_Port, CS_ADS131M08_Pin, GPIO_PIN_SET);

    下面显示的论坛链接还演示了此操作是如何完成的:

    https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1369532/ads131m08-ads131m08-reading-single-register?tisearch=e2e-sitesearch&keymatch=ADS131M08#

    唯一的区别是、对于写入命令、我不对 CS 提供脉冲;我只需使用(asm ("NOP")命令等待一段时间、如上面链接中所示。 但是对于测试、我将程序重新上传到了 MCU、并且获得了与我在上一个回复中发送的结果相同的结果。

    BR、

    Felipe。

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

    尊敬的 Felipe:

    感谢您指出这一点。 您是否直接将/CS 接地? 如果是、则需要在每个帧中发送所有 SCLK 或字、因为 ADS131M0x ADC 通过计数不带/CS 信号的 SCLK 的数量来确定帧的结束和开始。 您是否读回了 CLOCK 寄存器以检查 WREG 命令是否已将数据成功写入寄存器? 如果您可以 使用逻辑分析仪捕获您的时序(如前两帧)、就像我在上面显示的时序一样、我可以仔细看一下。

    BR、

    戴尔

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

    您好、Dale! 我没有将 CS 引脚直接连接到 GND。 它连接到 MCU 的数字引脚。 我在时钟寄存器中查看是否保存了我发送的命令、一切都顺利。 在下图中、我对此进行了演示:

    在第一个24位帧中、我将写命令发送到寄存器03h (01100001 10000000 00000000)、然后我发送要保存在03h (00000110 01001110 00000000)中的内容。 完成这些步骤后、我向寄存器03h (10100001 10000000 00000000)发送了一个读取命令、并提供了一个变量、用于在03h 内收集数据、获取先前记录的数据(00000110 01001110 00000000)。 在各图中、黄线表示时钟、紫线表示 MOSI、蓝色线表示 MISO。

    BR、

    Felipe。

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

    尊敬的 Felipe de Andrade:

    Dale 现在不在办公室-您能告诉我现在出现了什么问题吗?

    看起来读取数据的问题已经得到解决(输入大于基准电压)、现在您正在正确地读取和写入寄存器(上一篇文章展示了时钟寄存器的情况)。 所以我不清楚您的问题是什么

    -Bryan

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

    您好、Bryan!

    很抱歉,最近几天一直很忙乱。 我现在的问题是了解 ADC 发送给我的帧中每个字的含义、正如我在给 Dale 的第一个响应中提出的问题。 我将再次在此处发布:

    "在上图中、两个较大的深蓝色信号是 DRDY 脉冲。 在这些脉冲之间、我有一个包含10个字(24位)的帧(黄色是时钟、浅蓝色是 MISO)。 在编程中、我通过发送命令0b00000010 01001110 00000000来配置03h 寄存器(时钟寄存器)、其中我在末尾填充8个零来完成24位(这是否正确?)。 根据数据表、该命令将通道1配置为启用、将其他通道配置为禁用。 那么、分析示波器上接收到的10个字、我有:(状态-??? CH0 - CH1 - CH2 - CH3 - CH4 - CH5 - CH6 - CH7)、其中只有 CH1具有读数、因为它是唯一启用的读数。 我想知道第二个字是什么、因为如果我启用 CH0、那么第三个字就是接收信号。"

    BR、

    Felipe。

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

    尊敬的 Felipe de Andrade:

    我已尝试重新创建您的代码、如下所示。 我将发送您对 REG 0x03进行写入的确切设置、以关闭除 ch0之外的所有通道

    我向 ch0施加了-0.5V 的电压、您可以看到我收到的十六进制值对应于-0.5V (假设 VREF = 1.2V 且增益= 1)

    您还可以从第二个图像中看到 CRC 计算是正确的

    您是否完全确定帧中的第三个字对应于 ch0?

    -Bryan

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

    早上好、Bryan。

    昨天、我对代码进行了分析和修改、并注意到了一些东西。 我在 while 循环中写入以接收12个字的数据、其中 ADC 提供状态寄存器和8个通道、总共9个字。 ADC 从我的帧开头复制了剩余的3个字、再次提供状态寄存器以及通道0和通道1、总共12个字。

    在下图的示例中、我总共收集了10个字、但 CRC 被禁用、因此我的 ADC 在我的帧中仅提供了9个字。 CS 脉冲之后传递的第一个字只是从 CH1垃圾复制、因为当我改变通道1的输入电压时、它一起变化。 如果我忽略它、我就准确地将状态寄存器作为第一个字、后跟8个通道、从而完成帧处理。

    BR、

    Felipe。

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

    尊敬的 Felipe de Andrade:

    过去两周、我离开办公室、感谢您的耐心等待

    那么、您的问题是否得到了解决? 您似乎在时钟移出错误的字数、导致数据不在预期范围内的问题。 既然您已经确定了该问题、那么问题已经得到解决。 是这样吗?

    -Bryan