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
Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan
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
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.
Die Eingangskapazität in Kombination mit der hohen Impedanz des CH3
Eingangs könnte den Operationsverstärker zum Schwingen bringen. CH3
Versuchen 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.
stefandz
DonnellyÜberlauf
stefandz
Matt Jung
DonnellyÜberlauf