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.

[参考译文] ADS131E08:定制采样率在数据中包含零

Guru**** 2393725 points


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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/776355/ads131e08-custome-sample-rate-contains-zeros-in-the-data

器件型号:ADS131E08

您好!

我想使用自定义采样率从该 ADC 采集数据、因此我已将 STM32计时器设置为每秒触发12800个样本、并将其输出连接到 START 引脚信号。 此外、我已将 DRDY 信号连接到 MCU 中配置为下降沿中断的外部引脚之一、当中断触发时、我只需使用 RDATA 命令读取 ADC 数据值、 但这种方法的问题是、在某些样本中、我的数据为零、这是使用 MATLAB 捕获的数据的屏幕截图、  

这是我的主循环代码  

//复位 ADC
HAL_GPIO_WritePin (GPIOA、ADC_RST_Pin、GPIO_PIN_RESET);
HAL_DELAY (1);
HAL_GPIO_WritePin (GPIOA、ADC_RST_Pin、GPIO_Pin);


//在连续模式下启动 ADC
HAL_GPIO_WritePin (GPIOA、ADC=0x10000、ADC=0=0x43/ TX_Pin








、0x43_R2=0_Rx+[TX_Pin);//将0x43_Rx+TX_Rx_Rx_Rx_Rx+=0=0=12_Rx_Rx_Rx_Pin 写入0x43_Rx_Rx_Rx_Rx_Rx_Rx_Rx_Rx_Rx_Rx_Pin;//(0x4=0=0=0_Rx_Rx_Rx_Rx_Rx_Rx_Rx_Rx_R
//读取寄存器以验证
TX[0]= 0x23;//读取 CONFIG3寄存器
TX[1]= 0x00;//要读取的寄存器数= 1
TX[2]= 0x00;//
adc_sendCommand (TX、Rx、3);

TX[0]= 0x41;//Wrtie 1
TX[1]= 0x00;//将 ADC_sendCommand (TX、Rx、3)设置
为0x00
;//将时钟值设置为0xd2;//将 TX[0]配置为1sreg1;//将其写入到 s/segr2;//

TX[0]= 0x42;//Wrtie config2寄存









器 TX[1]= 0x00;//要写入的寄存器数= 1 TX[2];//要写入的值 ADC_sendCommand (TX、Rx、3);TX[0]= 0x46;//rendie CH2 TX[1]= 0x00;//
要读取

的 ADC=0x2;tx2 (tx2);tx2 (tx2 = 0x2);tx2 (tx2 = 0x2;tx2;tx2 (要读取的 tx2;tx2)

TX[0]=0x44;//将 fualt Reg
TX[1]=0x00;//要读取的寄存器数= 1
TX[2]=0x00;//
adc_sendCommand (TX、Rx、3);

TX[0]=0x4D;//将 Unknown1寄存器
TX[1]=0x00;//将 TX[0]=0x4e=2











;tc[0]/ unr=0x4e[2;tc=0=0[0]TX[0]= 0x4e[0]= 0x4e[0]/ r/2];tc=0[0=0[0]TX_reg = 0x4e[0]2;tc=0x4e[0]/ un/un/r=0x4e[0]2;tc=0=0=0]2;tc=0=0[0]2;tc=0[tc=0=0]2;tc=0=0[tc=0=0=0=0]2;tc=0=0=0=0[tc=0

TX[0]= 0x50;//写入 Unknown4寄存
器 TX[1]= 0x00;//要读取的寄存器数= 1
TX[2];//
adc_sendCommand (TX、Rx、3);

TX[0]= 0x51;//写入 Unknown5寄存器
TX[1]= 0x00;// adc_sendCommand (TX、Rx、3);tx[0]= 0x1;

tc_end1;
tc[TX

= 0x00;tc=2;tc_sendrx (TX = 0x1、tc1、tc1;tc1、tc1、tc1、tc1、tc1、tc1、tc1、tc1、tc1、tc1;tc

//sample = 12800且我们的时钟为84MHz、因此将时间设置为128Hz
HAL_TIM_Base_Start_IT (&htim1);
HAL_TIM_PWM_Start (&htim1、TIM_CHANNEL 1);
TIM1->ARR=77;
TIM1->CCR1 = 39;
HAL_GPIO_WritePin、GPIO_RESET_Pin;GPIO_Pin //起始= 0
HAL_GPIO_WritePin (GPIOA、ADC_CS_Pin、GPIO_PIN_RESET);// CS = 0

ADC_READY=0;
Start_CAPTURE=0;

while (1)
{

if (Start_CAPTURE)
{
Start_CAPTURE=0;
HAL_GPIO_WritePin (GPIOA、ADC_START_Pin、GPIO_Pin、1)}/设置引脚


if (adc_ready){

ADC_READY=0;
TX[0]= 0x12;//RDATA 命令
for (int g=1;g<28;g++)
{
TX[g]=0;
}
HAL_SPI_TransmitReceive (&hspi1、TX、Rx、28、100);
HAL_GPIO_WritePin (GPIOA、ADC_START_Pin、GPIO_PIN_RESET);//开始= 0

adcBuf[i]=(Rx[7]<< 24)|(Rx[8]<< 16)|(Rx[9]<< 8)| 0x00;
adcBuf[i]/= 256;

}

}

ANS 这是我的外部中断代码

void EXTI3_IRQHandler (void)
{
//用户代码 begin EXTI3_IRQn 0 *//

//*用户代码 end EXTI3_IRQn 0 */
HAL_GPIO_EXTI_IRQHandler (GPIO_PIN_3);
//用户代码 begin EXTI3_IRQn 1 */
ADC_READY=1;
//*用户代码 end TI3
}* 

这里是我的计时器中断代码

void TIM1_UP_TIM10_IRQHandler (void)
{
//用户代码开始 TIM1_UP_TIM10_IRQn 0 */

//*用户代码结束 TIM1_UP_TIM10_IRQn 0 */
HAL_TIM_IRQHandler (&HTIM10);
//用户代码开始 TIM1_TIM10_IRQn
= TIM1*



= TIM10_IRQn 0 *= TIM1_TRIM10_TRIM10_TRIM10_TRIM0_TRIM0_TRIM0_TRIM_TRIM0_TRIM0_TOP0 *
****= TIM1_TRIM10_TRIM_TRIM10 

那么、缺少什么或做错了?

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


    我不确定数据流中有什么错误。 在一组256个数据中、您似乎得到了大约14个零。

    为了帮助进行调试、您能否从微控制器到 ADC 的通信中获得示波器或逻辑分析仪快照? 我想查看/CS、DIN、DOUT 和 SCLK。 如果您可以捕获器件的良好读数以及数据以零输出的另一个读数、这会很有帮助。 您还可以使用这些快照来验证是否满足正确的器件时序。

    我还想进一步解释一下您在与器件通信时使用的时序。 我没有从您提供的代码中获得有关计时的足够信息。


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

    尊敬的约瑟夫

    感谢您的反馈、遗憾的是、我只能访问模拟示波器、但我已将信号连接到 Spartan6 FPGA、并为您捕获了一些波形、我希望这将有所帮助、 此外、我已将 SPI 速度提高到8MHz、并更改了我 要共享的 SPI 命令的一点、现在的问题是我获得了零读出、但我已将输入连接到50Hz 正弦信号、 获得320个样本@ 16Ksps 后的输入信号不会形成全正弦波!!

    正如您看到的、没有全波周期!

    这是一个芯片范围输出文件、可从 gtkwave.sourceforge.net 通过 nwave 进行查看

    e2e.ti.com/.../ADC_5F00_ChipScope_5F00_File.zip

    我还将 Keil 项目与 STM32项目的所有源文件连接在一起、我希望这会有所帮助。

    e2e.ti.com/.../Rev2.0.rar

    此致

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


    这可能需要我一些时间。 我们在工作计算机上下载外部软件可能会受到限制、我可能需要一台备用计算机来测试此软件。

    在平均时间内、您更改了什么以删除数据中的零? 您显示的芯片示波器图看起来是28或29字节通信序列、二者之间存在一些间隙。 您在每个序列中发送的通信是什么?

    我会注意到、是的、16kSPS 的320个采样将产生一组20ms 的数据。 在50Hz 下、这将是正弦波的单周期。

    但是、您的数据图仅为260个样本。 虽然该正弦波仍然从50Hz 关闭、但这可能来自读取方法。 您如何知道何时读回数据? 您是否使用/DRDY 指示数据何时就绪? 看起来您是异步读取数据。


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

    我更改了 SPI 频率、并且在命令中前三个字节的每个命令字节之后添加了一个轻微的延迟。 此外、我已将 START 引脚连接到高电平、将 Cs 连接到低电平。

    我使用了 RDATA 命令、正如您在芯片插槽中看到的、它们是28字节命令。

     

    是的、该图是256个样本、因为我在计时器 ISR 中使用计时器每秒仅采集256次12800个样本、我还测试了完整的320个样本、与320个样本相同、 我在 MCU 中使用了 DRDY ISR 来捕获数据。

     

    我已经使用计时器 ISR 来实现数据的任意采样率读取! 我应该如何实现任意采样率!? 有可能吗?

     

    此外、如果我使用 DRDY ISR 使用16Ksps 等固定采样率、则320个数据样本中似乎没有全波周期。

     

    此致

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

    阿里

    我还没有机会下载软件、但我有一些东西可以尝试。 我认为您的问题来自从设备读取数据的方式。 当该器件进行转换时、/DRDY 指示将定期出现。 您的一篇帖子中有一篇已被削减:

    /DRDY 会定期发出。 我已经输入了周期性标记、以显示/DRDY 在何处变为低电平。 在这张图片中、未看到第三个 DRDY、我怀疑周期太短、无法让逻辑分析仪检测。 当在 SCLK 中计时并且您当时正在读取数据时、/DRDY 返回高电平。

    我认为需要发生的是、找到/DRDY 变为低电平、然后在/DRDY 返回低电平之前、时钟输出所有数据。 在您的图片中、我认为您会随着时间的推移而丢失一些数据、因为/DRDY 未同步到读取。 即使您使用的是 RDATA 命令、由于两次读取之间的时间太长、因此仍会丢失数据。

    这意味着您需要加快 SCLK 速度、或者减少24位读取或整体读取本身之间的时间周期。

    如果要使用任意采样率、我假设您希望以可编程数据速率以外的速率获取数据、则需要从更快的采样率开始、然后在需要时使用 START 命令开始转换。

    例如、假设您希望以10kSPS 的速率获得测量值(数据每100us 一次)。 最接近的数据速率为16kSPS (每62.5us 一次)。 这意味着您需要以16kSPS 的速率运行器件并每100us 运行一次 START 命令。

    您可以将 ADC 设置为16kSPS 运行。 然后发送 START 命令。 之后、需要62.5us 才能完成转换。 您需要在100us 之前读出所有这些数据、然后在最后一个 START 命令之后发送 START 命令以启动转换100us。 这样、ADC 以16kSPS 的速率运行、但 START 命令会中断 ADC 读取、以便每100us 输出一次数据(相当于10kSPS)。 我会先尝试这种方法。

    可以通过以下方式执行替代方法。 将器件设置为16kSPS。 之后每隔100us 发送一次 START 和 RDATA。 这组命令和数据读取应在启动后62.5us 之前完成。 我相信、数据将使用先前完成的读取进行缓冲、并且您仍然每100us (10ksps)获取一次数据。

    我现在将关闭此帖子。 如果您仍然遇到问题、请尝试两种方法并使用逻辑分析仪快照进行回帖。 如果这些不起作用、您将能够重新打开该线程。

    吴约瑟