当前位置: 首页 > 知识库问答 >
问题:

双线ADC,SPI读取

杜嘉慕
2023-03-14

我使用Arduino UNO(Atmega328)和12位ADC组件(AD7893ANZ-10),数据表可在https://www.analog.com/media/en/technical-documentation/data-sheets/AD7893.pdf

问题:我已经尝试了几个不同的代码,但读取值总是错误的,即使ADC的SDATA引脚未连接到Arduino的MISO引脚,我也会得到相同的值(参见图1)。我在proteus中模拟了它(参见图2),并在proteus中使用了虚拟串行监视器。Arduino的MOSI和SS引脚未连接,但我将代码中的SS引脚设置为低和高,以满足库要求。有关ADC定时的更多信息将作为注释添加到下面的代码中。或在数据表中提供。如果你看一下,我会非常感激的,因为我不知道我做错了什么。

PS:ADC只需连接引脚即可与SPI:1.SDATA(slaveout)和2.SCLK进行通信。ADC上的引脚CONVST用于启动转换。

#include <SPI.h>
   //source of code https://www.gammon.com.au/spi
void setup() {

  Serial.begin (115200);
  pinMode(7, OUTPUT);   // this pin is connected to convst on adc to initiate conversion


  // Put SCK, MOSI, SS pins into output mode (introductions from source)
  // also put SCK, MOSI into LOW state, and SS into HIGH state.
  // Then put SPI hardware into Master mode and turn SPI on
  pinMode(SCK, OUTPUT);
  pinMode(MOSI, OUTPUT);
  pinMode(SS, OUTPUT);
  digitalWrite(SS, HIGH);
  digitalWrite(SCK, LOW); 
  digitalWrite(MOSI, LOW);
  SPCR = (1<<MSTR);
  SPI.begin ();
  SPI.beginTransaction(SPISettings(2000000, MSBFIRST, SPI_MODE1)); // set the clk frequency; take the MSB first;
                                                                    //mode1 for CPOL=0 and CPHA=1 according to datasheet p.9 "CPOL bit set to a logic zero and its CPHA bit set to a logic one."
}


int transferAndWait (const byte what)  //methode to read data
{ 
  int a = SPI.transfer(what);    //send zero(MOSI not connected)and  read the first 8 bits and save
  Serial.println (a);            // show the value, in serial monitor -1
  a =(a << 8);                   //shift the saved first 8 bits to left
  Serial.println (a);            // show the value, in serial monitor 255
  a = a | SPI.transfer(what);     //read and save the last  8 bits
  Serial.println (a);             // show the value, in serial monitor -256
  delayMicroseconds (10);
  return a;
}


void loop() {
  int k;
  digitalWrite(7, HIGH);      //set pin high to initiate the conversion
  delayMicroseconds(9);       //the conversion time needed, actually 6 mikroseconds

  digitalWrite(SS, LOW);    // enable Slave Select  to get the library working
  k = transferAndWait (0);  //call the method
  delayMicroseconds(1);
  digitalWrite(7, LOW);     
  digitalWrite(SS, HIGH);   //disable chip select
  delay(2000);              //delay just to keep the overview on serial monitor
  Serial.println (k);       // show the value, in serial monitor -1
}

共有1个答案

长孙嘉容
2023-03-14

首先,返回变量应该是无符号整数,而不是有符号整数。此外,CONVST应该只在短时间内低,因为转换是在之后开始的。请参见定时顺序。

 类似资料:
  • 我正在尝试将模拟到数字转换器连接到raspberry pi。据我所知,RPi不支持双向SPI模式。我使用的adc表示它与SPI兼容,但只有输入SCLK、CNV和输出CLKOUT和CLKOUT-以及SD0和SD0-。这让我明白,它只适用于双向SPI,因为只有串行数据输出。我正在考虑对CNV(我认为是CE)使用PWM,对SCLK使用GPIO时钟,然后在GPIO时钟的下降沿上使用中断,以数字方式从adc

  • 我使用SPI通信尝试连接我的Arduino Mega 2560作为主从ADC芯片()在外部时钟模式,但我一直收到相同的值或所有零每当我运行我的代码。还有一个触摸屏(工作)连接。除了与Arduino的ADC芯片通信外,一切正常。 我尝试删除定义头,并改变时钟。也不要改变任何东西(这可能是因为其他错误)。 错误包括RB1=255;RB2=255;RB3=255或全部为零。

  • 我正在尝试将STM32F303核子与AD7748-4 ADC接口。ADC数据表: https://www.analog.com/media/en/technical-documentation/data-sheets/ad7768-7768-4.pdf 问题是,ADC不通过SPI端口输出转换后的值,而是使用数据就绪信号(DRDY)、数据时钟(DCLK)和4个数据输出的组合(DOUT0-DOUT3)

  • ADC

    machine.ADC machine.ADC 类是 machine 模块下的一个硬件类,用于指定 ADC 设备的配置和控制,提供对 ADC 设备的操作方法。 ADC(Analog-to-Digital Converter,模数转换器),用于将连续变化的模拟信号转化为离散的数字信号。 ADC 设备两个重要参数:采样值、分辨率; 采样值:当前时间由模拟信号转化的数值信号的数值; 分辨率:以二进制(或

  • ADC

    通过 ADC 设备采样电压值并转换为数值 通过 ADC 设备采样电压值并转换为数值 源码/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2018-11-29 misonyo f

  • ADC

    Advanced Direct Connect (ADC) 是一个简单的协议用于客户端和服务器之间面向消息和文件分享系统。