EKG mit XMC µC

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

von Jost H.

Bei jedem Verdacht auf eine Erkrankung des Herz-Kreislauf Systems wird meist zuallererst ein EKG gemacht. Es ist quasi der Diagnosestandard in der Kardiologie, da sich dadurch viele Störungen oder ernsthafte Erkrankungen des Herzens schnell erfassen lassen. Wenig verwunderlich ist es also, dass EKG Geräte heutzutage zur Standardausrüstung eines jeden Krankehauses, Arztes oder Rettungswagens gehören.

Der Technische Fortschritt hat natürlich auch hier seine Spuren hinterlassen. So wuchs die Komplexität und Funktionalität der EKG Geräte immer weiter an. Heute gibt es EKG-Geräte mit großzügigen Touchdisplays, Sprachfunktion um die Bedienung zu erleichtern und automatische Diagnose-Algorithmen die ohne zutun eines Arztes eine Diagnose stellen. Außerdem gibt es Geräte mit integriertem Defibrillator, die bei Bedarf automatisch die richtige Menge Energie an den Patienten liefern. Intern werden hochmoderne DSPs, FPGAs und Mikrocontroller für die Signalverarbeitung eingesetzt.

In diesem Artikel möchte ich mein Eigenbau-EKG-Gerät vorstellen - leider ohne Sprachfunktion oder automatischer Diagnose. Stattdessen mit folgenden Eckdaten:

  • Aufnahme eines 12 Kanal EKG's
  • 50 Samples/Sekunde
  • 24 Bit Auflösung pro Kanal
  • Reduzierung von Störungen durch Right-Leg-Drive
  • Aktives Treiben der Kabelschirmung
  • Schutz der Eingänge vor Spannungsspitzen (ESD, Defibrillator)
  • Software "EKG Viewer" zum betrachten der Signale

In erster Linie möchte ich hier auch auf die bei der Entwicklung aufgetretenen Schwierigkeiten hinweisen. Falls ich etwas vergessen habe oder etwas unklar ist, kann man mich natürlich gerne fragen.


EKG Gesamtes System.JPG

Warnung

Da die Hardware funktionsbedingt möglichst niederohmig über die Elektroden mit dem Körper verbunden ist, stellt dies eine nicht unerhebliche Gefahr für den Menschen dar. Im Fehlerfall hätte der Fehlerstrom also die besten Voraussetzungen um ungehindert in den Körper einzudringen. Deshalb sind im medizinischen Bereich besondere Sicherheitsvorkehrungen zu erfüllen. Die große Schwierigkeit ist die sichere Netztrennung. Professionelle EKG Geräte nutzen dazu Optokoppler, Digitale Isolatoren, Trennverstärker und galvanisch getrennte Netzteile. Und das alles auch noch mit medizinischer Zulassung! Die gesamte Entwicklung erfordert daher eine Menge fachspezifisches Wissen und Erfahrung in diesem Bereich. Da ich es mir keinesfalls zutraue diese Sicherheitsmaßnahmen normgerecht zu erfüllen, habe ich eine wichtige Maßnahme ergriffen um den Betrieb meiner Schaltung trotzdem einigermaßen sicher zu gestalten.
Ich betreibe die Schaltung ausschließlich über einen Laptop im BATTERIEBETRIEB! Dadurch wird sichergestellt, dass im Fehlerfall nicht mehr als die 19,5V des Akkus am Körper anliegen können.

Falls jemand beabsichtigt diese Schaltung nachzubauen, ggf. weiterzuentwickeln und zu verwenden handelt auf eigene Gefahr!

Was ist ein EKG?

Professionelles 6 Kanal EKG. Ableitungen I, II und III sind zu sehen

Das Herz eines jeden Menschen funktioniert, wie jeder andere Muskel auch, mit elektrischer Erregung. Beim Herzen geschieht dies jedoch völlig unbewusst über den Sinusknoten.
Eines der wichtigsten Geräte in der Kardiologie, der Elektrokardiograph, kann genau diese elektrische Erregung über Elektroden an der Hautoberfläche messen und ihre Größe auf einem Bildschirm oder auf Millimeterpapier graphisch darstellen(siehe Bild rechts). Das Wort "EKG" ist ein Akronym und bedeutet Elektrokardiogramm. Allerdings haben sich noch zwei weitere Bedeutungen eingebürgert. Die Unterscheidung ist manchmal nicht ganz eindeutig, deswegen hier nochmal zusammengefasst:

  • Elektrokardiographie - Das Verfahren im Allgemeinen
  • Elektrokardiogramm - Der Graph der aufgezeichneten Herzspannungen
  • Elektrokardiograph - Das Gerät mit dem das Elektrokardiogramm aufgezeichnet wird

Auch in dieser Doku verwende ich das Wort "EKG" mit unterschiedlichen Bedeutungen, aber ich denke man kann immer erkennen was gemeint ist.

Die heutigen EKG's nehmen meist nicht nur einen Graphen auf, sondern gleich mehrere auf einmal und ermöglichen so einen "Blick" auf das Herz aus verschiedenen Richtungen. Dazu werden mehrere Elektroden an verschiedenen Positionen am Körper angebracht um die Differenzen zwischen verschiedenen Elektrodenkonstellationen zu messen - die Ableitungen. Man kann sie in drei Gruppen einordnen die jeweils nach ihren Erfindern benannt wurden:

Ableitung nach Einthoven

Hierbei werden Elektroden an den rechten Arm, den linken Arm, sowie an den linken Fuß angebracht. Das Englische Fachwort für diese drei Elektroden lautet Limb Lead's. Daraus ergeben sich drei Möglichkeiten eine Spannungsdifferenz zu messen - also drei verschiedene Ableitungen: Lead I, Lead II, Lead III. Willem Einthoven hat eine Regel über diese Ableitungen aufgestellt, die sich mit dem nach ihm benannten Einthoven Dreieck veranschaulichen und belegen lässt.

[math]\displaystyle{ Lead I + (-Lead II) + Lead III = 0 }[/math]

Durch umstellen der Formel können wir nun also aus zwei bekannten Ableitungen die dritte berechnen. Das mache ich mir auch bei meinem EKG zunutze und messe lediglich Lead II und Lead III, woraus sich später in der Software Lead I errechnen lässt.

[math]\displaystyle{ Lead I = Lead II - Lead III }[/math]


Ableitung nach Goldberger

Die Ableitung nach Goldberger bietet uns drei weitere Ableitungen: aVR, aVL, aVF. (augmented-vector-Right/Left/Foot)
Diese Ableitungen sind jedoch ein Sonderfall, da sie meist nicht wirklich über Elektroden gemessen werden, sondern in der Software aus den Messungen von Lead I, Lead II und Lead III errechnet werden. Die Berechnung hierfür ist relativ simpel:

[math]\displaystyle{ aVR= \frac {-(Lead I + Lead II)}{2} }[/math]

[math]\displaystyle{ aVL= \frac {Lead I - Lead II}{2} }[/math]

[math]\displaystyle{ aVF= \frac {Lead II + Lead III}{2} }[/math]

Ableitung nach Wilson

Hierbei werden sechs Elektroden an festgelegten Positionen an der Brust angebracht. Anders als die anderen beiden Ableitungen(diese sind bipolare Messungen) ist die Ableitung nach Wilson eine Unipolare Messung. Das heißt, dass alle sechs Elektroden einen gemeinsamen Bezugspunkt für die Messung haben - das Wilson Central Terminal - eine virtuelle Elektrode in der Körpermitte. Diese virtuelle Elektrode wird gebildet, indem die drei Limb Leads(siehe Ableitung nach Einthoven) über drei Widerstände als Stern verbunden werden. Der Sternpunkt ist dann das Wilson Central Terminal.


Hardware

EKG Blockschaltbild.svg

Die Hardware besteht im Wesentlichen aus zwei Modulen: Zum einen aus dem XMC2GO Board, welches für die Anforderung der Daten, die Konfiguration der Register und die Kommunikation zum PC zuständig ist, zum Anderen aus einer selbst entwickelten Platine mit einem ADS1298 IC und einigem Hühnerfutter, für die Aufzeichnung und Wandlung der Analogsignale. Verbunden werden sie über simple Stift-/Buchsenleisten. Die Kommunikation der beiden Module läuft über einen SPI Bus.

Mit einem Taster auf der Platine wird man bestimmte Funktionen Triggern können. Z.B. das Setzen eines Markers bei auffälligen Ereignissen oder das Starten einer Samplereihe mit höheren Datenraten (bis jetzt noch nicht implementiert). Zwei LED's sollten eigentlich den Puls und den Lead-Off Status anzeigen.
So hab ich mir das beim Layouten zumindest gedacht... Hätte ich das Datenblatt des XMC's vorher etwas genauer gelesen, hätte ich gewusst, dass man Pin 2.7 und 2.9, an denen diese LED's hängen, nicht als Output konfigurieren kann. Naja, der gute Wille war da und die zwei LED's auf dem XMC2GO Board sollten auch erstmal reichen: Durch die LED an P1.1 wird die Prozessorauslastung in Form von Helligkeitsänderung(durch PWM) angezeigt. Die LED an P1.0 zeigt den aktuellen Betriebszustand in Form von Blinkmustern an:

  • Kurz an - Lange aus: nicht Verbunden
  • Dauerhaft an: Verbunden
  • Langsames Blinken: Aufnahme gestartet
  • Schnelles Blinken: Fehler


Die Versorgungsspannung für die gesamte Hardware wird über die 5V aus dem USB Port bezogen. Ein Low-Dropout Regler auf dem XMC2GO regelt sie dann auf 3,3V herunter. Er soll bis zu 150mA liefern können, wovon sich die µC's des XMC2GO selber schon mal ca. 75mA abzwicken. Dem ADS1298 reichen bei höchster Sample Rate schon 3,25mA, also sollten noch genügend Reserven vorhanden sein.
Um eine möglichst störungsfreie Digitalisierung zu gewährleisten, habe ich die Versorgungsspannung für den Analogen Teil der Schaltung über zwei 10µH SMD Drosseln vom Digitalen entkoppelt. Besonders vom SPI Bus müsse man sonst während der Übertragung mit erheblichen Störungen rechnen.

Ein gutes Drittel der Platine wird von einer Schutzschaltung belegt, welche den Patienten, aber auch die Hardware schützen soll. Diese besteht aus folgenden Bauteilen:

  • Ein Patienten-Schutz-Widerstand soll evtl. auftretende Fehlerströme durch den Körper auf einen ungefährlichen Wert begrenzen
  • Eine bipolare TVS Diode begrenzt eventuelle am Eingang anliegende Spannungsspitzen auf max. 15V
  • Eine Doppel Shottky Diode begrenzt die 15V weiter auf VDD + Uforward bzw. VSS - Uforward. Ein der Shottky Diode vorgeschalteter Widerstand begrenzt den Strom durch die Diode dabei auf maximal 80mA.


Zugegeben, der Schutz der Hardware war nicht zwingend notwendig, da er das IC hauptsächlich vor Impulsen eines Defibrillator schützen soll, die aber mit allerhöchster Wahrscheinlichkeit nie in Kontakt mit meinem EKG kommen werden. Da ich mein Projekt allerdings so "realitätsnah" wie möglich halten wollte, habe ich die Schutzschaltung trotzdem mit drauf gebaut.

Da der ADS1298 ein 64 Pin TQFP Gehäuse hat (Pin pitch = 0.5mm) und einige Durchkontaktierungen nötig waren, entschied ich mich für eine professionell gefertigte Leiterplatte. Bis auf die Stiftleisten nutze ich ausschließlich SMD Komponenten. Die meisten passiven Komponenten haben die Größe 0603 und 0805. So war es möglich das ganze Design ziemlich klein zu halten. Die Platine ist ohne den XMC2GO 30mm x 70mm groß. Der SUB-D Stecker wird auf die Vorderkante der Platine gesteckt und von beiden Seiten verlötet. Da die beiden SMD-Drosseln und das SMD-Poti ihre Pad's direkt unter dem Bauteil haben, musste ich diese per Reflow Verfahren löten. Den Rest habe ich per Hand verlötet.


ADS1298

Für die Verstärkung und Wandlung der schwachen Signale des Herzens nutze ich den ADS1298 aus einer IC Familie von Texas Instruments, welche extra für die Aufzeichnung von Biosignalen entwickelt wurde. Die Größe der Signale des Herzens beträgt ca. 1mV peak to peak, die durch Differenz PGA's(Programmable gain amplifier) auf einen brauchbaren Pegel angehoben werden. Direkt danach erfolgt die Analog-Digital Wandlung durch Delta Sigma ADC's mit einer Auflösung von 24 Bit. Da es für jeden der 8 Kanäle einen separaten Wandler gibt, erfolgt die Abtastung auch absolut simultan. Hier die groben Features des ADS1298:

  • 24 Bit ADC Auflösung bei 8KSPS (kilo samples per second)
  • 17 Bit ADC Auflösung bei 32KSPS
  • Programmable Gain Amplifier
  • Lead off detection
  • Wilson Central Terminal
  • Right Leg Drive
  • SPI Interface
  • Interne Referenzsspannung
  • Internes Testsignal
  • Interner Clock Generaotr

Eine große Beeinträchtigung der Qualität eines EKG's sind Störungen, die in Extremfällen eine Größe von bis zu 800mV erreichen können - die sogenannten Common Mode Störungen. Die Ursache dafür sind meist Leitungen oder Elektrische Geräte, die Netzspannung führen und induktiv oder kapazitiv in den Körper oder in die EKG Kabel einstreuen. Da die Störungen am gesamten Körper, an allen Kabeln und somit auch an allen Eingängen des ADS1298 mit nahezu gleicher Amplitude und gleicher Phase anliegen, wird ein Großteil davon vom Differenzverstärker gar nicht erst mit verstärkt.
Um ein noch präziseres Signal aufnehmen zu können, bietet der ADS1298 ein weiteres Feature um Störungen zu unterdrücken: Das "Right Leg Drive". Dabei werden die Störungen eines Einganges oder der Durchschnitt der Störungen mehrerer Eingänge(Auswählbar per Multiplexer) durch ein internes Modul Invertiert, danach Verstärkt und über eine am rechten Bein angebrachte Elektrode in den Körper "zurückgespeist". Durch die Invertierung heben sich die Störungen dann auf.
Dieses invertierte Signal kann man auch noch weiter verwenden und weitere Störungen reduzieren, indem man damit den Schirm des EKG-Kabels aktiv treibt. Dazu habe ich auf meiner Platine noch einen Impedanzwandler eingebaut, da der Interne Verstärker des ADS1298 die Kapazität des Schirms sonst nicht treiben könnte.

Die Anforderungen an die Außenbeschaltung des ADS1298 sind sonst sehr gering. Er benötigt zusätzlich zu den Standard-Kondensatoren für die Versorgungsspannung noch einige zusätzliche Abblock- / Filterkondensatoren und eine Feedback Beschaltung für das Right-Leg-Drive, bestehend aus einem Widerstand und gegebenenfalls einem Kondensator. Da ich die interne Referenzspannung und den internen Clock nutze, brauchte ich diese nicht mehr extern zu liefern. Zusätzlich wird noch eine Referenzspannung für das Right-Leg-Drive-Modul benötigt, die ich über ein externes Poti bereitstelle. Jedoch würde der ADS1298 auch hierfür eine intern generierte Spannung anbieten, die man per Konfigurationsregister einschalten kann.

Der ADS1298 unterscheidet zwischen Versorgungsspannung für den digitalen und den analogen Teil. Diese können in ihrer Größe gleich oder unterschiedlich sein und der Analoge Teil erlaubt sogar die Verwendung einer Bipolaren Spannung. Da ich nur die 3,3V vom XMC2GO Board zur Verfügung habe, nutze ich diese für Beide. Die Analoge Spannung wird zur Verringerung von Störungen jedoch vorher noch über zwei Drosseln von der Digitalen "entkoppelt".

Die SPI Tücke

SPI Protokoll für ein Single Byte Befehl.

Der Befehlssatz des ADS1298 besteht aus 10 Befehlen für z.B. das Starten / Stoppen einer Wandlung oder das versetzen in den Standby Modus. Die meisten Befehle davon haben eine Länge von einem Byte. Die Befehle für das Auslesen und das Schreiben eines Registers erwarten nach dem eigentlichen Befehls-Byte jedoch noch weitere Bytes für die Adresse des Registers und die eventuell zu schreibenden Daten. Die "Tücke" dabei ist, dass zwischen den einzelnen Bytes das Chip-Select (CS) Signal nicht zurück auf high gesetzt werden darf, da dies das interne SPI Modul zurücksetzen würde und die nachfolgenden Bytes nicht mehr richtig Interpretiert werden könnten. Im Datenblatt des ADS1298 fand ich hierzu leider nur einen kleinen Satz, der schnell überlesen ist. Vielleicht ist dieses Verfahren aber auch gängige Praxis in der SPI Kommunikation. Das kann ich nicht beurteilen, da ich noch nicht viel mit SPI gemacht habe. Evtl. weiß jemand mehr?

Wie ich das Problem gelöst habe, habe ich in Firmware->Software SPI beschrieben.

Die Register-Read Tücke

Als ich die SPI Tücke dann entdeckt und meine Firmware dementsprechend angepasst habe, konnte ich immerhin schon mal in Konfigurationsregister schreiben. Das Auslesen funktionierte allerdings trotzdem noch nicht. Das liegt daran, dass sich der ADS1298 nach dem Reset im "Read Data Continously Mode" befindet. In diesem Modus wird bei jedem ankommendem Serial-Clock Takt ein Bit aus dem Samplespeicher ausgegeben. Dieser Modus ist vor allem für Anwendungen mit hoher Samplerate gut geeignet, da dabei nicht jedesmal ein Befehl gesendet werden muss, bevor man ein Sample ausgelesen kann. Um Daten aus Konfigurationsregistern lesen zu können, muss man also einfach vorher den "Read Data Continously Mode" stoppen. Da bei meiner Anwendung nur niedrige Datenraten notwendig sind, bleibt der Modus auch für die weitere Laufzeit aus.


XMC2GO

Das XMC2GO ist ein winziges, sehr kostengünstiges (um die 5€) Entwicklungsboard für die neue XMC Mikrocontroller Serie von Infineon. Auf dem Board befinden sich 2 IC's: Ein XMC4200 und ein XMC1100.
Der 4200'er dient ausschließlich dem Programmieren und dem Debuggen sowie als USB-UART Bridge. Um ihn muss man sich als Entwickler überhaupt nicht kümmern, da er bereits mit der richtigen Firmware geliefert kommt und nur ein Mittel zum Zweck ist.
Der XMC1100 ist der eigentliche µC zum Entwickeln. Seine Pins sind zu einem großen Teil auf die zwei 8 poligen Leisten an den Seiten des Boards gemapped worden um ihn an externe Hardware anschließen zu können. Über die Pins kann auch die Versorgungsspannung von 3,3V abgegriffen werden bzw. eine externe Spannungsquelle angeschlossen werden, wenn man den USB Port nicht benutzen möchte. Desweiteren befinden sich zwei LED's auf dem Board, die ganz normal über Portpins angesteuert werden können.

  • ARM M0 (32 Bit)
  • 32MHz
  • 64kByte Flash
  • 16kByte Ram
  • Vier 16 Bit Timer
  • 12 Bit ADC
  • RTC
  • Zwei Kanal USIC (SPI, UART, I2C...)
  • Interner Temperatursensor
  • On Chip Voltage Regulator


EKG - Kabel

Elektrode Pin
RA 9
LA 10
RL 14
LL 11
V1 12
V2 1
V3 2
V4 3
V5 4
V6 5

Ein solches Kabel lässt sich auch selber bauen, allerdings sollte man dabei auf eine ausreichende Schirmung achten. Ich hab mich aus optischen Gründen gegen einen Selbstbau entschieden. Für unter 20€ fand ich ein China Kabel, welches aber einen sehr guten Eindruck macht. Da mir der Hersteller bzw. Vertreiber des Kabels keine Angaben zur Pinbelegung des 15 poligen Sub-D Steckers machen konnte, musste ich im Internet suchen. Viel gefunden habe ich dazu nicht. Aber auf DIESER Seite fand ich eine hübsche Tabelle, die Licht ins Dunkle brachte. Also hab ich die gesamte Entwicklung und vor allem das Layout auf diese Pinbelegung ausgelegt und gehofft, dass das bestellte Kabel die selbe Pinbelegung haben wird. Als es dann da war habe ich es direkt durchgemessen und zum Glück festgestellt, dass alles richtig ist. Wäre das nicht so gewesen, hätte ich mir noch einen Adapter bauen müssen - Nicht schön aber auch nicht weiter schlimm.



Elektroden

Die Qualität des EKG Signals ist sehr stark von dem Übergangswiderstand zwischen Elektrode und Haut abhängig. Dabei ist jedoch nicht ausschließlich der absolute Widerstand zur Haut ausschlaggebend, sondern vielmehr ein an allen Elektroden gleich guter Kontakt.

Angenommen wir befestigen zwei Elektroden am Körper, der mit 100mV 50Hz Common Mode Störungen belastet ist, und wollen über einen Differenzverstärker ein 1mV großes Signal vom Herzen messen. Wenn beide Elektroden einen gleich guten Kontakt zum Körper haben, werden über beide Elektroden die 100mV Störungen aufgenommen. Da die Differenz von 100mV und 100mV = 0 ist, heben sich die Störungen im Differenzverstärker auf und es werden nur die EKG Signale verstärkt.
Hat nun allerdings eine Elektrode einen schlechteren Kontakt als die andere, wird dieses Signal, bedingt durch den höheren Widerstand, abgeschwächt - als extremes Beispiel um 50%. Die Störungen werden im Differenzverstärker nicht mehr komplett aufgehoben, da die Differenz aus 100mV und 50mV = 50mV ist. Diese 50mV überlagern das eigentlich interessante Signal und es ist nicht mehr erkennbar oder es ist erheblicher Filteraufwand nötig.

Genau diese Probleme hatte ich, als ich anfangs mit 5 cent Stücken oder Alufolie als Elektrode experimentierte. Wenn man die ganze Sache also halbwegs ernst angehen will, sollte man sich richtige Elektroden kaufen, da sich bei Selbstbau-Lösungen einfach kein guter und vor allem kein an allen Elektroden gleich guter Kontakt herstellen lässt.

Mich hat interessiert, was für einen Vorteil richtige EKG Elektroden mit Elektrodengel wirklich haben. Deswegen habe ich den Widerstand zwischen meinen beiden Händen einmal mit Elektroden und einmal mit einem einfachen Metall-Haut Kontakt gemessen. Das Messergebnis ist auf den Beiden Bildern einsehbar.


Ich weiß nicht in wie fern ich den beiden Werte glauben schenken kann, da sie mir ein wenig hoch vorkommen. Aber was zählt ist der Unterschied - und der ist ja nicht gerade gering!


Software - EKG Viewer

Die Anwendersoftware für den PC ist in C# geschrieben. Da ich diese Programmiersprache vorher nicht richtig beherrschte, musste ich mir erstmal einige Dinge aneignen. Dementsprechend sieht der Code für das geübte Programmierer-Auge wahrscheinlich auch aus, doch nach vielen kleinen Problemchen habe ich schließlich eine Funktionierende Software auf die Beine gestellt bekommen. Programmiert habe ich in der Open Source Umgebung Sharp-Develop.
Da eine Erklärung des gesamten Codes den Rahmen sprengen würde, möchte ich mich hier nur auf eine Erklärung der einzelnen Elemente beschränken. Wer den gesamten Sourcecode einsehen möchte, findet in den Downloads die entsprechende Zip-Datei. Wer die Software einmal Antesten möchte, muss sich noch das .Net Framework installieren.

Jedoch wird man beim Antesten ohne angeschlossener Hardware nicht allzu weit kommen, da die Software erkennt, ob die richtige Hardware angeschlossen ist oder nicht. Dazu wird beim Aufbauen einer Verbindung das ID Register des ADS1298 eingelesen und auf Richtigkeit überprüft.

Manche Elemente der Oberfläche sind dauerhaft ausgegraut - können also nicht benutzt werden. Das hat den Grund, dass ich diese Elemente teilweise während der Entwicklung gebraucht und nachher ausgegraut habe, oder prophylaktisch für eventuell folgende Versionen eingebaut habe. Das Entwickeln des Designs war durch den Form Editor von SharpDevelop recht leicht und schnell gemacht.

Als alles soweit funktionierte, habe ich noch eine einfache Heartbeat-Detection eingebaut. Diese überprüft kontinuierlich, ob der Wert eines EKG-Signals einen voreingestellten Wert überschreitet hat und löst daraufhin einen Piepton und ein Blinken auf der GUI aus.


Die Klasse "EKG"

Um mir das Leben etwas zu erleichtern, habe ich eine Klasse geschrieben, in der alle Funktionen und Parameter, die für die Steuerung und Verwaltung der EKG Hardware wichtig sind, zusammengefasst sind. Auch die komplette Verwaltung der Seriellen Schnittstelle wird von dieser Klasse übernommen. So ist es sehr leicht die Hardware anzusprechen. Das hat den Vorteil, dass man sich später besser auf das Programmieren der GUI und das ganze drum herum konzentrieren kann.

Methoden der EKG Klasse
Methode Beschreibung
Connect() Versucht eine Verbindung mit der Hardware aufzubauen und überprüft die Richtigkeit der Hardware
Disconnect() Beendet evtl. noch laufende Messungen und disonnected die Hardware.
StartSampling() Startet die Messung
StopSampling() Stoppt die Messung


Properties der EKG Klasse
Property Read Write
IsConnected True = mit Hardware verbunden, False = nicht verbunden Read only
IsRunning True = Sampling läuft, False = Sampling gestoppt Read only
BaudRate Liest die Baudrate Setzt die Baudrate
PortName Liest den Port Namen Setzt den Port Namen


Events die von der EKG Klasse ausgelöst werden können
Event Beschreibung
NewDataEvent Wird getriggert, wenn neue Daten aus dem Digital Analog Wandler empfangen wurden.


Der Serielle Port oder "Der Flaschenhals"

Unheimlich viele Probleme hat die Verwendung der Seriellen Schnittstelle gemacht. Sie ist auch der Grund warum ich nur eine so niedrige Samplerate von 50Hz verwenden kann. Ich habe verschiedene Lösungswege probiert, doch es scheint, als ob Windows nicht mit der Menge der eingehenden Daten klar kommt und zwischendurch immer mal wieder Bytes verliert. Rein von der Baudrate her müsste eine Übertragung von bis zu 500 Samples / Sekunde möglich sein. Das verlieren der Bytes führt dann zu Problemen, da ich kein Flow Control in der Datenübertragung der Samples nutze.
Letztenendes habe ich mich für eine etwas unelegante Lösung entschieden, bei der ich den Seriellen Buffer in einem neuen Thread per Polling auslese und in einem First-In-First-Out Speicher ablege. Wenn genügend Daten (27 Bytes = Länge eines Datenpakets) eingelesen wurden, triggert der Thread ein Event, woraufhin der Hauptthread mit der Verarbeitung der Daten beginnt.

ZedGraph

Der große schwarze Bereich (in meinen ersten Versionen war er noch Weiß) auf dem die EKG Signalverläufe dargestellt werden, besteht aus einem einzigen Element (einer GraphPane) aus der ZedGraph Bibliothek. Diese Bibliothek bietet unglaublich viele Möglichkeiten für die graphische Darstellung von Daten. Falls es jemanden genauer interessiert gibt es im ZedGraph-Wiki eine große Auswahl an beispiel Code.


Digitale Gleichspannungs-Entkopplung

X: Frequenz(Hz) Y: Dämpfung(dB)

Da es durch verschiedene Effekte zu Gleichspannungs-Offsets in der Messung kommen kann, habe ich in der Software eine Gleichspannungs-Entkopplung implementiert. Dazu werden die Samples jedes einzelnen Kanals vor der Anzeige in einem FIR Hoch Pass Filter neu berechnet. Dabei werden extrem tiefe Frequenzen, und demnach auch der Gleichspannungsoffset, herausgefiltert. Wichtig ist nur, dass die eigentlichen EKG Signale, dessen geringste Frequenz bei ca. 1 Hz liegt, nicht weggefiltert werden. Die Steilheit eines Filters mit 12 Koeffizienten ist zwar noch relativ flach, reicht aber für meine Anwendung aus. Für ein professionelles Diagnose EKG sind steilflankigere Filter notwendig, die aber den Rechenaufwand enorm in die Höhe treiben. Ein Tool von Iowahills hat mir bei der Berechnung der Koeffizienten geholfen. Daher stammt auch die Grafik des Frequenzganges(Bild rechts).

Firmware für den µC

Da ich eigentlich aus der 8 Bit Welt komme, stellte ich mich innerlich schon auf ein großes Umdenken bei der Programmierung eines Mikrocontrollers mit 32Bit ARM Kern ein. Glücklicherweise gestaltete sich die Programmierung des XMC1100 nicht so viel anders als z.B. die eines AVR's. Eigentlich erstaunlich, denn der Vergleich eines AVR's mit einem ARM Mikrocontroller ist rein Leistungstechnisch wie Äpfel mit Birnen zu Vergleichen. Ein Paar Unterschiede gibt es natürlich (wäre komisch wenn nicht). Am meisten aufgefallen sind mir folgende:

  • Bitbanding (das Parallele Ausgeben eines kompletten Words auf die Pins) wird vom Cortex M0 nicht unterstützt. Jeder IO Pin muss einzeln gesetzt, rückgesetzt oder getoggelt werden.
  • Das konfigurieren von Modulen wie z.B. Timer, USIC's ist aufgrund der Komplexität recht schwierig.
  • Interrupts viel komplexer.


Eine große Hilfe beim Entwickeln der Firmware war das Tool Hterm. Damit konnte ich alle Kommandos, die sonst von der PC-Software gesendet werden, manuell eingeben und so die möglichen Fehlerquellen auf die Firmware begrenzen.



Entwicklungsumgebung - µVision

Keil µVision Entwicklungsumgebung

Die von Infineon empfohlene Entwicklungsumgebung ist die "hauseigene" Software Dave 3. Mit ihr erhält man die Möglichkeit mit sogenannten "Dave Apps" zu arbeiten. Das sind vorgefertigte konfigurierbare Module, die man zusammenschalten kann und einem so einen Teil der Schreibarbeit abgenommen wird. Sicherlich ist diese Methode eine sehr interessante Art der Programmierung und bietet viele Möglichkeiten. Da das App-Modell für mich jedoch völlig neu war und mir auf dem ersten Blick recht abstrakt vorkam, suchte ich für dieses Projekt nach einer alternativen Entwicklungsumgebung mit kürzerer Einarbeitungszeit. Mit der Software µVision von Keil kam ich direkt gut zurecht. Auf Dave3 werde ich aber auf jeden Fall nochmal zurück kommen.


Grundlegender Programmablauf

Wie schon bei der PC-Software beschränke ich mich hier auf eine grobe Beschreibung des Ablaufes. Interessierte finden am Ende des Artikels den gesamten Code zum Downloaden.

Nach dem Reset des Mikrocontrollers wird die Startup Routine des XMC1100 aufgerufen. Diese habe ich nicht selber geschrieben, sondern habe die von CMSIS bereitgestellte Routine genutzt. Als nächstes erfolgt die Konfiguration des Takts, sowie die Initialisierung des System-Tick-Timers auf eine Tick Frequenz von 1kHz. Danach wird eine Funktion zur Festlegung der Datenrichtung der einzelnen IO Pins aufgerufen. Anschließend wird ein USIC Modul auf UART konfiguriert, sodass mit dem PC kommuniziert werden kann. Als letzter schritt wird der ADS1298 mit einer Standard Konfiguration beschrieben. Sind alle Initialisierungen abgeschlossen springt das Programm in eine leere Endlosschleife.

Ab jetzt wird der gesamte Ablauf über eine Art Scheduler geregelt. Der Scheduler errechnet mithilfe der 1kHz des System-Tick Timers den Zeitpunkt an dem eine bestimmte Funktion aufgerufen werden muss und triggert den Aufruf dementsprechend. Sobald die Funktion abgearbeitet wurde springt das Programm wieder zurück in die Endlosschleife, bis der Scheduler die nächste Funktion aufruft.
Diese Art der Programmabarbeitung ermöglicht eine einfache Implementierung von Erweiterungen und das Programm bleibt dabei recht übersichtlich.
Durch ändern eines Wertes in der Scheduler Routine kann man die Samplerate des EKG's einstellen. Ich habe mich bewusst gegen eine zur Laufzeit einstellbare Samplerate entschieden, da der voreingestellte Wert genau die maximal mögliche Auslesegeschwindigkeit meines Seriellen Ports am PC ausnutzt.
Ein weiterer wesentlicher Teil der Firmware besteht aus einem Case Verteiler, der die eingehenden Kommandos vom PC den entsprechenden Funktionen zuordnet.


Software SPI

Weiter oben, im Abschnitt "SPI Tücke", habe ich beschrieben, dass das Chip Select (CS) Signal bei der Übertragung eines Multi-Byte Befehls zwischen den einzelnen Bytes nicht auf High wechseln darf. Leider ist genau dies der Fall, wenn man das Hardware-USIC Modul des Mikrocontrollers für die SPI Kommunikation benutzt. Gezwungenermaßen musste also eine Software SPI Funktion implementiert werden. Da noch genügend Rechenzeit zur Verfügung stand war das kein großes Problem und schnell gemacht.

Sonstige Bilder & Video


Fazit und Ausblick

Alles in allem war dieses Projekt super Interessant, da so viele verschiedene Bereiche unter einen Hut zu bringen waren: Digital- und Analogtechnik, Mikrocontrollertechnik, PC Anwendungsprogrammierung, Medizintechnik. Über den Sinn oder Unsinn dieses Projekts kann man sich natürlich streiten. Mein persönlicher Sinn dieses Projekts liegt nicht unbedingt darin nun ein EKG Gerät zu besitzen, sondern es ist vielmehr die Tatsache, unheimlich viel Neues dabei gelernt zu haben und es vor allem sehr viel Spaß gemacht hat ein komplettes System zu entwickeln und es nachher funktionieren zu sehen. Es hat zwar nicht alles so geklappt wie ich es angedacht hatte(z.B. viel zu niedrige Samplerate), trotzdem bin ich mit dem Endprodukt sehr zufrieden.


Ich habe mir einige Dinge aufgeschrieben, die man in einer eventuellen Nachfolgerversion umsetzen könnte:

  • Kommunikation nicht über Seriellen Port. Dieser hat mir viele Probleme bereitet und ist für höhere Datenraten nicht unbedingt geeignet.
  • Eigenes Display zur Darstellung der Signale und evtl. kleines Betriebssystem.
  • Höhere Abtastrate für bessere Auflösung und mehr Möglichkeiten bei der Filterung.

Downloads

Für private Zwecke dürfen die von mir entwickelte Schaltung und die dazugehörige Software gerne genutzt werden. Eine Weiterentwicklung mit kommerziellen Interessen ist nur nach Rücksprache und ggf. Freigabe durch mich gestattet.