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.

[参考译文] ADS1256:对于模拟正弦波、ADS1256输出不正确

Guru**** 2535150 points
Other Parts Discussed in Thread: ADS1256

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/868949/ads1256-ads1256-output-is-not-correct-for-analog-sine-wave

器件型号:ADS1256

您好!

我们带来了 ADS1256 ADC 模块 https://rarecomponents.com/store/1951 、并使用了该链接 https://github.com/adienakhmad/ADS1256中的库 以及使用 SPI 协议连接到 Arduino UNO 的电路板。

我在 单端模式下使用了 ADS1256_Basic_Switching_Channel.ino 代码并进行了一些修改、以从所有8个通道读取数据。 我在单端模式下以 ACOM 为基准测试了通道0。 第一个输入是电位计、该电位计由5V 电源供电、雨刮器端子连接到 Ch-0、串行监视器输出电压为0.00至4.84V、用于更换雨刮器。

其次、我施加了具有适当偏移电压的正弦波、以便在单端模式下测量、ADC 数据速率为7500sps、增益1。 串行绘图仪在正弦波随着频率的增加而失真后,可在1Hz 至5Hz 范围内正确打印该波形。

如果在 AIN0和 AIN1之间施加信号(无偏移电压的差分模式)、则会发生同样的情况、所使用的代码不同、串行绘图仪打印正弦波时会失真、但这次打印的频率为1Hz。 数据速率和增益保持不变。

问题是什么... 如何验证 ADS1256读取的信号频率? 对 ADS1256读取的信号执行 FFT 是否有任何选项? 此外、如何验证 ADS1256每秒读取的样本?

即时消息附加输出信号的代码和屏幕截图。

请帮助我解决这个问题。

//单端代码

//使用 ADS1256库的 Arudino 示例代码
//使用高效输入循环读取4个差动通道
//由 Adien Akhmad 编写,2015年8月
//由 Axel Sepulveda 编写的 Modfified 2019年1月,用于 ATmega328

#include 
#include 

浮点时钟 MHZ = 7.68;// ADS1256上使用的晶体频率
float Vref = 2.5;//电压基准
//初始化 ADS1256对象
ADS1256 ADC (clockMHZ、Vref、false); // RESETPIN 永久绑定到3.3V

//可变变量以存储传感器读数
sensor1 =连接到 AIN0 - AIN1
sensor2 =连接到 AIN2 - AIN3
sensor3 =连接到 AIN4 - AIN5
Sensor4 =连接到 AIN6 - AIN7
*/

float sensor1;


void setup ()
{
Serial.begin(9600);

serial.println ("正在启动 ADC");

//以15SPS 的数据速率启动 ADS1256
//其它数据速率:
// ADS1256_DRATE_30000SPS
// ADS1256_DRATE_15000SPS
// ADS1256_DRATE_7500SPS
// ADS1256_DRATE_3750SPS
// ADS1256_DRATE_2000SPS
// ADS1256_DRATE_1000SPS // ADS1256_DRATE_100SPS/
ADS1256_DREST_DR50SPS










// ADS1256_ADS1256SPS // ADS1256_DREST_DR50SPS // ADS1256_DR50SPS 数据:/ADS1256_DR50SPS/ ADS1256_DR50SPS/ ADS1256SPS // ADS1256_DR50SPS // ADS1256_DR50SPS/ ADS1256_DREST_DR50SPS // ADS1256_DR50SPS // ADS1256_DR50SPS // ADS1256_DR50SPS 下面列出的数据速率假定晶振频率为7.68Mhz
// 有关其他频率、请参阅数据表。
//poible gains
//ADS1256_gain_1
//ADS1256_gain_2
//ADS1256_gain_4
//ADS1256_gain_8
//ADS1256_gain_16
//ADS1256_gain_32
//ADS1256_gain_64
adc.begin(ADS1256_DRATE_7500SPS,ADS1256_GAIN_1,false);

Serial.println ("ADC started");

//将 MUX 寄存器设置为 Aino 和 AIN1,以便它开始执行 ADC 转换

}

void loop()
{

// for (int i=0;i < 8;++i)//
{
adc.waitDRDY ();
adc.setChannel(0);
sensor1 = adc.readCurrentChannel();
serial.println (sensor1);
//读取多路复用寄存器以查看当前活动通道
////

高效输入循环
//如需进一步了解,请阅读数据表第21页的图19:ADS1256输入多路复用

器的循环// adc.waitDRDY ();//在更改多路复用器寄存
器 adc.setChannel(2,3);之前等待 DRDY 变为低电平 //为 CH2和3
sensor1之间的差动设置多路复用器= adc.readCurrentChannel();//到达这里的 DOUT 来自多路复用器 AIN0和 AIN1

adc.waitDRDY ();
adc.setChannel(4,5);
sensor2 = adc.readCurrentChannel ();//到达这里的 DOUT 来自多路复用器 AIN2和 AIN3



(adc.setChannel(6,7););readCurrentChannel (adc); //到达此处的 DOUT 来自 MUX AIN4和 AIN5

ADC.waitDRDY ();
adc.setChannel(0,1);//切换回 MUX AIN0和 AIN1
Sensor4 = ADC.readCurrentChannel();//到达此处的 DOUT 来自 MUX AIN6和 AIN7

//打印结果。
serial.print (sensor1、10);
serial.print ("\t");
serial.print (sensor2、10);
serial.print ("\t");
serial.print (sensor3、10);
serial.print ("\t");
serial.println (sensor4、10);*/
delay (10);
}

//differential 模式代码

// Arudino 示例代码使用 ADS1256库
//使用 effiecient 输入循环读取4个差动通道
// Adien Akhmad 编写,2015年8月
// Modfified 2019年1月,由 Axisl 为#328


#include 

浮点时钟 MHZ = 7.68;// ADS1256上使用的晶体频率
float Vref = 2.5;//电压基准
//初始化 ADS1256对象
ADS1256 ADC (clockMHZ、Vref、false); // RESETPIN 永久连接到3.3V

//可变存储传感器读数
sensor1 =连接到 AIN0 - AIN1
sensor2 =连接到 AIN2 - AIN3
sensor3 =连接到 AIN4 - AIN5
Sensor4 =连接到 AIN6 - AIN7
*/

float sensor1、sensor2、sensor3、sensor3、sensor4、sensor3、sensor4、sensor4、sensor4


void setup()
{
Serial.begin(9600);

serial.println ("正在启动 ADC");

//以15SPS 的数据速率启动 ADS1256
//其它数据速率:
// ADS1256_DRATE_30000SPS
// ADS1256_DRATE_15000SPS
// ADS1256_DRATE_7500SPS
// ADS1256_DRATE_3750SPS
// ADS1256_DRATE_2000SPS
// ADS1256_DRATE_1000SPS // ADS1256_DRATE_100SPS/
ADS1256_DREST_DR50SPS










// ADS1256_ADS1256SPS // ADS1256_DREST_DR50SPS // ADS1256_DR50SPS 数据:/ADS1256_DR50SPS/ ADS1256_DR50SPS/ ADS1256SPS // ADS1256_DR50SPS // ADS1256_DR50SPS/ ADS1256_DREST_DR50SPS // ADS1256_DR50SPS // ADS1256_DR50SPS // ADS1256_DR50SPS 下面列出的数据速率假定晶振频率为7.68Mhz
// 有关其他频率、请参阅数据表。
//poible gains
//ADS1256_gain_1
//ADS1256_gain_2
//ADS1256_gain_4
//ADS1256_gain_8
//ADS1256_gain_16
//ADS1256_gain_32
//ADS1256_gain_64
adc.begin(ADS1256_DRATE_7500SPS,ADS1256_GAIN_1,false);

Serial.println ("ADC started");

//将 MUX 寄存器设置为 Aino 和 AIN1,以便开始执行 ADC 转换
adc.setChannel(0,1);
void

loop()
{//

高效输入循环
//要进一步了解,请参阅数据表第21页的图19:ADS1256输入多路复用器的循环

adc.waitDRDY ();//在更改多路复用器寄存器
adc.setChannel(2,3);之前等待 DRDY 变为低电平//将多路复用器设置为 CH2和3
sensor1之间的差动= adc.readCurrentChannel();//到达这里的 DOUT 来自多路复用器 AIN0和 AIN1

adc.waitDRDY ();
adc.setChannel(4,5);
sensor2 = adc.readCurrentChannel (); ////到达此处的 DOUT 来自 MUX AIN2和 AIN3

ADC.waitDRDY ();
adc.setChannel(6,7);
sensor3 = ADC.readCurrentChannel();//到达此处的 DOUT 来自 MUX AIN4和 AIN5

ADC.waitDRDY ();
adc.setChannel(0,1);//切换回 MUX AIN0和 AIN1
;adc = readCurrentChannel (); //到达此处的 DOUT 来自 MUX AIN6和 AIN7

//打印结果。
serial.print (sensor1、10);
serial.print ("\t");
serial.print (sensor2、10);
serial.print ("\t");
serial.print (sensor3、10);
serial.print ("\t");
serial.println (sensor4、10);

}

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

    您好 Lavanya、

    欢迎来到 E2E 论坛! 我怀疑有几个可能的问题需要您进行检查。  您正在尝试以7500sps 的速率捕获数据。  串行输出为9600波特。  您的捕获速度和传输速度可能太接近相同的值、无法捕获每个数据点。

    在一个循环情况下、延迟为10ms、这将防止捕获每个数据点、因为仅此延迟就会丢失大约75个结果。  我建议使用示波器并监控 DRDY 和 DOUT、以查看您是否正在捕获每次转换。  您很可能不会这样做、这将在结果中显示为错误。

    此致、

    Bob B