Lecturas de voltaje incorrectas del ADC y del amplificador operacional

1

Recientemente publiqué, pero mi esquema cambió y también mi problema.

Tengo esta configuración y en mi Raspberry Pi tengo este código en ejecución que obtiene el número de 10 bits del ADC y lo convierte en un voltaje utilizable para mí.

#!/usr/bin/python

import spidev
import time
import os

# Open SPI bus
spi = spidev.SpiDev()
spi.open(0,0)

# Function to read SPI data from MCP3002 chip
# Channel must be an integer 0-7
def ReadChannel(channel):
  adc = spi.xfer2([1,(8+channel)<<4,0])
  data = ((adc[1]&3) << 8) + adc[2]
  return data

# Function to convert data to voltage level,
# rounded to specified number of decimal places.
def ConvertVolts(data,places):
  volts = (data * 5) / float(1023)
  volts = round(volts,places)
  return volts

while True:

  # Read the MCP3002
  ADC_volts = ReadChannel(0)
  digital_Volts = ConvertVolts(ADC_volts,2)
  print digital_Volts

simular este circuito : esquema creado usando CircuitLab

El problema que tengo es que si ejecuto esto espero obtener una lectura constante de 3.3V en mi programa. Sin embargo, no lo hago. Obtengo una lectura fluctuante entre 4.34-4.63V. Necesito establecer un voltaje constante porque tengo la intención de incluir un elemento piezoeléctrico para detectar el voltaje de las vibraciones y la señal debe desviarse para obtener los voltajes pos + y negativos producidos.

¿Puede alguien explicar por qué no obtengo 3.3 V y por qué no obtengo una lectura constante de 4.5 o casi un valor fluctuante? Gracias

    
pregunta JamesDonnelly

2 respuestas

4

Después de verificar que tu voltaje de entrada es lo que crees que es, sugiero mirar directamente lo que hay en adc [1] y adc [2], y asegurarte de que lo que se ve allí sea lo que esperas.

La mejor manera de hacer este tipo de cosas es usar un analizador de alcance o lógico para mirar directamente al bus SPI.

Si compara la figura 6-1 en la hoja de datos MCP3008 (el chip que usted usó) tomó el código de está usando) a la figura 5-1 para el chip MCP3002 que está usando, verá que el 3008 requiere que se marque un bit más en la línea DIN que el 3002. Es muy probable que necesite modificar su llamada spi.xfer para reflejar esto.

Debe leer estos protocolos de comunicación en las hojas de datos respectivas, intente comprender qué valores su llamada "adc = spi.xfer2 ([1, (8 + canal) < < 4,0])" es enviando en la línea Din, y modifique apropiadamente.

A primera vista, "adc = spi.xfer2 ([1,13 < < 3,0])" funcionará para darte una sola lectura terminada en CH0 si quieres que MSB se desplace primero, o "adc = spi.xfer2 ([1,12 < < 3,0]) "si necesita el LSB primero, pero no sé exactamente cómo funciona spi.xfer2, y solo he echado un vistazo a las hojas de datos.

    
respondido por el Scott Seidman
1

La capacitancia de entrada combinada con la alta impedancia de la entrada CH3 podría estar causando que el amplificador operacional oscile. Intente colocar una resistencia de al menos 100 ohmios entre CH3 y el amplificador operacional, después de la retroalimentación del amplificador operacional. La alta impedancia de entrada del ADC debería evitar que la resistencia tenga un efecto significativo en el voltaje.

Este es un problema común con los amplificadores operacionales que ejecutan una carga capacitiva de alta impedancia.

    
respondido por el doug65536

Lea otras preguntas en las etiquetas