Falsche Spannungsmesswerte von ADC und Operationsverstärker

Ich habe kürzlich gepostet, aber mein Schaltplan hat sich geändert und mein Problem auch.

Ich habe dies eingerichtet und auf meinem Himbeer-Pi habe ich diesen Code ausgeführt, der die 10-Bit-Zahl vom ADC erhält und in eine für mich nutzbare Spannung umwandelt.

#!/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

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

Geben Sie hier die Bildbeschreibung ein

Das Problem, das ich habe, ist, dass ich, wenn ich dies ausführe, einen konstanten Messwert von 3,3 V in meinem Programm erwarte. Ich jedoch nicht. Ich bekomme einen schwankenden Messwert zwischen 4,34-4,63 V. Ich muss eine konstante Spannung herstellen, weil ich beabsichtige, ein Piezoelement einzubauen, um die Spannung von Vibrationen zu erkennen, und das Signal muss vorgespannt werden, um sowohl die positiven als auch die negativen Spannungen zu erzeugen.

Kann jemand erklären, warum ich keine 3,3 V bekomme und warum ich keine konstanten 4,5 oder fast den Messwert bekomme, sondern einen schwankenden Wert? Danke

Haben Sie ein Multimeter (oder besser ein Oszilloskop) verwendet, um die Spannung am Ausgang des MCP601 zu messen?
Ich habe kein Oszilloskop zu Hause, aber ich messe es mit meinem Multimeter auf 3,26 V
Dann sollten Sie den Ratschlägen von @ScottSeidman unten folgen.
Die Schwankungen sind wahrscheinlich das Ergebnis der Verwendung einer Stromschiene als ADC-Referenz. Das muss eine dedizierte Referenz wie ein LM4040 sein.
Wenn ich einen 5-V-Spannungsregler verwenden würde, hätte das das gleiche Ergebnis?

Antworten (2)

Nachdem Sie überprüft haben, ob Ihre Eingangsspannung Ihren Vorstellungen entspricht, schlage ich vor, direkt nachzusehen, was in adc[1] und adc[2] steht, und sicherzustellen, dass der Inhalt Ihren Erwartungen entspricht.

Der beste Weg, solche Dinge zu tun, besteht darin, ein Oszilloskop oder einen Logikanalysator zu verwenden, um direkt auf den SPI-Bus zu schauen.

Wenn Sie Abbildung 6-1 im MCP3008-Datenblatt (den Chip, von dem der Benutzer den Code genommen hat) mit Abbildung 5-1 für den von Ihnen verwendeten MCP3002- Chip vergleichen, werden Sie sehen, dass der 3008 ein Bit mehr benötigt auf der DIN-Leitung eingetaktet als der 3002. Es ist sehr wahrscheinlich, dass Sie Ihren spi.xfer-Aufruf ändern müssen, um dies widerzuspiegeln.

Sie müssen diese Kommunikationsprotokolle in den jeweiligen Datenblättern nachlesen und versuchen zu verstehen, welche Werte Ihr Aufruf "adc = spi.xfer2([1,(8+channel)<<4,0])" auf dem Din aussendet Linie, und entsprechend ändern.

Auf den ersten Blick wird "adc = spi.xfer2([1,13<<3,0])" funktionieren, um Ihnen einen Single-Ended-Read auf CH0 zu geben, wenn Sie möchten, dass MSB zuerst verschoben wird, oder "adc = spi.xfer2( [1,12<<3,0])" wenn man zuerst das LSB braucht, aber ich weiß nicht genau wie spi.xfer2 funktioniert und habe nur einen Blick in die Datenblätter geworfen.

Können Sie erklären, was Sie mit adc[1] und adc[2] meinen? Ich habe nur 1 ADC, der andere ist ein Operationsverstärker?
Sie führen ein Programm aus, und es enthält Variablen. Eine dieser Variablen scheint ein Array namens adc zu sein, und es wird bei der Berechnung Ihrer Anzeige verwendet.
Der Code ist von raspberrypi-spy.co.uk/2013/10/… angepasst . Ich werde recherchieren, wie es funktioniert hat, aber die Version, die er implementiert hat, hat für ihn funktioniert. Alles, was ich getan habe, ist die Vref und die Eingangsspannung geändert
@JamesDonnelly, diese Person verwendet einen anderen Chip aus derselben Familie, jedoch mit einem etwas anderen Kommunikationsprotokoll.
@JamesDonnelly – verpasse auf keinen Fall meine letzten Änderungen
@JamesDonnelly hat gerade einen wichtigen Tippfehler im letzten Absatz korrigiert.
@JamesDonnelly: Bei Scott sind Sie diesbezüglich in viel besseren Händen :-) Ich wollte nur darauf hinweisen, dass es eine Webseite gibt , auf der die geringfügigen Programmierunterschiede zwischen MCP3002 und MCP3008 aufgeführt sind. Beifall!
@RespawnedFluff guter Fund
Ups, da war ich ein bisschen daneben! Shift 3 statt 4.
Habe es mit der verlinkten Seite von RespawnedFluff zum Laufen gebracht, aber Scott hat offensichtlich den Grund gefunden und wird nachforschen, wie das SPI-Zeug funktioniert. Ich kratze mich seit Tagen auf der Elektronikseite am Kopf. Vielen Dank. Gelöst und +1 gegeben.
@James Donnelly: Ich bin gespannt, ob der MCP601-Puffer jetzt, da Sie die Software repariert haben, einen Unterschied macht.
Der Operationsverstärker ist da, weil ich ein Piezoelement hinzufügen werde, um Vibrationen an einer Gitarre zu erkennen. Piezo ist eine Komponente mit hoher Impedanz und muss gepuffert werden, bevor es in den ADC geht.

Die Eingangskapazität in Kombination mit der hohen Impedanz des CH3Eingangs könnte den Operationsverstärker zum Schwingen bringen. CH3Versuchen Sie , nach dem Feedback des Operationsverstärkers einen Widerstand von mindestens 100 Ohm zwischen und den Operationsverstärker zu legen . Die hohe Eingangsimpedanz des ADC sollte verhindern, dass dieser Widerstand einen signifikanten Einfluss auf die Spannung hat.

Dies ist ein häufiges Problem bei Operationsverstärkern, die eine kapazitive Last mit hoher Impedanz betreiben.

Das MCP3002-Datenblatt empfahl, diesen spezifischen Operationsverstärker (MCP601) als Puffer hinzuzufügen (siehe electronic.stackexchange.com/a/193066/54580 ). Daher halte ich es für unwahrscheinlich, dass es in dieser Anwendung so problematisch wäre. Oder zumindest hätten sie zusätzliche Vorsichtsmaßnahmen erwähnt; es ist ein ziemlich langes und ausführliches/handhaltendes Datenblatt.
Um das Gesagte näher auszuführen: Beim Ansteuern einer kapazitiven Last ist die Ausgangsimpedanz (im offenen Regelkreis) des Operationsverstärkers von Bedeutung. Und der Hersteller kennt diese Eigenschaft, auch wenn er sie nicht ins Datenblatt schreibt. Weitere Informationen finden Sie unter electronic.stackexchange.com/questions/146531/… . Aber was Sie hier gesagt haben, ist im Allgemeinen ein guter Rat, auch wenn Sie in diesem Fall wahrscheinlich zu vorsichtig sind.