hschulte16
Posts: 2
Joined: Wed Aug 10, 2022 1:23 pm

maximale Abtastrate MCP3208 RaspberryPi

Wed Aug 10, 2022 2:13 pm

Hallo,

ich habe ein kleines Problem / kleine Frage.
Ich würde gerne ein analoges Signal mit Hilfe des Raspberry Pi und dem ADC MCP3208 abtasten. Da ich bei der Messung sehr kurze Spannungsabrisse erkennen will brauche ich eine sehr hohe Abtastfrequenz.
Mit meinem bisherigen Aufbau schaffe ich eine Samplerate von ca 6,5 kSa/s, wenn ich nur einen Kanal (der 8 vorhandenen) nutze. Dieser Wert würde zwar gerade noch funktionieren, allerdings muss ich 5 Kanäle "gleichzeitig" Überwachen, sprich diese 6,5 kSa/s teilen sich dann auf 5 Kanäle auf und ich habe effektiv nur noch 1,5 kSa/s, was leider deutlich zu wenig ist.
Gut wäre also ich hätte pro Kanal eine Samplerate von min 6,5 besser aber aber noch 7 oder 8 kSa/s, also bei 5 Kanälen --> 30 - 40 kSa/s.

Ich nutze SPI (spidev) als Verbindung zwischen Raspi und ADC. Hier bei lässt sich ja mit dem Befehl "spi.max_speed_hz=..." die maximale Frequenz (nach meinem Verständnis die SPI-Clock Frequenz) einstellen. Der oben genannte Wert von 6,5 kSa/s ist bei einer eingestellten Frequenz von 1Mhz entstanden. Ich habe auch schon mit höheren Frequenzen gespielt (1-125 MHz) wobei sich ab ca. 32 MHz eine konstante Samplerate von 9,5 kSa/s einstellt, zwischen 32 und 125MHz ist dann so gut wie keine Veränderung zu sehen.

Zum MCP3208:
Laut Datenblatt soll der ADC eine max. Samplerate von 100kSa/s haben.
VDD und VRef sind bei mir mit dem 3.3V Pin des Raspi verbunden.

Ggf. noch wichtig ich nutze den Raspberry Zero 2 W, ändert aber glaube ich nicht viel am Gesamtkonstrukt.

Mich würde sehr interessieren, ob jemand weiß ob ich mit dem vorhandenen Equipment die angestrebten Abtastraten erreichen kann und wenn nicht was ich nicht bedacht habe und wie man es ggf. anders lösen könnte.

Anbei jetzt die evtl. interessanten Codezeilen auf dem Raspi (Python):

Code: Select all

import spidev
import time
import RPi.GPIO as GPIO
import os
import datetime

#Parameter Messung
messDauer = 2 #Dauer in sek

#ADC-Parameter
# Index 0->L1 1->L2 2->L3 3->N 4->PE
phasenNamen = ["L1","L2", "L3","N","PE"]


#Variablen
bitAnzahl = 12
vRef = 3.3

messwertPhasen = []
messwert = []
anzahlMessungen = int(messDauer*6.5*1000/len(phasenNamen)) #

#Herstellen der SPI-BUS Verbindung
spi = spidev.SpiDev()
spi.open(0,0)
spi.max_speed_hz = 1000000


# Chip-Select auf Pin 8
CS_ADC = 8
GPIO.setup(CS_ADC, GPIO.OUT)


#Funktion zum einlesen

def ReadChannel3208(channel):
  adc = spi.xfer2([ 6 | (channel&4) >> 2, (channel&3)<<6, 0])
  data = ((adc[1]&15) << 8) + adc[2]
  return data

#Funktion Umwandlung in Spannungswert
def ConvertToVoltage(value,bitdepth, vref):
    return vref*(value/(2**bitdepth-1))


#Messung ---> 10.000 Sa in 1,525sec ==> ca. 6,55 kSa/s

for i in range(anzahlMessungen):
    # L1,L2,L3,N,PE auslesen
    messwertPhasen =[]
    for phase in range(len(phasenNamen)):
        GPIO.output(CS_ADC, GPIO.LOW)
        value = ReadChannel3208(phase)
        GPIO.output(CS_ADC, GPIO.HIGH)
        messwertPhasen.append(value)
        
    #Liste messwertPhasen in Liste messwert speichern
    messwert.append(messwertPhasen)
    

User avatar
mline
Posts: 1533
Joined: Sun Jan 27, 2013 1:47 pm
Location: Austria, Vienna

Re: maximale Abtastrate MCP3208 RaspberryPi

Wed Aug 10, 2022 4:11 pm

Der Linux Kernel wird hier immer ein Problem sein. Du kannst den SPI Clock zwar superhoch drehen aber der Kernel kann/muss Interrupts ausführen und darum wird es immer Latenzen geben die zu Ungenauigkeit führen.

Dazu kommt, dass du bei diesem Chip die Samplingrate durch die Kanäle teilen musst (wenn ich das richtig in Erinnerung habe) oder so.

Irgendwo hab ich mal gelesen, dass diese Chips eher für Genauigkeit gemacht sind als für Geschwindigkeit. Vermutlich wirds, wenn beides nötig ist, verdammt teuer werden.
<~~>

hschulte16
Posts: 2
Joined: Wed Aug 10, 2022 1:23 pm

Re: maximale Abtastrate MCP3208 RaspberryPi

Fri Aug 12, 2022 2:19 pm

Erstmal vielen Dank für die schnelle Antwort. :)
Klingt zwar nicht besonders gut für mein Projekt, aber irgendeinen Weg gibt es ja immer... ;)
mline wrote:
Wed Aug 10, 2022 4:11 pm
Irgendwo hab ich mal gelesen, dass diese Chips eher für Genauigkeit gemacht sind als für Geschwindigkeit. Vermutlich wirds, wenn beides nötig ist, verdammt teuer werden.
Mir ist die Genauigkeit (ziemlich) egal.
Zu Beginn des Projektes war ich noch davon ausgegangen mit niedriger Samplingrate und dafür höherer Auflösung (12bit) arbeiten zu können. Inzwischen denke ich es würden auch 8bit oder weniger genügen, wenn ich eine passende Samplingrate erreichen würde.

Gibt es denn evtl. noch eine andere Möglichkeit um diese zu erreichen? Zum Beispiel mit Alternativen zum Raspi oder etwas zwischen den beiden Geräten??

ghp
Posts: 2714
Joined: Wed Jun 12, 2013 12:41 pm
Location: Stuttgart Germany

Re: maximale Abtastrate MCP3208 RaspberryPi

Mon Sep 19, 2022 8:15 pm

Vielleicht einen Microcontroller (den pico) einsetzen als DataRecorder ? Ein paar Sekunden aufzeichnen im Speicher und dann an den Host weitergeben.

Return to “Deutsch”