EKG mit XMC µC: Unterschied zwischen den Versionen

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 1: Zeile 1:
''von Jost H.''
''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. <br />
 
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ügiges Touchdisplays, Sprachfunktion um die Bedienung zu erleichtern, 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 leistungsfähige DSP's, FPGA's und Mikrocontroller für die Signalverarbeitung eingesetzt. <br />
 
In diesem Artikel möchte ich mein eigenbau EKG Gerät vorstellen - leider ohne Sprachfunktion oder automatischer Diagnose. Stattdessen mit folgenden Eckdaten:
'''Artikel im Aufbau'''
 
In diesem Artikel möchte ich die Funktion und die Ergebnisse meines DIY EKG's vorstellen. Die Groben Features sind folgende:
 
* Aufnahme eines 12 Kanal EKG's
* Aufnahme eines 12 Kanal EKG's
** max. 24 Bit Auflösung
* 24 Bit Auflösung pro Kanal
** max. 500 Samples/Second
* 200 Samples pro Sekunde
* Reduzierung von Störungen durch Right-Leg-Drive
* Reduzierung von Störungen durch Right-Leg-Drive
* Aktives Treiben der Kabelschirmung
* Überprüfung der Elektroden auf richtigen Kontakt
* Überprüfung der Elektroden auf richtigen Kontakt
* Schutz der Eingänge vor Spannungsspitzen (ESD, Defibrillator)
* Schutz der Eingänge vor Spannungsspitzen (ESD, Defibrillator)
 
* Software "EKG Viewer" zum betrachten der Signale





Version vom 18. Juli 2014, 20:56 Uhr

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ügiges Touchdisplays, Sprachfunktion um die Bedienung zu erleichtern, 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 leistungsfähige DSP's, FPGA's 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
  • 24 Bit Auflösung pro Kanal
  • 200 Samples pro Sekunde
  • Reduzierung von Störungen durch Right-Leg-Drive
  • Aktives Treiben der Kabelschirmung
  • Überprüfung der Elektroden auf richtigen Kontakt
  • Schutz der Eingänge vor Spannungsspitzen (ESD, Defibrillator)
  • Software "EKG Viewer" zum betrachten der Signale



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 und zu verwenden tut dies 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 und den AV-Knoten.
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 Herzspannungskurven
  • 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 Goldenberg

Die Ableitung nach Goldenberg bietet uns drei weitere Ableitungen: aVR, aVL, aVF. (augmented-vector-Right/Left/Foot)
Sie sind jedoch ein Sonderfall, da sie meist nicht wirklich gemessen werden, sondern aus Lead I, Lead II und Lead III errechnet werden. Die Berechnung hierfür ist denkbar einfach:

[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 Signalverarbeitung und die Kommunikation zum PC zuständig ist, zum Anderen aus einer 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.

Da der ADS1298 ein 64 Pin TQFP Gehäuse hat (Pin pitch = 0.5mm) und einige Durchkontaktierungen nötig waren, entschied ich mich direkt für eine professionell geätzte Leiterplatte. Die passiven Bauteile 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 20mm x 50mm groß.

Ein gutes Drittel der Platine wird von einer Schutzschaltung belegt, welche den Patienten, aber auch die Hardware schützen soll. Dieser 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.

Mit einem Taster auf der Platine wird man bestimmte Funktionen Triggern können(noch nicht implementiert). Durch zwei zusätzliche LED's (zusätzlich zu denen auf dem XMC2GO Board) wird der aktuelle Betriebszustand angezeigt.
So hab ich mir das zumindest gedacht... Hätte ich vorher das Datenblatt des XMC's genauer gelesen, hätte ich gewusst, dass man Pin 2.7 und 2.9, an denen die LED's hängen, nicht als Output konfigurieren kann. Naja, der gute Wille war da und die zwei LED's auf dem XMC2GO sollten auch locker reichen.

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 süße 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 Drosseln vom Digitalen entkoppelt. Besonders vom SPI Bus müsse man sonst während der Übertragung mit erheblichen Störungen rechnen.


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 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. Da es für jeden der 8 Kanäle einen separaten Wandler gibt, erfolgt die Abtastung auch absolut simultan.
Eine große Herausforderung bei der Aufzeichnung eines Qualitativen Signals sind Störungen, die in Extremfällen eine Größe von bis zu 800mV haben können - sogenannte Common Mode Störungen. Die Ursache für diese Störungen 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 störungsfreieres Signal zu bekommen bietet der ADS1298 ein weiteres Feature um die Störungen direkt im Körper zu unterdrücken. Dabei wird der Common-Mode Anteil eines oder mehrerer Eingänge invertiert und über eine Elektrode auf das Rechte Bein gespeist. Dadurch heben sich die Störungen dann auf. Auch dazu bietet der ADS1298 ein Modul bei dem man den zu invertierenden Eingang intern per Multiplexer auswählen kann.

  • 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

Die SPI Tücke

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?

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 relativ leicht selber bauen. Man sollte allerdings 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 / 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 über mehrere Elektroden gleicher 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

Frühe Version der Software. Zu sehen sind die drei Ableitungen nach Einthoven.

Die Software zum anschauen der EKG Signale und zum verwalten der Hardware habe ich in C# geschrieben. Als Entwicklungsumgebung habe ich das Open Source Programm SharpDevelop benutzt.

Die Oberfläche ist halbwegs Modular aufgebaut. So findet man zusammengehörende Elemente (wie z.B. COM Port Name, Baudrate, Connect-Button) in einer dementsprechenden Groupbox. Manche Elemente 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 der GUI war durch den Form Editor von SharpDevelop recht leicht und schnell gemacht.

Die Software überprüft direkt nach öffnen des Seriellen Ports das Hardware ID Register des ADS1298 um sicher zu stellen, dass man nicht nur den XMC2GO ohne EKG-Platine angeschlossen hat. Eine große Hilfe beim Entwickeln der Software war das Tool "Hterm"

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. Zum Beispiel habe ich eine Auto Lead Off Funktion eingebaut, die komplett selbstständig in einstellbaren Zeitabständen den Status der Elektroden einliest und ein Event in der Hauptklasse triggert.

Methoden der EKG Klasse
Methode Beschreibung Parameter Rückgabeparameter
Connect() Versucht eine Verbindung mit der Hardware aufzubauen / bool: true = erfolgreich verbunden, false = verbinden fehlgeschlagen
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
Samplerate Liest aktuell eingestellte Samplerate Setzt die Samplerate (auch im laufenden Sampling)
AutoLeadOffEnabled True = Automatisches Aktiviert bzw. deaktiviert das AutoLOFF
AutoLeadOffIntervall Liest aktuelles Intervall, mit dem der Lead OFF Status abgefragt wird Setzt dieses Intervall


Events die von der EKG Klasse ausgelöst werden können
Event Beschreibung
NewLOFF Wird getriggert, wenn das AutoLeadOff neue LOFF Zustände empfangen hat.
NewData Wird getriggert, wenn neue Daten aus dem Digital Analog Wandler empfangen wurden.

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.


Im folgenden kleinen Codeschnipsel sieht man die Instanziierung einer RollingPointPairList in denen die EKG Samples gespeichert werden. Die Länge der Liste wird dabei auf 1000 Samples begrenzt.

 
//Setzt alle Parameter für das Graph Fenster
void SetupGraph()
{			
       	//Erstelle Liste für LEAD I
	RollingPointPairList LEAD1_list = new RollingPointPairList(1000);
			
	//Erstelle Kurve für LEAD I
	LineItem LEAD1 = GraphWindow.GraphPane.AddCurve("L1",LEAD1_list,Color.FloralWhite,SymbolType.None);
	//Antialiasing für diese Kurve aktivieren
	LEAD1.Line.IsAntiAlias = true;
}

Um nun ein neues Sample in die Liste zu schreiben


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.



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.


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.

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 Bytes nicht auf High wechseln darf. Leider ist genau dies der Fall, wenn man ein Hardware-USIC Modul des Mikrocontrollers für die SPI Kommunikation benutzt. Gezwungenermaßen musste ich also eine eigene Software-SPI Funktion schreiben.


Protokoll für die Kommunikation zwischen PC und µC

Das Protokoll für die Kommunikation zwischen