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.
工具与软件:
希望大家都做得好
我想问一些帮助、我需要 使用 ADS8698进行数据采集、并且由于我对 SPI 非常陌生、我不明白我到底在做什么
请提供帮助。
我具有采用 ADS8698的以下电路板
https://www.aliexpress.com/item/1005006570383341.html
ADS8698产品说明书
https://www.ti.com/lit/ds/symlink/ads8698.pdf?ts = 1730097926835&ref_url=https%253A%252F%252Fwww.ti.com%252Fproduct%252FADS8698
我将 SPI 引脚和电位计连接到 Raspi 5V 的 V 和 Raspi GND 的 GND、中间 PINT 连接到 AIN0
电路板 VIN => 5V raspi
电路板 GND => GND raspi
下面是我的代码、如果我是否将输入连接到 AIN0、我将从 ADC 获得相同的值、并且即使我只是在 RST 命令之后读取响应、当我打印 adc_val = 255时、我仍然会获得相同的值
将 ADC 值转换为如下电压也是否正确?
# config.py --------------------------------------------------------------- import time import RPi.GPIO as GPIO import spidev RST_PIN = 25 CS_PIN = 8 SPI = spidev.SpiDev() SPI.open(0, 0) def digital_write(pin, value): GPIO.output(pin, value) def delay_ns(ns): time.sleep(ns * 1e-9) def spi_writebyte(data): SPI.writebytes(data) def spi_readbytes(reg): return SPI.readbytes(reg) def module_init(): GPIO.setmode(GPIO.BCM) print(1) GPIO.setwarnings(False) print(2) GPIO.setup(RST_PIN, GPIO.OUT) print(3) GPIO.setup(CS_PIN, GPIO.OUT) SPI.max_speed_hz = 18_000_000 #18MHz SPI.mode = 1 return 0 # End Config
# ads.py --------------------------------------------------------------- import config import RPi.GPIO as GPIO CMD_REG = { 'NO_OP' : 0x0000, # Continue operation in previous mode 'STDBY' : 0x8200, # Device is placed into standby mode 'PWR_DN' : 0x8300, # Device is powered down 'RST' : 0x8500, # Program register is reset to default 'AUTO_RST' : 0xA000, # Auto mode enabled following a reset 'MAN_Ch_0' : 0xC000, # Channel 0 input is selected 'MAN_Ch_1' : 0xC400, # Channel 1 input is selected 'MAN_Ch_2' : 0xC800, # Channel 2 input is selected 'MAN_Ch_3' : 0xCC00, # Channel 3 input is selected 'MAN_Ch_4' : 0xD000, # Channel 4 input is selected 'MAN_Ch_5' : 0xD400, # Channel 5 input is selected 'MAN_Ch_6' : 0xD800, # Channel 6 input is selected 'MAN_Ch_7' : 0xDC00, # Channel 7 input is selected 'MAN_AUX' : 0xE000 # AUX channel input is selected } rest = [ 0x85, 0x00] class ADS: def __init__(self): self.rst_pin = config.RST_PIN self.cs_pin = config.CS_PIN def ADS_reset(self): config.digital_write(self.rst_pin, GPIO.HIGH) config.delay_ns(100) config.digital_write(self.rst_pin, GPIO.LOW) config.delay_ns(100) # config.spi_writebyte(rest) config.spi_writebyte([CMD_REG['RST']] ) config.digital_write(self.rst_pin, GPIO.HIGH) # config.delay_ns(100) def ADS_Write_Cmd(self, cmd_reg): config.digital_write(self.cs_pin, GPIO.LOW) config.spi_writebyte([cmd_reg] ) config.digital_write(self.cs_pin, GPIO.HIGH) def ADS_Read_ADC_Data(self): config.digital_write(self.cs_pin, GPIO.LOW) config.spi_writebyte([CMD_REG['NO_OP']]) buf = config.spi_readbytes(3) config.digital_write(self.cs_pin, GPIO.HIGH) read = (buf[0]<<16) & 0xff0000 read |= (buf[1]<<8) & 0xff00 read |= (buf[2]) & 0xff return read def ADS_init(self): if (config.module_init() != 0): return -1 self.ADS_reset() return # End ADS
# main.py --------------------------------------------------------------- import ADS import RPi.GPIO as GPIO try: ADC = ADS.ADS() ADC.ADS_init() # ADC.ADS_Write_Cmd(ADS.CMD_REG['MAN_Ch_0']) # result = [] while(1): adc_val = ADC.ADS_Read_ADC_Data() print("ADC = %lf "%(adc_val * 10.24 / (2 ** 18))) print(adc_val ) except : GPIO.cleanup() print ("\r\nProgram end ") exit() # End Main
尊敬的 Ernist:
欢迎来到我们的 e2e 论坛! 这里一切都很好! 您能否提供一个原理图、其中显示了如何将购买的 PCB 连接到控制器? 此外、显示 SCLK、CS、SDI 和 SDO 的逻辑分析仪或示波器屏幕截图比您提供的代码片段更有用。
连接看起来不错、我假设您的电线相对较短。 您能否使用示波器或逻辑分析仪? 如果没有这个用于调试的资源、就很难实现。
尊敬的 Ernist:
找到一个朋友或洛杉矶有什么运气?
抱歉、对象初始化在提供的代码中的 main ()函数中
我希望你能解释我的错误
我仍然认为我发送字节的方式错误或按位操作错误
请告诉我应使用 示波器测试什么内容
感谢你的帮助
尊敬的 Ernist:
仔细检查代码需要一些时间。 简单来说、您能否告诉我您所处理的输入电压是什么类型、以及您期望的转换结果与实际转换结果是什么?
你好,汤姆对不起迟回复
我正在使用电位计在通道0上传递3.3V 电压、预计会获得3.3.3V 电压、但输出范围为2.1V 至2.8V、波动很大、我期望的是恒定值。 如果我断开通道上的输入、我得到的电压大约为4.0v、我想这是数据表中提到的无效输出。
尊敬的 Ernist:
尝试在 J1处将 AIN0短接至地、并查看得到什么样的转换结果-它 在 0处应该相对稳定、也许有几个 LSB 切换。
"怎么样? 您是否取得了进展?
大家好、Tom、我最近更换了新的 ADS8688、一切都使用它进行了工作。 所以决定继续使用。 感谢您的帮助。 在我们结束该主题之前、我想问一下是否有方法可以获得精确的采样率? 我设法获得了大约150ksps 的采样速率、应用延迟以接近每个样本之间的恒定周期、我想由于每次都需要相同的32个时钟、因此每个样本的采样时间应该保持不变、对吧? 采样率仍然存在一些波动、大约为0.015%、这是可以接受的、但如果可以的话、我可以了解一下。 是否只能通过使用计时器和中断的低级硬件管理实现? 如果您有消息来源、我很乐意与您分享。 否则、我的问题会得到解决、感谢您的支持/
祝你度过美好的一天!
尊敬的 Ernist:
很遗憾、我没有为您准备的代码。 转换时间由内部时钟固定-采集(采样)时间具有最小值、但没有最大值-基本上 ADS8698会在转换过程完成后立即返回至采集模式。 如果您的 CPU 上有一个良好的计时器、则可以使用它来切换/CS 输入并启动一个转换周期。