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:具有波形精确板、30K 样本无法正常工作

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/721361/ads1256-have-waveshare-precision-board-30k-samples-is-not-working

器件型号:ADS1256

您好!

我购买了采用 ADS1256 作为 ADC 的 Waveshare 高精度 AD/DA 板。 我尝试修改示例代码、以检查每秒30千个样本的采样率是否有效。 我添加了一个称为 samples 的变量来保存样本数量、并且我添加了一个时间库、以便我可以获得执行采样所需的时间、 但它没有为我提供正确的响应(例如、如果我分配 int samples = 15000并分配 ADS1256_CfgADC (ADS1256_GAIN_1、ADS1256_15000SPS)、它必须在大约一秒内回馈)、但  它在 ADS1256_500SPS 以上无法正常工作。 以下是我 修改过的代码、请有人帮助我!  

谢谢!

/*
ADS1256_test.c:
*非常简单的程序来测试串行端口。 期望
*端口回环到自己
*
//

*
从 bcm2835.h 定义 从板 DVK511定义
3.3V || 5V -> 3.3V || 5V
RPI_V2_GPIO_P1_03 || 5V -> SDA || 5V
RPI_V2_GPIO_P1_05 || GND -> SCL || GND
RPI_GPIO_P1_07 || RPI_GPIO_P1_08 -> IO7 || TX
GND || RPI_GPIO_P1_10 -> GND || RX
RPI_GPIO_P1_11 || RPI_GPIO_P1_12 -> IO0 || IO1
RPI_V2_GPIO_P1_13 || GND -> IO2 || GND
RPI_GPIO_P1_15 || RPI_GPIO_P1_16 -> IO3 || IO4
VCC || RPI_GPIO_P1_18 -> VCC || IO5
RPI_GPIO_P1_19 || GND -> MOSI || GND
RPI_GPIO_P1_21 || RPI_GPIO_P1_22 -> MISO || IO6
RPI_GPIO_P1_23 || RPI_GPIO_P1_24 -> SCK || CE0
GND || RPI_GPIO_P1_26 -> GND | CE1

:::如果 Raspberry Pi 是版本1或版本1或版本 A
RPI_V2_GPIO_P1_03->RPI_GPIO_P1_03
RPI_V2_GPIO_P1_05->RPI_GPIO_P1_05 RPI_V2_GPIO_P1_05
RPI_V2_GPIO_P1_13
:
*

#include 
#include 
#include 
#include 
#include 
#include 
#include 

//CS ---- SPICS/DIN
---- MOSI
/DOUT ---- MISO
//SCLK --- SCLK
//DRDY --- CTL_IO 数据启动
//RST ---- CTL_IO 复位



#define DRDY RPI_GPIO_P1_11 //P0
#define RST RPI_GPIO_P1_12 //P1
#defineSPICSRPI_GPIO_P1_15//P3

#define CS_1 () BCM2835_GPIO_write (SPICS、HIGH)
#define CS_0 () BCM2835_GPIO_write (SPICS、low)

#define









unsigned DRDY_IS_LOW ()((BCM2835_GPIO_HIGH)#define RST_TR32_TRUST_TR32_TRUST_TRUST_TRUST_TRUST_TRUST_TR0 (#define)#define RM32_TRUST_TRUST_TRUST_TRUST_TRUST_TRUST_TRUST_TRUST_TRUST_TRUST_TRUST_TRUST_TRUST_TRUST_TRUST_TRUST_TRUST_TRUST




typedef enum{false = 0、true =!false}bool;


/* gain channelî*/
typedef enum
{
ADS1256_gain_1=(0)、/* gain 1 */
ADS1256_gain_2=(1)、/* gain 2 *
/ ADS1256_gain_4=(2)、/* gain 4 *增益4 */ ADS1256_4

=(ADS1256_8 =)、/*增益3 =(ADS1256_gain_4 =)/*增益16 */
ADS1256_GAIN_32=(5),/*增益32 */
ADS1256_GAIN_64=(6),/*增益64 */
}ADS1256_GAIN_E;

/*采样速度选择*/*

11110000 = 30、000SPS (默认值)
11100000 = 15、000SPS
11010000 = 7、500SPS
11000000 = 3、750SPS
10110000 = 2、000SPS
10100001 = 1、000SPS
10010 =
100SPS
01110010 = 60SPS
01100011 = 50SPS 010100SPS



= 100SPS 11 = 100SPS 10SPS = 100SPS 01000SPS 10SPS 11 = 100SPS 10SPS 11 = 100SPS 10SPS = 100SPS 01000SPS 10SPS 11 = 100SPS 10SPS 11 = 100SPS 10SPS = 100SPS 10SPS 10
5SPS
00000011 = 2.5SPS
*/
typedef 枚举
{
ADS1256_30000SPS = 0、
ADS1256_15000SPS、
ADS1256_7500SPS、
ADS1256_3750SPS、
ADS1256_2000SPS、
ADS1256_1000SPS、
ADS1256_500SPS、
ADS1256_100SPS、
ADS1256_60SPS、
ADS1256_50SPS、
ADS1256_30SPS、
ADS1256_25SPS、
ADS1256_15SPS、
ADS1256_10SPS、
ADS1256_5SPS、
ADS1256_2d5SPS、

ADS1256_DRATE_MAX
}ADS1256_DRATE_E;

#define ADS1256_DRAE_COUNT = 15;

typedef 结构
体{
ADS1256_GAIN_E GAIN;// ADS1256_DRATE_E
DATARATE;//
int32_T 单

通道8输入/ int8*通道8输入模式;ADS1256_uT 输入8输入/ INT_ADC_8£¬输入




/*寄存器定义£º 表23。 寄存器映射-- ADS1256数据表第30*/
ENUM
{
/*寄存器地址、后跟复位默认值*/
REG_STATUS = 0、// x1H
REG_MUX = 1、// 01H
REG_ADCON = 2、// 20H
REG_DRATE = 3、// F0H
REG_IO = 4、// E0H
REG_OFC0 = 5、// XXh
REG_OFC1 = 6、// XXh
REG_OFC2 = 7、// XXh
REG_FSC0 = 8、// XXh
REG_FSC1 = 9、// XXh
REG_FSC2 = 10、// XXh
};

//*命令定义表24£º tt。 命令定义-- ADS1256数据表第34页*/
枚举
{
CMD_WAKEUP = 0x00、//完成同步并退出待机模式0000 0000 (00h)
CMD_RDATA = 0x01、//读取数据0000 0001 (01h)
CMD_RDATAC = 0x03、//连续读取数据0011 (03h)
CMD_SDATAC = 0x0000 0F、 //持续停止读取数据0000 1111 (0Fh)
CMD_RREG = 0x10、//从 REG RRR 0001 rr (1xh)
CMD_WREG = 0x50、//写入到 REG RRR 0101 rr (5xh)
CMD_SELFCAL = 0xF0、//偏移和增益自校准0000 (0F01111
) CMD_SELCLO //偏移自校准1111 0001 (F1h)
CMD_SELFGCAL=0xF2、//增益自校准1111 0010 (F2h)
CMD_SYSOCAL = 0xF3、//系统偏移校准1111 0011 (F3h)
CMD_SYSG4h = 0xF4、//系统增益校准1111 0100 (F1100)
CMD_SYNC 转换= 0xFD/FD
(FFD)、CMD_SYNC = 0xFD/1111) //开始待机模式1111 1101 (FDH)
CMD_RESET = 0xFE、//重置为加电值1111 1110 (FEH)
};


ADS1256_VAR_T g_tADS1256;
静态常量 uint8_t s_tabDataRate[ADS1256_DRATE_MAX]=
{
0xF0、/重置0xD0、0xD0、0xA1、0xD0、0xD0、0xD0





0x92、
0x82、
0x72、
0x63、
0x53、
0x43、
0x33、
0x20、
0x13、
0x03
};







void bsp_delayUS (uint64_t micros);
void ADS1256_StartScan (uint8_t _ucATE 模式);
静态 void ADS1256_Send8Bit (uint8_t _data);
void ADS1256_CfgADC (ADS1256_Gain_E _Gain、ADS1256_DR_E _E _D

静态 void);void ADS1256_dray_de_driveat_t (void);static dr eadc (void dr)
静态空 ADS1256_WriteReg (uint8_t _RegID、uint8_t _RegValue);
静态 uint8_t ADS1256_ReadReg (uint8_t _RegID);
静态空 ADS1256_WriteCmd (uint8_t _regcmd);
静态空 ADS1256_ADS1256_Int 静态
空

(t_ADS1256_ADS1256_ADS1256_Int);静态空 ADS1256_ADS1256_Int
静态空(t_ADS1256_ADS1256_Int);

静态空

uint8_t ADS1256_Scan (void);




void bsp_delayUS (uint64_t micros)
{
BCM2835_delayMicroseconds (micros);
}


/*

*名称:BSP_InitADS1256
*函数:STM32 GPIO 和 SPI 接口的配置£¬连接 ADS1256
*参数:空
*返回值:空

*/


void bsp_InitADS1256 (void)
{
#ifdef SOFT_SPI
CS_1 ();
SCK_0 ();
DI_0 ();
#endif

//ADS1256_CfgADC (ADS1256_GAIN_1、ADS1256_1000SPS);/*ÅäÖÃADC²ÎÊý£º ÔöÒæ1:1、ÊýŸÝÊä³öËÙÂÊ 1KHz */
}/*






*名称:ADS1256_StartScan
*函数:触发外部中断的 DRDY 引脚配置
*参数:_ucDiffMode:0单端输入8通道£¬1差动输入4通道
*返回值:空





ÇåÁãœá¹û»º³åÇø void ADS1256_StartScan (uint8_t _ucScanMode){g_tADS1256.ScanMode =_ucScanMode;//¿ªÊŒÉšÃèÇ°、*/
{
uint8_t I;

g_tADS1256.Channel = 0;

for (i = 0;i < 8;i++)
{
g_tADS1256}





*

*名称:ADS1256_Send8Bit
*函数:发送8位数据的 SPI 总线
*参数:_data:data
*返回值:空

*
静态空 ADS1256_Send8Bit (uint8_t _data)
{

bsp_DelayUS (2);
BCM2835_spi_transfer (_data);
}

/*

*名称:ADS1256_CfgADC
*函数:ADC 的配置参数、增益和数据速率
*参数:_gain:gain 1-64
* _drate:数据速率
*返回值:空

*/
void ADS1256_CfgADC (ADS1256_Gain_E _gain、ADS1256_DRATE_E _drate)
{
g_tADS1256.gain =_gain;
g_tADS1256.datarate =_drate;

ADS1256_WaitDRDY ();

{
uint8_t buf[4


位 ID24]、只定义 ID2

、工厂寄存器配置*和 ID1、ID3位3 /只读寄存器3位 ID1、只读寄存器2、ID1、只读寄存器3 数据输出位顺序
0 =最高有效位优先(默认)
1 =最低有效位优先
输入数据始终以最高有效字节和位优先进行移位。 输出数据始终首先移出最高有效
字节。 Order 位仅控制字节内输出数据的位顺序。

位2 ACAL: 自动校准
0 =自动校准被禁用(缺省值)
1 =自动校准被启用
当自动校准被启用时、自校准在 WREG 命令完成时开始、此命令改变
PGA
(ADCON 寄存器的0-2位)、DR (DRATE 寄存器的7-0位)或 BUFEN (状态寄存器的位1)值。

位1 BUFEN:模拟输入缓冲区使能
0 =缓冲区禁用(默认)
1 =缓冲区使能

位0 DRDY:数据就绪(只读)
该位与 DRDY 引脚的状态重复。

ACAL=1启用校准
*/
//buf[0]=(0 << 3)|(1 << 2)|(1 << 1);//启用内部缓冲器
buf[0]=(0 << 3)|(1 << 2)|(0 << 1);//禁止使用内部缓冲器

//ADS1256_WriteReg (REG_STATUS、(0 << 3)|(1 << 2)|(1 << 1));

buf[1]= 0x08;

//ADCON:A/D 控制寄存器(地址02h)
位7保留、始终为0
(只读)位6-5 CLK1、CLK0: D0/CLKOUT 时钟输出速率设置
00 =时钟输出关闭
01 =时钟输出频率= fCLKIN (默认)
10 =时钟输出频率= fCLKIN/2
11 =时钟输出频率= fCLKIN/4
当不使用 CLKOUT 时、建议将其关闭。 这些位只能使用复位引脚复位。

位4-3 SDCS1、SCDS0: 传感器

ŠÌ 电流源00 =传感器检测关闭(默认值) 01 =传感器检测电流= 0.5 μ A
10 =传感器检测电流= 2 ŠÌ A
11 =传感器检测电流= 10ŠÌ A
可以激活传感器检测电流源以验证的完整性 外部传感器向
ADS1255/6提供信号。 短路的传感器产生非常小的信号、而开路传感器产生非常大的信号。

位2-0 PGA2、PGA1、PGA0:可编程增益放大器设置
000 = 1 (默认值)
001 = 2
010 = 4
011 = 8
100 = 16
101 = 32
110 = 64
111 = 64
*/
buf[2]=(0 < 5)|(0 < 3)|(_GAIN << 0);
//ADS1256_WriteReg (REG_ADATE、(0 << 5)|(0 << 2)|(GAIN_1 << 1);//选择1:GAIN 1;INPUT 5V/BUF[3]
= s_SendDataRate[_drate];// DRCON_10SPS;

CS_0 ();// ADS1256_D* SPIƬѡ
寄存
器0*、ING_0*/ ADS0*= SendDataRate[0*、ADS0*、END*、ADS0_0*、ADS1256_NOT_END]/ END*

/*设置状态寄存器*/
ADS1256_Send8Bit (buf[1]);/*设置输入通道参数*/
ADS1256_****IT (buf[2]);/*设置 ADBSP 控制寄存器,增益*/
ADS1256_Send8Bit (buf[3]);/*设置输出速率*/

(US_1);
*

/* DelayCON 1 *





*名称:ADS1256_DelayDATA
*函数:延迟
*参数:空
*返回值:空

*/
static void ADS1256_DelayDATA (void)
{
//
从 DIN 的最后一个 SCLK 边沿到 DOUT 的第一个 SCLK 上升沿的延迟:RDATA、RDATAC、RREG 命令
最小值50 CLK = 50 * 0.13uS = 6.5uS
*/
BSP_DelayUS (10);//*最小时间延迟* 6.5us *







*名称:ADS1256_Recive8Bit
*函数:SPI 总线接收函数
*参数:空
*返回值:空

*/
static uint8_t ADS1256_Recive8Bit (void)
{
uint8_t read = 0;
read = BCM2835_SPI_transfer (0xff);
return read;
}

/*

*名称:ADS1256_WriteReg
*函数:写入相应的寄存
器*参数:_RegID:寄存器 ID
*_RegValue:寄存器值
*返回值:空

*/
static void ADS1256_WriteReg (uint8_t _RegID、uint8_t _RegValue)
{
CS_0 ();/* SPI cs = 0 */
ADS1256_Send8Bit (CMD_WREG |_RegID);/**** Write 命令寄存器*/
ADS1256_8Bit (0x00);

**/* Send_Number
*


/*/**/*

*名称:ADS1256_ReadReg
*函数:读取相应的寄存
器*参数:_RegID:寄存器 ID
*返回值:读取寄存器值

*/
static uint8_t ADS1256_ReadReg (uint8_t _RegID)
{
uint8_t read;

CS_0 ();// SPI cs = 0 */
ADS1256_8Bit (CMD_RREG |_RegID);// Write 命令寄存器*/
ADS1256_8Bit (0x00)*

/ ADS1256_SendT

(*/ READ)*/ READ (
*/ REDA_REDA_REDA_READ 值*/*/*)*/ REDA_REDA_REDA_REDA_REDA_READ (*/ REDA_REDA_REDA_REDA_REDA_REDA_READ)*/* SPI cs = 1 */

返回读数;
}/*



*名称:ADS1256_WriteCmd
*函数:发送单字节顺序
*参数:_cmd:命令
*返回值:空

*/
static void ADS1256_WriteCmd (uint8_t _cmd)
{
CS_0 ();/* SPI cs = 0 */
ADS1256_Send8Bit (_cmd);
CS_1 ();/* SPI cs = 1 */
}

/*
*************
*名称:ADS1256_ReadChipID
*函数:读取芯片 ID
*参数:_cmd:NULL
*返回值:四个高状态寄存器

*/
uint8_t ADS1256_ReadChipID (void)
{
uint8_t id;

ADS1256_WaitDRDY ();
id = ADS1256_ReadReg (REG_STATUS);
return (id >> 4);
}

/*

*名称:ADS1256_SetChannal
*函数:配置通道编号
*参数:_ch:通道编号0--7
*返回值:空

*/
static void ADS1256_SetChannal (uint8_t _ch)
{
/*
位7-4 PSEL3、PSEL2、PSEL1、PSEL0:正输入通道(AINP)选择
0000 = AIN0 (默认值)
0001 = AIN1
0010 = AIN2 (仅限 ADS1256)
0011 = AIN3 = AIN110
(仅限 ADS1256)
(仅限 ADS1256)

0111 = AIN7 (仅限 ADS1256)
1xxx = AINCOM (当 PSEL3 = 1、PSEL2、PSEL1、PSEL0为¡°don¡¯t care¡±时)

注意:使用 ADS1255时、请确保仅选择可用的输入。

位3-0 NSEL3、NSEL2、NSEL1、NSEL0:负输入通道(AINN)选择
0000 = AIN0
0001 = AIN1 (默认值)
0010 = AIN2 (仅限 ADS1256)
0011 = AIN3 (仅限 ADS1256)
0100 = AIN4 (仅限 ADS1256)
0101 = AIN5 (


仅限 ADS1256) AIN11 = AIN6 (仅限 ADS1256 (当 NSEL3 = 1时、NSEL2、NSEL1、NSEL0为¡°don¡¯t Care¡±)
*/
if (_ch > 7)
{
return;
}
ADS1256_WriteReg (REG_MUX、(_ch << 4)|(1 << 3));/*位3=1、AINN CONNECTION AINCOM*/
*



*名称:ADS1256_SetDiffChannal
*函数:配置差分通道
*参数:_ch:通道编号0--3
*返回值:四个高状态寄存器

*/
static void ADS1256_SetDiffChannal (uint8_t _ch)
{
/*
位7-4 PSEL3、PSEL2、PSEL1、PSEL0:正输入通道(AINP)选择
0000 = AIN0 (默认值)
0001 = AIN1
0010 = AIN2 (仅限 ADS1256)
0011 = AIN6 (仅限 ADS1256


)(仅限 ADS1256)
0111 = AIN7 (仅限 ADS1256)
1xxx = AINCOM (当 PSEL3 = 1、PSEL2、PSEL1、PSEL0为¡°don¡¯t care¡±时)

注意:使用 ADS1255时、请确保仅选择可用的输入。

位3-0 NSEL3、NSEL2、NSEL1、NSEL0:负输入通道(AINN)选择
0000 = AIN0
0001 = AIN1 (默认值)
0010 = AIN2 (仅限 ADS1256)
0011 = AIN3 (仅限 ADS1256)
0100 = AIN4 (仅限 ADS1256)
0101 = AIN5 (


仅限 ADS1256) AIN11 = AIN6 (仅限 ADS1256 (当 NSEL3 = 1、NSEL2、NSEL1、NSEL0为¡°don¡¯t Care¡±时)
*
/ if (_ch = 0)
{
ADS1256_WriteReg (REG_MUX、(0 << 4)| 1);/* DiffChannal AIN0£¬AIN1 */
}
else (_REG_3)
|
(REG_4)/ DiffChannal AIN2£¬AIN3 */
}
否则(_ch == 2)
{
ADS1256_WriteReg (REG_MUX、(4 << 4)| 5);/ Diff****AIN4£¬



£¬AIN5 */}否则(_ch =3){ADS1256_WriteReg (4 * AIN6)*、* AIN6 *(R)***/ AIN6)*





*名称:ADS1256_WaitDRDY
*函数:等待自动校准的延迟时间
*参数:空
*返回值:空

*/
static void ADS1256_WaitDRDY (void)
{
uint32_t i;

for (i = 0;i < 400000;i++)
{
if (DRDY_Is_low ())
}{
break;
}

if (i >= 400000)
{
printf ("ADS1256_DRDY ()超时...\n*



)

*名称:ADS1256_ReadData
*函数:读取 ADC 值
*参数:空
*返回值:空

*/
static int32_t ADS1256_ReadData (void)
{
uint32_t read = 0;
静态 uint8_t buf[3];

CS_0 ();/* SPI cs = 0 */

ADS1256_8BSendit (CMD_RDATA);//读取 ADC 命令*/

ADS1256_DelayDATA ();/*延迟时间*/

*读取采样结果24位*/
buf[0]= ADS1256_Recive8Bit ();
buf[1]= ADS1256_Recive8Bit ();
buf[2]= ADS1256_Recive8Bit ();

读取=((uint32_t) buf[0]<< 16)& 0x00FF0000;
读取|=((uint32_t) buf[1]<< 8);//注意它是错误的读取|=(buf[1]<< 8)*/
读取|= buf[2];

CS_1 ();/* SPIƬѡ= 1 */

/*扩展一个带符号的数字*/
IF (读取和0x800000)
{
读取|= 0xFF000000;
}

回读(int32_t);
}/*




*名称:ADS1256_GetAdc
*函数:读取 ADC 值
*参数:通道编号0--7
*返回值:ADC 模块(带符号数

*/
int32_t ADS1256_GetAdc (uint8_t _ch)
{
int32_t ITEMP;

if (_ch > 7)
{
return 0;
}

ITEMP = g_tADS1256.AdcNow[_ch];

return ITEMP;
}

/*

*名称:ADS1256_ISR
*函数:收集过程
*参数:空
*返回值:空

*/
void ADS1256_ISR (void)
{
if (g_tADS1256.ScanMode = 0)//* 0单端输入8通道£¬1差动输入4通道*/
{

ADS1256_SetChannal (g_tADS1256.Channel);/ WritSwitch *通道模式*/
BSP_DelayUS (5);ADS1256_DEWAKET_CMEWAKEUP


(d_CMD_CMD_CMEWAKEUP (5);ADS1256_D_CMD_D_CMEWAKEUP


(5);ADS1256_D_CMD_D_CMD_D_CMEWAKEUP (5);

if (g_tADS1256.Channel =0)
{
g_tADS1256.AdcNow[7]= ADS1256_ReadData ();
}
否则
{
g_tADS1256.AdcNow[g_tADS1256.Channel-1]= ADS1256_ReadData ();
}

if (+g_deltADS1256*)

;dspbc (tdsp_deltc56*)











;tdeltd_deltcyc (dspbeg_deltc5_deCM1256*);d_deltcyc (d_deltcyc);tdspbeg_deltCM1256*(d_d_deltd_deltcyc);d_deleg_deltcyc (d_deltcyc)


if (g_tADS1256.Channel =0)
{
g_tADS1256.AdcNow[3]= ADS1256_ReadData ();
}
否则
{
g_tADS1256.AdcNow[g_tADS1256.Channel-1]=****ReadData ();
}

if (++g_ADS1256)

= ADS1256 *




;= ADS1256 *

*名称:ADS1256_Scan
*函数:
*参数:NULL
*返回值:1

*/
uint8_t ADS1256_Scan (void)
{
if (DRDY_IS_LOW ())
{
ADS1256_ISR ();
return 1;
}

return 0;
}
/*

*名称:WRITE_DAC8552
*函数:DAC 发送数据
*参数:通道:输出通道编号
*数据:输出 DAC 值
*返回值:空

//
void Write_DAC8552 (uint8_t 通道、uint16_t 数据)
{
uint8_t I;

CS_1 ();
CS_0 ();
BCM2835_SPI_transfer (通道);
BCM2835_SPI_transfer ((Data>>>8));
BCM2835_SPI_transfer ((Data&0xff));
CS_1();
}/*


*名称:VOLTGE_Convert
*函数:电压值转换函
数*参数:Vref:基准电压3.3V 或5V
*电压:输出 DAC 值
*返回值:空

/uint16_t
Voltage_Convert (float Vref、float 电压)
{
uint16_t _D_;
_D_=(uint16_t)(65536 *电压/Vref);

返回_D_;
}

/*

*名称:main
*函数
:*参数:空
*返回值:空

*/

int main()
{
uint8_t id;
int32_t adc[8];
int32_t volt[8];
uint8_t i;
uint8_t ch_num;
int32_t ITEMP;
uint8_t buf[3];
if (!BCM2835_init())
返回1;
BCM2835_SPI_BEGIN ();
BCM2835_SPI_setBitOrder (BCM2835_SPI_bit_order_LSBFIRST); //默认值
BCM2835_SPI_setDataMode (BCM2835_SPI_MODE1); //默认值
BCM2835_SPI_setClockDivider (BCM2835_SPI_Cock_divider);//默认
BCM2835_GPIO_fsel (SPICS、BCM2835_GPIO_FSEL_OUTP);//
BCM2835_GPIO_WRITE (SPICS、高电平);
BCM2835_GPIO_fsel (DRDY、BCM2835_GPIO_FSEL_INPT);
BCM2835_GPIO_SET_Pud (DRDY、BCM2835_GPIO_PUD_UP);
//ADS1256_WriteReg (REG_MUX、0x01);
//ADS1256_WriteReg (REG_ADCON、0x20);
// ADS1256_CfgADC (ADS1256_GAIN_1、ADS1256_15SPS);
id = ADS1256_ReadChipID ();
printf ("\r\n");
printf ("ID=\r\n");
if (id!= 3)
{
printf ("错误、ASD1256芯片 ID = 0x%d\r\n"、(int) id);
}
否则
{
printf ("确定、ASD1256芯片 ID = 0x%d\r\n"、(int) id);
}
ADS1256_ADS1256_g1 (ADS1256_ADS1256_g1)
ADS1256_StartScan (0);
ch_num = 8;
//if (ADS1256_Scan ()= 0)
//{
//继续;
//}
int counter=0;
int samples=15000;
struct timespec ts={0、0}、tes={0、0};
clock_gettime (clock_monotonic、&ts);
while (计数器 "chanel="" 0="" v="%d\r\n",volt[0]);" buf[0]="((uint32_t)adc[i]">> 16)& 0xFF;
buf[1]=((uint32_t) adc[i]>> 8)& 0xFF;
buf[2]=((uint32_t) adc[i]>> 0)& 0xFF;
printf ("%d=%02x%02x%02x、%8ld"、(int) i、(int) buf[0]、
(int) buf[1]、(int) buf[2]、(long) adc [i]);

ITEMP = VOLT[i];/* UV */
/*IF (ITEMP < 0)
{
ITEMP =-ITEMP;
printf ("(-%ld.%03ld %03ld V)\r\n"、ITEMP /1000000、(ITEMP%1000000)/1000、ITEMP%1000);
}
否则
{
printf ("(%ld.%03ld %03ld V)\r\n"、ITEMP /1000000、(ITEMP%1000000)/1000、ITEMP%1000);
}

}
printf ("\33[%da"、(int) ch_num);
bsp_delayUS (100000);*
}
clock_gettime (clock_monotonic、&te);
printf ("turt %.5F seconds\n"、 ((double) te.tv_sec+1.0e-9*t.tv_nsec)-((double) ts.tv_sec+1.0e-9*ts.tv_nsec));
printf ("已完成");
BCM2835_spi_end ();
BCM2835_close();

返回0;
} 

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

    欢迎访问 TI E2E 论坛!

    这个问题看起来可能与轮询/DRDY 引脚然后调用 printf()函数所需的时间有关。 遗憾的是,您可能无法以这种方式使用 printf()(在每次 ADC 转换之间);但是,您可能能够跟踪采集100多个样本所需的时间,然后打印出平均时间/转换结果。

    为了确认 ADC 以更快的数据速率进行转换、我建议您查看示波器上的/DRDY 引脚、并查看信号周期(下降沿之间)是否与1/(数据速率)相关。

    此致、
    Chris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Chris、我将尝试一下
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它不是 printf 语句。 我一直在使用波浪形设备。 如果要接近波形广播所广播的30kHz SPS、则必须以连续模式运行。 波浪形高精度的一个问题是、它们提供的代码相当糟糕、没有很好的文档记录。

    由于波浪形高精度主要是具有电源的 ads1256的分线板和几个测试电路(电位器和光传感器)、如果您为 ads1256示例代码进行谷歌搜索、您可能会更幸运地找到有用的内容。

    我发现这是一个很好的起点、首先访问 github.com/.../Rpi2_ads1256

    作者声称从其中获得了30kHz 的频率。 我可以获得15kHz 的良好数据、我可以获得大约25kHz 的最高速度、但数据非常嘈杂...因此您的里程可能会有所不同。

    我认为,一个很好的问题是,为什么个别扫描的性能如此糟糕。 我能得到的最大值大约为3kHz、我不明白为什么它应该这么糟糕。 也许有更有经验的人可以回答这些问题吗?