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.

[参考译文] ADS8681:关于配置

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1302660/ads8681-regarding-configuration

器件型号:ADS8681

大家好!  

我是 ADS8681 ADC 的新用户、也是此类 ADC 的新用户阅读数据表后、我有一些问题请帮助我

1) 1)我尝试读取 ADC 值、这里是+- ADC、所以分辨率值如何变化(我读取了数据表、但不明白)。

2)配置 ADC +-1.25*ADC 的编程流程是什么 Vref (我们正在使用内部参考) (需要哪个寄存器来配置)使用哪个命令来设置 Hword 或 Write 等寄存器。 以及我如何创建寄存器值。  

3) 3)我正在使用 Beagle Bone Black 来连接 ADC、因此我正在使用 C 代码、现在我不进行任何配置、因此当我通过 SPI 读取时、3.3V 输入的分辨率约为41795、0v/ GND 的分辨率约为32764、这是正确的吗?

4)什么是计算带+- ADC 分辨率的电压的公式(我知道正常的公式、即 Vout=(Vref/ 2^no of bits ADC)*分辨率值)、但我认为它不能与此一起工作。

我正在使用以下代码

#包含
#包含
#包含
#包含
#包含
#包含
#包含
#包含

#define SPI_DEVICE "/dev/spidev1.0
#define SPI_MODE SPI_MODE_0
#define SPI_SPEED 100000 // 100 kHz

INT SPI_FD;


//用于初始化 SPI 通信的函数
int spi_init(){
SPI_FD =开路(SPI_DEVICE、O_RDWR);
如果(SPI_FD => 1){
perror ("Error opening SPI device");
返回-1;

uint8_t mode = SPI_MODE;
if (ioctl (SPI_FD、SPI_IOC_WR_MODE、&MODE)==-1){
perror ("Error setting SPI mode"(设置 SPI 模式时出错);
关闭(SPI_FD);
返回-1;

uint32_t speed = SPI_SPEED;
如果(ioctl (SPI_FD、SPI_IOC_WR_MAX_SPEED_Hz、&SPEED)=-1){
perror ("Error setting SPI speed");
关闭(SPI_FD);
返回-1;

返回0;

//通过 SPI 传输数据的函数
void spi_transmit (uint16_t * data、size_t len){
结构 SPI_IOC_TRANSMIT ={
.tx_buf =(无符号长整型)数据、
.len = len、
};

if (ioctl (SPI_FD、SPI_IOC_MESSAGE (1)、&TRANSMIT)==-1){
perror ("传输 SPI 数据时出错");

//通过 SPI 接收数据的函数
void spi_receive (uint16_t * data、size_t len){
结构 SPI_IOC_TRANSMIT ={
rx_buf =(无符号长整型)数据、
.len = len、
};

if (ioctl (SPI_FD、SPI_IOC_MESSAGE (1)、&TRANSMIT)==-1){
perror ("Error receiving SPI data");

//关闭 SPI 通信功能
void spi_close(){
关闭(SPI_FD);

int main(){
如果(spi_init ()==-1){
返回1;


//示例数据
uint16_t TX_DATA[]={0x0000};
size_t len = sizeof (TX_DATA);

//发送数据
SPI_TRANSMIT (TX_DATA、len);

while (1)
{

//接收数据
uint16_t rx_data[len];
SPI_RECEIVE (Rx_DATA、len);



printf("以十进制格式收到的数据:");
for (size_t i = 0;i < len;++i){
printf ("%d "、rx_data[i]);

printf("\n");

printf ("十六进制接收的数据:");
for (size_t i = 0;i < len;++i){
printf ("0x%X"、RX_DATA[i]);

printf("\n");
usleep (1000000);



//关闭 SPI 通信
SPI_CLOSE();

返回0;

6) 6)如果有任何人具有 ADS8681或其库/驱动程序的 C 代码、请提供给我。

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

    尊敬的 Atul:

    欢迎来到 TI E2E 论坛。

    1)我想你说的"解决方案"是代码,你能解释一下你关于代码"值变化"的问题吗?   

    2) 没有特殊的编程流程。 您只需对 RANGE_SEL_REG 寄存器进行编程即可设置 ADC 的输入范围。 我建议您 查看  数据表第41页的输入命令字和寄存器写入操作7.5.2部分中命令的详细信息。 寄存器值可在 数据表第53页的 RANGE_SEL_REG 寄存器中找到、对于+/-1.25Vref 输入范围、0011b 应写入 RANGE_SEL[3:0]位。 以下 E2E 帖子应该会 帮助您理解:

    E2E: ADS8681:无法更改范围选择寄存器

    E2E: ADS8681:配置问题

    3) 3)您针对3.3V 输入获得的代码比预期代码稍高。  对于缺省+/-3Vref 输入范围、单端3.3V 输入的理想代码是41568。 您可以提供更多信息、包括原理图和信号源等、以便我帮助您 发现问题。  接地输入的代码约为32767、请参阅传递函数和下面的表7-4:

    4)如上图所示的传递函数、代码的中间位置是满量程输入范围的中心。 LSB= FSR Vref/2^16=2*3Vref/2^16为+/-3Vref 输入范围,因此电压=(代码-2^15)*LSB。

    5) 5)我们没有针对这个 ADC 的示例代码、数据表涵盖了所有信息、但是如果您在编码或时序方面有任何问题、请告诉我。

    此致、

    戴尔