Optimierung einer sicherheitskritischen Schrittmotorsteuerung
Transcription
Optimierung einer sicherheitskritischen Schrittmotorsteuerung
Optimierung einer sicherheitskritischen Schrittmotorsteuerung für mobile Infusionspumpen Uwe Fechner 4. Juni 2006 Zusammenfassung Ausgehend von einer existierenden Schrittmotorsteuerung für mobile Infusionspumpen wurden die Verbesserungsmöglichkeiten der existierenden Lösung analysiert und auf der Basis einer umfassenden Recherche eine innovative neue Steuerung entwickelt. Hierbei werden sowohl die heute verfügbaren moderneren Bauteile als auch neue Erkenntnisse der Softwaretechnik, des Systementwurfs sicherheitskritischer Echtzeitsysteme und der Mechatronik berücksichtigt. Durch diesen fachübergreifenden Ansatz konnten neben einer erheblichen Kostenreduktion gravierende Verbesserungen der technischen Daten sowie der Verifizierbarkeit und Verlässlichkeit erreicht werden. Inhaltsverzeichnis 1 Vorwort 1.1 Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Abgrenzung des Themas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 6 6 2 Schrittmotorsteuerungen für Infusionspumpen 2.1 Beschreibung des hier betrachteteten Systems . . . . . . . . . . . . . . . . . . . 2.2 Optimierungsziele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 8 9 3 Ausgangssituation 3.1 Leistungsaufnahme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 Sicherheitskonzept . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.1 Kennzeichen sicherheitsgerichteter Echtzeitsysteme . . . . . . . . . . . . 3.2.2 Strategien für die Umsetzung der Anforderungen an sicherheitskritische Echtzeitsysteme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3 Verifizierbarkeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4 Verlässlichkeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.5 Wartbarkeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.6 vorhandene Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.6.1 unterstützte Befehle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.6.2 Eingänge des Aktorprozessors . . . . . . . . . . . . . . . . . . . . . . . . 3.6.3 Ausgänge des Aktorprozessors . . . . . . . . . . . . . . . . . . . . . . . 3.6.4 sonstiges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 10 11 11 4 Stand der Technik 4.1 auf dem Markt verfügbare Alternativen 4.1.1 andere Infusionspumpen . . . . . 4.1.2 fertige Schrittmotorsteuerungen . 4.2 Motoralternativen . . . . . . . . . . . . 4.2.1 Schrittmotoren . . . . . . . . . . 4.2.2 Gleichstrommotoren . . . . . . . 4.3 Getriebealternativen . . . . . . . . . . . 4.4 Architekturalternativen . . . . . . . . . 4.4.1 System-Architektur . . . . . . . 4.4.2 Software-Architektur . . . . . . . 4.5 Prozessoralternativen . . . . . . . . . . . 4.5.1 Auswahlkriterien . . . . . . . . . 4.5.2 Prozessorfamilien . . . . . . . . . 4.6 Auswahl eines Echtzeitkerns (RTOS1 ) . 20 20 20 21 21 21 22 23 23 23 24 26 26 28 30 1 Realtime Operating System 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 15 16 17 17 17 18 19 19 4.6.1 4.6.2 4.6.3 4.6.4 4.6.5 Auswahlkriterien . FreeRTOSTM . . . Salvo . . . . . . . MicroC/OS2 . . . selbstgeschriebener . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Echtzeitkern . . . . . . . . . . . . . . . . . . . . 5 Optimierungsansätze 5.1 verbesserte Systemarchitektur . . . . . . . . . . 5.2 verbesserte Softwarearchitektur . . . . . . . . . 5.3 Verwendung eines besser geeigneten Prozessors 5.4 verbesserte Motoransteuerung . . . . . . . . . . 5.5 Motorüberwachung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 31 31 31 31 . . . . . 32 32 33 34 35 37 6 Umsetzung 6.1 Blockdiagramm . . . . . . . . . 6.2 Schaltplan . . . . . . . . . . . . 6.3 Software . . . . . . . . . . . . . 6.3.1 Formale Anforderungen 6.3.2 Zustandsdiagramme . . 6.3.3 Echtzeitkern (RTOS) . . 6.3.4 Zeitverhalten . . . . . . 6.3.5 Speicherbedarf . . . . . 6.4 Das Labormuster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 40 41 44 44 46 47 48 50 51 7 Ergebnisse 7.1 Drehmoment . . . . . . . . . 7.1.1 Meßaufbau . . . . . . 7.1.2 Meßfehler . . . . . . . 7.1.3 Ergebnisse . . . . . . . 7.2 Leistungsaufnahme . . . . . . 7.2.1 bisheriges System . . . 7.2.2 neues System . . . . . 7.2.3 vergleichende Wertung 7.3 Platzbedarf und Kosten . . . 7.4 Verifizierbarkeit . . . . . . . . 7.5 Verlässlichkeit . . . . . . . . . 7.6 Features . . . . . . . . . . . . 7.7 Ausblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 52 52 52 54 57 57 57 58 59 61 61 62 62 . . . . . . . . . . . . . Literaturverzeichnis 64 A Vergleich von FreeRTOS und MicroC/OS2 65 B Verwendete Softwarewerkzeuge 66 C Weitere Internetquellen 68 4 Abbildungsverzeichnis 2.1 Vereinfachtes Blockdiagramm . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 Blockdiagramm . . . . . . . . . . . . . . Schaltplan . . . . . . . . . . . . . . . . . Motortreiber . . . . . . . . . . . . . . . Formale Anforderungen Hauptprozessor Formale Anforderungen Aktorprozessor Zustandsdiagramm Ramp Controller . . Zustände einer FreeRTOS Task . . . . . Labormuster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 41 42 44 45 46 47 51 7.1 7.2 7.3 7.4 7.5 7.6 Meßaufbau zur Messung des Drehmoments Drehmoment und Wirkungsgrad . . . . . . Stromaufnahme und Wirkungsgrad . . . . . Spitzenstromaufnahme mit alter Steuerung Spitzenstromaufnahme mit neuer Steuerung Motorstromverlauf bei Schrittverlusten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 55 56 58 59 62 5 . . . . . . . . 8 1 Vorwort 1.1 Motivation Die Motivation für die Erstellung dieser Arbeit ergab sich aus den Grenzen, auf die der Verfasser bei seiner beruflichen Tätigkeit in der Entwicklung von Firmware für tragbare Infusionspumpen immer wieder stieß. Die bisherige Firmware basiert auf dem Einsatz von 8051 Prozessor Derivaten, die den Einsatz moderner Software Konzepte sehr erschweren. Die herkömmlichen Software Konzepte stießen an die Grenzen ihrer Leistungsfähigkeit und waren den steigenden Kundenanforderungen in Bezug auf Geschwindigkeit, Genauigkeit, geringem Energieverbrauch sowie einer nachweislich hohen Verlässlichkeit1 nicht mehr gewachsen. Auch im Bereich der Elektronik und der Mechanik schienen Verbesserungen möglich, bzw. es war notwendig, überhaupt einmal Basisdaten wie Wirkungsgrad und Drehmoment zu erfassen, um abschätzen zu können, welche Verbesserungen noch möglich sind. 1.2 Abgrenzung des Themas Thema dieser Arbeit ist die Optimierung der Kernkomponente tragbarer Infusionspumpen2 , der Schrittmotorsteuerung. Zu den Besonderheiten dieser Steuerung gehören: • geringe Leistung (ca. 1 Watt elektrisch) • hohe Sicherheitsanforderungen • geringe Baugröße (ca 3 cm2 Platinenfläche3 , Motorvolumen ca. 7, 4 cm3 ) • es wird eine Drehzahlsteuerung4 mit Schrittzähler5 , nicht eine Positionssteuerung benötigt 1 2 3 4 5 hierzu gehört m.E. auch der Nachweis, daß Zeitschranken garantiert eingehalten werden. Das ist mit dem bisherigen Design nahezu unmöglich. Siehe auch Abschnitt Zeitverhalten“ S. 15 ” ich betrachte im folgenden nur Infusionspumpen mit Peristaltik- oder Kolbenantrieb, deren Pumpköpfe von einer rotierenden Welle angetrieben werden multilayer Platine, einseitige Bestückung beim Pulsbetrieb des Motors wird die mittlere Drehzahl gesteuert wünschenswert, bisher nicht direkt implementiert 6 Die Steuerung besteht aus einem Prozessor, im folgenden Aktorprozessor genannt, der Steuerelektronik, der Meßelektronik für den Spulenstrom, einem Motor und einem Getriebe. Sie erhält ihre Steuerbefehle über ein I2C-Bus6 Interface, über das auch ein Auslesen von Kontrollsignalen möglich ist. Nicht näher betrachtet wird das Benutzerinterface, die sekundären Überwachungssysteme (DMSDrucksensor, Hallsensor, Batteriespannung, Temperatur) und die Alarmsignalisierung. Ebenfalls nicht näher betrachtet werden die Ereignisrekorder für die Überwachung des ordnungsgemäßen Betriebs und die Spannungsversorgung (gerade letztere ist sehr komplex und auch sehr wichtig für einen verlässlichen Betrieb des Gesamtsystems.) Soweit zu Test- und Demonstrationszwecken benötigt, verfügt der Laboraufbau, der im Rahmen dieser Arbeit angefertigt wurde, auch über Benutzerinterface, Hauptprozessor etc. Auf die Funktion dieser Komponenten werde ich nur insofern eingehen, als es zum Verständnis des Gesamtsystems erforderlich ist. 6 von der Firma Philips entworfener Zweidraht-Bus zur Verbindung von MCU’s und Peripherie 7 2 Schrittmotorsteuerungen für Infusionspumpen 2.1 Beschreibung des hier betrachteteten Systems Die Einbettung der Schrittmotorsteuerung in die hier betrachteten Infusionspumpen sei hier kurz erläutert: Abbildung 2.1: Vereinfachtes Blockdiagramm Medizinisches Personal nimmt über die Tastatur die Grundeinstellungen der Pumpe vor (Flußrate, Beutelvolumen, ggf. auch Bolusvolumen1 , Bolussperrzeiten und Dosisgrenzwerte). Der Patient kann i.d.R. die Pumpe lediglich stoppen und starten und sich ggf. einen Bolus abrufen. Der Hauptprozessor übernimmt die Benutzerführung, die Überwachung und Aufzeichnung aller relevanten Daten incl. Flußrate und dem ausgangsseitigen Druck und steuert den Aktorprozes1 ein Bolus ist die Extragabe eines Medikaments auf Anforderung des Patienten 8 sor. Der Aktorprozessor erhält i.d.R. jede Minute einen neuen Förderauftrag vom Hauptprozessor und steuert den Schrittmotor. Der Schrittmotor treibt über ein Getriebe den Pumpkopf an, der das Medikament aus dem Vorratsbeutel über das Überleitsystem dem Patienten zuführt. 2.2 Optimierungsziele Die hier vorliegende Arbeit hat die folgenden Ziele: Optimierungsziele 1. ein hohes Drehmoment bei niedrigem Spitzenstrom2 2. Optimierung der Leistungsaufnahme (Batterielaufzeit) 3. Verbesserung der Softwarequalität, um die Voraussetzungen für eine Zertifizierung der Pumpe durch die FDA3 zu verbessern 4. Erhöhung der Verläßlichkeit des Systems, dazu gehört die Genauigkeit, mit der das geförderte Volumen erfasst wird und die Zeitspanne, in der Fehler erkannt werden 5. Optimierung der Geräuschentwicklung (dies Ziel ist nachrangig, falls es durch eine einfache Änderung der Motoransteuerung erreicht werden kann, dann wäre es schön, um dies Ziel umfassend anzugehen wäre die Entwicklung von Messmethoden nötig, die den Rahmen dieser Arbeit sprengt) 6. Optimierung von Platzbedarf und Kosten Dazu sind folgende vorbereitenden Maßnahmen erforderlich: Vorbereitende Maßnahmen 1. Erfassung von Daten wie Drehmoment und Wirkungsgrad der Einzelkomponenten, um über eine Grundlage für weitere Optimierungsmaßnahmen zu verfügen. Um diese Daten erfassen zu können, muß eine entsprechende Messvorrichtung gebaut werden. 2. Überprüfung, ob der Motor als Sensor für a) den Ausgangsdruck und b) eine Blockade des Antriebs geeignet ist. 2 3 ein niedriger Spitzenstrom ist wichtig, umd die Systemzuverlässigkeit und die Batterielaufzeit zu erhöhen. Hohe Spitzenströme können bei schlechten Batterien zu einem plötzlichen Ausfall der Pumpe – ohne vorherige Batterie schwach“ Warnung – führen ” Federal Drug Administration, amerikanische Gesundheitsbehörde 9 3 Ausgangssituation 3.1 Leistungsaufnahme Die Leistungsaufnahme der Pumpe setzt sich aus folgenden Anteilen zusammen: 1. mechanische Pumpleistung, abhängig vom Druck und der Flußrate 2. Pumpkopf-Verluste 3. Getriebe-Verluste 4. Motor-Verluste 5. Eigenverbrauch Aktorprozessor und Motortreiber 6. Eigenverbrauch Hauptprozessor 7. Verbrauch Display 8. Verluste der Spannungswandler mechanische Pumpleistung Sei FR die Förderrate der Pumpe und p der ausgangsseitige relative Druck. Dann gilt für die mechanische Pumpleistung, die unter Vernachlässigung der Reibungsverluste aufgebracht werden muß: Pmech = p ∗ F R Für die maximal aufzubringende Pumpleistung errechnet sich bei F Rmax = 100 ml/h und pmax = 1500 hP a ein Wert von Pmax = 4, 17mW . Die max. aufgenommene elektrische Leistung1 der Pumpe beträgt bei I = 5 mA + F R ∗ 2 mAh/ml und einer mittleren Entladespannung (Akkubetrieb) von 2,4 Volt: Pmaxel = 205 mA ∗ 2, 4 V = 410 mW Daraus ergibt sich: η = Pmech /Pel = 1, 0 % Hier handelt es sich um den maximalen Wirkungsgrad, bei niedrigeren Flußraten und Drücken ist der Wirkungsgrad noch viel geringer. 1 Die Formel für die Stromaufnahme habe ich dem folgenden Bericht entnommen und beruht auf Messreihen, die 2005 durchgeführt wurden (Köl05) 10 Verluste Punkt zwei bis vier sind in der Vergangenheit noch nie bestimmt worden. Ich habe sie (näherungsweise) messtechnisch erfasst, die Ergebnisse sind im Kapitel 7 auf Seite 52 zu finden. Punkt 6 bis 8 sind nicht Bestandteil dieser Arbeit. Zu Punkt fünf ist folgendes bekannt: Bei maximaler Förderrate liegt die Eigenstromaufnahme des Aktorprozessors bei ca. 8 mA (bei 3,3 V), dies kann gegenüber dem Motorstrom von 100 bis 200 mA (bei 5 V) beinahe vernachlässigt werden. Bei niedriger Förderrate, z.B. 2 ml je Stunde sieht die Situation ganz anders aus: Einem Motorstrom von 2-4 mA steht eine mittlere Prozessorstromaufnahme von 1-2 mA gegenüber. Hier erscheint eine Verbesserung der Laufzeit um 25-100% machbar, da: 1. die auf die Stromaufnahme bezogene Rechenleistung des bisher verwendeten Prozessors mit 0.5 bis 0.25 MIPS/mA (bei 3.3 V) sehr gering im Vergleich zu anderen auf dem Markt erhältlichen Prozessoren ist 2. das bisher verwendete Stromsparkonzept (Umschaltung der Taktfrequenz zur Laufzeit) keinesfalls optimal ist 3.2 Sicherheitskonzept 3.2.1 Kennzeichen sicherheitsgerichteter Echtzeitsysteme 3.2.1.1 keine fehlerhaften Ausgaben zulässig Anders als bei klassischer PC-Software2 , sind bei sicherheitsgerichteten Echtzeitsystemen keine fehlerhaften Ausgaben zulässig, da Fehler zeitnah zur Gefährdung von Menschenleben und/oder der Umwelt führen, also zu Folgen, die sich nicht mehr rückgängig machen lassen. Da es absolute Sicherheit nicht gibt, definiert DIN/VDE 31000 Teil 2 Sicherheit wie folgt: Sicherheit ist eine Sachlage, bei der das Risiko nicht größer als das Grenzrisiko ist. Als Grenzrisiko ist dabei das größte, noch vertretbare Risiko zu verstehen. (vgl. WHRK03, S. 7ff) Ein System, das einen sicheren Zustand“ kennt, wird demnach genau dann als sicher bezeich” net, wenn: 1. es im Falle eines Fehlers in den sicheren Zustand übergeht und Alarm gibt 2. der Übergang in den sicheren Zustand spätestens innerhalb der Fehlertoleranzzeit3 des gesteuerten Prozesses erfolgt 2 3 Software, die nicht direkt an einen physikalischen, chemischen oder medizinischen Prozess gekoppelt ist Zeitspanne, in der ein Prozeß durch fehlerhafte Steuersignale beeinträchtigt werden kann, ohne daß ein gefährlicher Zustand eintritt 11 3. die Wahrscheinlichkeit, das dies nicht passiert, kleiner als das zuvor definierte Grenzrisiko ist Anders als bei klassischer PC-Software, aber auch im Unterschied zu herkömmlichen analog oder diskret aufgebauten Steuerungen gilt für sicherheitsgerichtete Echtzeitsysteme: 1. Der Nachweis, daß das erforderliche Sicherheitsniveau erreicht wurde, kann durch Tests nicht erbracht werden 2. Ein Fehlerausschluss4 aufgrund konstruktiver Merkmale der verwendeten Bauteile ist bei prozessorbasierten Systemen nicht mehr möglich 3. aufgrund des unstetigen Verhaltens von Softwaresystemen (ein falsches Bit kann zu maximalem Schaden führen) sind weitgehendere Schutzmaßnahmen als bei herkömmlichen, analogen Systemen zu treffen 3.2.1.2 Rechtzeitigkeit Bei Echtzeitsystemen spielt die Dimension der Zeit eine große Rolle. Steuerbefehle müssen nicht nur richtig, sonder auch rechtzeitig erteilt werden. Beispielsweise muß bei der hier betrachteten Infusionspumpe genau angegeben werden: 1. wieviel Sekunden nach dem Auftreten eines Überdrucks eine Abschaltung erfolgen muß (ein zu spät detektierter Überdruck führt dazu, daß das System undicht wird) 2. wieviele Millisekunden nach der Detektion einer Pumpkopfdrehung5 die Druckmessung erfolgen muß (da der Druck während einer Umdrehung schwankt, ist anderenfalls die Bestimmung des Maximaldrucks unmöglich) 3. wieviel Millisekunden nach der Abwicklung eines Minutenauftrags ein neuer Auftrag erteilt werden muß (eine Überschreitung dieser Zeit führt zu Fehlern in der Förderung, die sich aufaddieren und ggf. zur Abschaltung der Pumpe wegen Unterförderung führen.) Bei Echtzeitsystemen ist es somit von zentraler Bedeutung, alle Reaktionszeiten auf externe Ereignisse präzise zu spezifizieren und bei der Umsetzung darauf zu achten, daß diese Zeiten in jedem Fall eingehalten werden. 3.2.1.3 Gleichzeitigkeit Teilweise ist es auch von Bedeutung, daß verschiedene Steuersignale gleichzeitig abgegeben werden. In dem Falle muß die maximal zulässige Abweichung der Signale voneinander spezifiziert werden. 4 5 diese Aussage bezieht sich ausschließlich auf die prozessorbasierte elektronische Steuerung. Auf Systemebene ist ein Fehlerausschluss sehr wohl möglich, z.B. kann die hier betrachtete Pumpe aufgrund der Leistungsfähigkeit des verwendeten Motors nie mehr als ca. 130 ml/h fördern. Pumpkopf in Position 0◦ , maximaler Druck, eine mögliche Winkeltoleranz muß separat betrachtet werden 12 3.2.2 Strategien für die Umsetzung der Anforderungen an sicherheitskritische Echtzeitsysteme 3.2.2.1 Fehlertoleranzmaßnahmen Bei der bisherigen Schrittmotorsteuerung wurden eine Vielzahl von Fehlertoleranzmaßnahmen implementiert mit dem Ziel, ein durch Software- oder Hardwarefehler bedingtes Fehlverhalten erkennen zu können, um dann entweder Fehlerkorrekturmaßnahmen einzuleiten, oder die Infusionspumpe in einen sicheren Zustand (Pumpe ist aus) zu überführen. Zu den Fehlertoleranzmaßnahmen gehören: 1. Maßnahmen zur Fehlererkennung 2. Redundanzmaßnahmen 3. die Verwendung einer Watchdog“ ” Maßnahmen zur Fehlererkennung Folgende Maßnahmen sind bisher realisiert: 1. Absicherung von Datenpaketen, die zwischen Prozessoren übertragen werden, per CRC16 2. Absicherung von Datenpaketen durch Übertragung der normalen und der invertierten Daten 3. Absicherung von RAM-Daten durch Vierfachspeicherung von jeweils mit orthogonalen Faktoren exklusiv-oder verknüpften Datenworten 4. Plausibilitätsprüfung von Förderaufträgen 5. Überwachung der Flußrate durch Zählung der Umdrehung des Pumpkopfantriebs 6. Drucküberwachung 7. Überwachung aller Betriebsspannungen sowie der Batteriespannung 8. Selbsttest mit Überprüfung der CRC des Programmcodes Redundanzmaßnahmen Folgende Maßnahmen sind bisher realisiert: 1. zeitliche Redundanz bei der Datenübertragung 2. redundante Speicherung wichtiger Daten im RAM 3. redundante Spannungsversorgung (Batterie, Netz, Hilfsbatterie) 4. redundante Alarmgeber (rote LED, Hupe, Piepser) 5. redundante Notabschaltung 13 Watchdog-Funktionalität Bisher realisiert: 1. ein Absturz des Hauptprozessor wird vom Uhrenprozessor erkannt und führt zu einem System-Reset mit Restart 2. ein Absturz oder eine unerlaubte Aktivität des Aktorprozessors wird ebenso erkannt und ein Restart versucht 3. ein Absturz des Uhrenprozessors wird vom Ladeprozessor erkannt und führt zu einem Restart 4. ein Absturz des Ladeprozessors wird von seiner Hardware-Watchdog erkannt und führt zu einem Restart 3.2.2.2 Fehlerintoleranzmaßnahmen systematischer Entwurf Bisher realisiert: 1. ansatzweise systematische Erfassung von Anforderungen (in Bezug auf den Aktorprozessor bisher zu vielleicht 85% vollständig) 2. UML Klassen- und Zustandsdiagramme für die Entwurfsspezifikation 3. Reviews (bisher erfolgt bezüglich der Stacknutzung und des atomaren Variablen-Zugriffs) problemadäquate Sprache Da die Verwendung einer besser geeigneten Sprache als C aufgrund der begrenzten Ressourcen bisher nicht möglich ist, wird zumindest versucht, die Typsicherheit durch statische Codeüberprüfung mit Splint sicherzustellen. David Evens schreibt: Splint is a tool for statically checking C programs for security vulnerabilities and programming mistakes. Splint does many of the traditional lint checks including unused declarations, type inconsistencies, use before definition, unreachable code, ignored return values, execution paths with no return, likely infinite loops, and fall through cases. More powerful checks are made possible by additional information given in source code annotations. Annotations are stylized comments that document assumptions about functions, variables, parameters and types. (vergl. EL03, S. 9) 3.2.2.3 Isolation sicherheitskritischer Komponenten Dies Prinzip wird bisher nur unvollständig umgesetzt: Immerhin sind die Uhren- und Watchdog Funktionalität sowie die eigentliche Motoransteuerung jeweils in separaten Prozessoren implementiert. Beides ist hochgradig sicherheitskritisch und noch so klein, daß ein gründlicher Codereview möglich wäre. Der Ladeprozessor erfüllt sowohl sicherheitskritische (Watchdog-Funktionalität) als auch sicherheitsunkritische Aufgaben. Dies stellt eine Verletzung des Prinzips der Isolation sicherheitskritischer Komponenten dar und hat historische Ursachen (nur der Ladeprozessor verfügt 14 über einen Hardware- Watchdog, dessen Stromaufnahme so klein ist, daß er ständig in Betrieb sein kann). 3.3 Verifizierbarkeit Softwaredesign 3.3.0.4 Zeitverhalten Beim Bau von Echtzeitsystemen ist es wichtig, obere Zeitschranken für die Reaktion eines Prozessors auf externe und interne Ereignisse angeben zu können. Bruce Powel Douglass schreibt: In the realm of real-time systems, defining the external timing requirements is crucial to understanding of the problem. An otherwise correct result delivered past its deadline is a system failure in a hard real-time environment. (vgl. Dou98, S. 64) Den Nachweis zu erbringen, daß externe Zeitschranken in jedem Fall eingehalten werden, ist jedoch beim bisherigen Softwaredesign nahezu unmöglich, da: 1. der Mainloop/ IRQ Ansatz verwendet wird 2. mit mehreren verschachtelten Interruptebenen gearbeitet wird 3. sehr große Interrupts mit Unterprogrammaufrufen verwendet werden 4. die Taktfrequenz zur Laufzeit in vielen Stufen umgeschaltet wird Ursächlich für die Wahl dieses Softwaredesigns sind zum Teil fehlende Features in der Hardware: 1. zu wenig RAM 2. kein schneller Hardware-PWM Ausgang Die Taktumschaltung zur Laufzeit ließe sich auch bei der gegebenen Hardware vermeiden. 3.3.0.5 direkte Umsetzung von Zustandsdiagrammen Die Verifizierbarkeit von Software wird bei einer Softwareentwicklung in Anlehnung an den Rational Unified Process (vgl. SW03, S. 25ff) sehr erleichtert, wenn eine direkte Zuordnung von Zustandsmaschinen zu Klassen gegeben ist (vgl. MS02). Dies ist bisher nicht wirklich der Falls, zum Teil aus dem Grunde, daß die Registerbank-Architektur des 8051 Prozessors eine Verwendung von Funktionen aus verschiedenen Interrupts heraus oft nicht erlaubt. Dadurch wird es nahezu unmöglich, automatisch aus Zustandsdiagrammen erzeugten Code zu verwenden, der die Verfizierbarkeit stark verbessern könnte. 15 Testbarkeit 3.3.0.6 in der Entwicklung 1. da kein freier RS232 Ausgang vorhanden ist, muß das Debuggen indirekt über den I2CBus erfolgen. Das ist sehr aufwendig in der Programmierung, da jede neue Variable, die ausgelesen werden soll, Codeänderungen an drei Prozessoren (PC, Hauptprozessor, Aktorprozessor) erfordert. 2. es ist für den bisher verwendeten Prozessor kein on-Chip-Emulator verfügbar, der eine Alternative zum Debuggen über den RS232 oder I2C-Port darstellen könnte 3. ein Umprogrammieren des Prozessors bei eingeschalteter Versorgungsspannung ist unmöglich. Dies erhöht die Turnaround-Zeit erheblich. 3.3.0.7 in der Produktion Eine Verifikation des geflashten Codes ist mit dem in-Curcuit-Programmer nicht möglich. Ersatzweise wird die Korrektheit des Flashvorgangs über eine CRC geprüft, diese Prüfung erfolgt allerdings indirekt und hat eine schlechtere Fehlererkennungsrate als ein echtes Verify. 3.4 Verlässlichkeit Verlässlichkeit ist ein Oberbegriff für Verfügbarkeit, Zuverlässigkeit, Sicherheit, Vertraulichkeit (der Daten), Datenintegrität und Wartbarkeit. Eine hohe Verlässlichkeit kann mit Maßnahmen zur Fehlervermeidung, Fehlertoleranz, Fehlerbehebung und der Fehlervorhersage erreicht werden. Eine ausführliche Beschreibung des Konzepts der Verlässlichkeit findet sich in (ALR00). unnötig komplexes Software-Design Die Berechnung der Pausenzeiten zwischen den Pulsgruppen ist aufgrund der Taktumschaltung zur Laufzeit unnötig kompliziert. Die Wakeup-Logik und der Sleep-Timer wären überflüssig, wenn der verwendete Prozessor über eine Wakeup-on-I2C-address-recognition“ Logik verfügen ” würde. ungenaue Steuerbarkeit Bisher fehlt die Möglichkeit, vom Hauptprozessor aus die tatsächlich abgegebenen Motorschritte zurückzulesen. Da der Hauptprozessor die theoretischen Motorschritte nur im Sekundenraster berechnet, aber Start- und Stopvorgang asynchron zum Sekundentakt erfolgen, ergibt sich daraus ein Volumenfehler von 1-2 Sekunden Förderung je Start/Stop- Vorgang. Dies wirkt sich insbesondere auf die Dosiergenauigkeit kleiner Boli negativ aus. 16 keine schnelle Erkennung von Aussetzern möglich Die Verlässlichkeit der Pumpe kann deutlich erhöht werden, wenn Aussetzer des Motors (z.B. aufgrund von Verschmutzung des Getriebes oder aufgrund schwacher Batterie) schneller erkannt werden (also wenn der Arzt/ die Schwester noch im Zimmer ist und nicht erst 10 Minuten später). Dazu wäre eine Motorstromüberwachung, die Schrittverluste zuverlässig erkennt, gut geeignet. Etwas ähnliches hat Prof. Schlienz im Artikel Der Schrittmotor, der nicht ausrastet“ beschrie” ben (vergl. Sch02). Sein Ansatz basiert allerdings auf einer Mikroschrittansteuerung, bietet den Vorteil der Fehlervermeidung anstelle einer Fehlererkennung aber erscheint mir doch für den hier vorliegenden Einsatzzweck etwas zu aufwendig. Bisher wird eine Blockade des Motors erst erkannt, wenn vier Hall-Impulse fehlen. Dies kann bei niedrigen Förderraten lange dauern (z.B. 8 Minuten bei einer Förderrate von 2 ml/h). 3.5 Wartbarkeit Die Wartbarkeit des Aktorprozessors ist insofern besser als früher, als eine recht vollständige UML-Spezifikation existiert. Die Wartbarkeit des bisherigen Systems würde ich trotzdem als schlecht einschätzen, u.a. aus dem Grund, daß nur noch sechs Bytes von 128 Bytes an RAM (zzgl. 128 Bytes Stack) verfügbar sind. 3.6 vorhandene Features 3.6.1 unterstützte Befehle Es handelte sich um Befehle, die der Hauptprozessor an den Aktorprozessor über den I2C-Bus erteilt werden und die vom Aktorprozessor verstanden werden müssen. • AC DATA <wGroupCount> <wDelayCount> <bDelayPart> dieser Befehl erteilt einen Förderauftrag, der aus wGroupCount Pulsgruppen besteht (eine Pulsgruppe = b 96 Motorschritten oder zwei Motorumdrehungen). Für die Länge einer Pulsgruppe gilt: tg = 181.17 ms Die Pause zwischen den Pulsgruppen wird von den Parametern <wDelayCount> und <bDelayPart> bestimmt. tp = (wDelayCount + bDelayP art/256) ms 17 die Dauer eines Förderauftrags ergibt sich aus folgender Formel: ( wGroupCount ∗ (tg + tp ) für wGroupCount > 0 tF A = tp für wGroupCount = 0 Dabei ist (für tF A ' 60 sec) eine Abweichung von max. ± 200 ms zulässig. Ein mit dem Befehl AC DATA erteilter Förderauftrag beginnt zur nächsten vollen halben Sekunde (mit der nächsten Flanke am Eingang MASTERCLOCK“ ). ” Ein laufender Förderauftrag mit einer Restlaufzeit, die vor der nächsten vollen halben Sekunde endet wird vom Befehl AC DATA nicht abgebrochen, ein länger dauernder Förderauftrag aber sehr wohl. • AC ASYNC DATA <wGroupCount> <wDelayCount> <bDelayPart> wie AS DATA, aber ein laufender Förderauftrag wird nach dem Ende der laufenden 8Halbschritt-Gruppe abgebrochen und dann sogleich der neue Auftrag begonnen (falls der Motor stand, wird nach CRC und Plausibilitätsprüfung sofort mit der Förderung begonnen). • AC STOP hält den Motor nach Ende der laufenden 8-Halbschritt-Gruppe sogleich an. • AC GET LAST CRC liest die CRC des letzten übertragenen Datenpakets zurück. • AC GET LAST ERROR ermittelt den letzten aufgetretenen Fehler. Mögliche Werte: ERR CRC ACTOR (CRC-Fehler des Programm-Speichers) ERR DATA (Förderauftrag länger als 75 Sekunden) Zur Absicherung der Datenübertragung wird bei allen GET-Befehlen das Datenwort einmal normal und zusätzlich invertiert übertragen. 3.6.2 Eingänge des Aktorprozessors • I2C DATA (Datensignal des I2C Steuerbusses vom Hauptprozessor) • I2C Clock (Taktsignal des I2C Steuerbusses) • MASTERCLOCK (1 Hz Signal mit 50% Einschaltdauer) • RESET 18 3.6.3 Ausgänge des Aktorprozessors • OUT1a (zum Treiber für Spule1 Pin a) • OUT1b (zum Treiber für Spule1 Pin b) • OUT2a (zum Treiber für Spule2 Pin a) • OUT2b (zum Treiber für Spule2 Pin b) • WDReset (Watchdog-Reset) • CRC READY (Dies Signal wird gesetzt, wenn die CRC eines Datenpakets berechnet und bereitgestellt wurde, und zurückgesetzt, wenn ein Befehl empfangen wurde.) Die Ausgänge steuern über einen Treiberbaustein direkt einen bipolaren Schrittmotor. Die Ansteuerung erfolgt im Halbschrittbetrieb. Eine Pulsgruppe besteht aus einer Hochlaufphase von vier Motorschritten, einer Phase mit voller Drehzahl von 88 Motorschritten und einer Bremsphase von vier Motorschritten. Das Signal WDReset wird zumindest alle 600 ms getoggelt, solange der Aktor über einen gültigen, nicht abgelaufenen Förderauftrag verfügt (dies kann auch ein Null-Auftrag (Null Pulsgruppen, aber einer Pausenzeit 6= Null) sein). 3.6.4 sonstiges Die bisherige Steuerung verfügt über weitere Befehle sowie Ein- und Ausgänge, die aber nur zu Test- und Konfigurationszwecken bzw. dem alten (zukünftig nicht mehr notwendigen) Powermanagement dienen und hier nicht näher betrachtet werden. 19 4 Stand der Technik 4.1 auf dem Markt verfügbare Alternativen 4.1.1 andere Infusionspumpen Die einzige mir bekannte andere tragbare Infusionspumpe, die WalkmedTM 300, verfügt über folgende Eigenschaften: 1. Flußrate 0,1 bis 9,9 ml/h 2. Stromaufnahme1 - ca. 3.8 mA bei 5 ml/h Flußrate - ca. 1.2 mA bei 0,5 ml/h Flußrate Bei einer mittleren Entladespannung von 7.8 Volt bei der WalkmedTM und von 2.4 Volt für die PEGASUS light C gilt für die Leistungsaufnahme2 : Flußrate (ml/h) 5.0 0.5 WalkmedTM (mW) PEGASUS light C (mW) 29,5 9,4 36.0 14.4 Tabelle 4.1: Leistungsaufnahme Somit ist erkennbar, daß die Leistungsaufnahme der WalkmedTM zumindest laut Gebrauchsanweisung etwas niedriger ist als die Leistungsaufnahme der Infusionspumpe, deren Schrittmotorsteuerung hier optimiert werden soll. Fairerweise muß aber beachtet werden, daß die PEGASUS Pumpe die zehnfache maximale Förderrate und den dreifachen Abschaltdruck (1500 hPa anstatt 500 hPa) bietet. Inwiefern die Leistungsaufnahme vom ausgangsseitigen Druck abhängt, darüber sind in den Gebrauchsanleitungen keine Angaben zu finden. 1 2 berechnet unter der Annahme der Verwendung einer Alkali-Mangan 9V Batterie mit 625 mAh Kapazität gemäß den Laufzeitangaben in der Gebrauchsanweisung die Stromaufnahme der light C habe ich gemäß folgender Formel berechnet: I = 5mA + Flußrate ∗ 2mAh/ml 20 4.1.2 fertige Schrittmotorsteuerungen Es gibt zahlreiche IC’s auf dem Markt, die über einen I2C oder SPI Bus Befehle entgegennehmen und einen (oder mehrere) Schrittmotoren ansteuern können. Als typischen Vertreter betrachte ich hier die Eigenschaften des TMC246 der Firma TRINAMIC 3 . 1. Betriebsspannung: zumindest 7 Volt erforderlich, zur Zeit verfügbar lediglich 5 Volt 2. Kosten: Die Stückpreise liegen deutlich über 5 EUR je Stück. Eine Eigenentwicklung ermöglicht niedrigere Stückkosten, allerdings müssen natürlich auch die Entwicklungskosten berücksichtigt werden 3. Stromaufnahme: Da alle mir bekannten Schrittmotorsteuerungen den intermittierenden Betrieb mit Pulsgruppen-Ansteuerung nicht beherrschen, ist mit einer erheblich höheren Stromaufnahme zu rechnen. 4. Sicherheit: Kein mir bekannter Ansteuer-IC ist für sicherheitskritische Steuerungen zugelassen. Bei dem jetzigen System-Design ist es zwingend erforderlich, daß: - die Steuerung Förderaufträge mit mehr als 75 Sekunden Dauer nicht ausführt - eine Watchdog Funktionalität integriert ist - Selbsttest- Funktionalität integriert ist Schon allein das Sicherheits-Kriterium ist ein Knock-Out Kriterium für die Verwendung von auf dem Markt verfügbaren integrierten Schrittmotorsteuerungen. 4.2 Motoralternativen 4.2.1 Schrittmotoren 4.2.1.1 Motoren In der Literatur sind so gut wie keine Angaben zum Wirkungsgrad von Schrittmotoren zu finden. Die einzigen Angaben, die ich fand waren: 1. der Wirkungsgrad sei niedrig4 2. er hänge stark von der Ansteuerelektronik ab 3. das einzige Messprotokoll, was ich fand5 , ergab einen Wirkungsgrad von knapp über 50 % Unter den Schrittmotoren haben die Scheibenmagnet-Schrittmotoren, z.B. von ESCAP6 die besten technischen Daten. Insbesondere bieten Sie: • geringe Eisenverluste (und somit hohen Wirkungsgrad) 3 4 5 6 siehe auch Website der Firma TRINAMIC: http://www.trinamic.com. vergl.: http://www.energie.ch/themen/industrie/antriebe/ vergl.: http://www.roboternetz.de/phpBB2/viewtopic.php?p=12687 Homepage des Herstellers Danaher Motion: http://www.danahermotion.com/Entry_Pages/Portescap.htm 21 • bei Mikroschrittansteuerung optimale Linearität (und somit hohe Laufruhe) Von daher könnte sich eine Prüfung des P110 series 16 mm motor“ lohnen. ” 4.2.1.2 Motoransteuerungsmethoden elektrische Ansteuerung Hier ist zwischen der Spannungssteuerung (Betrieb mit konstanter Spannung), der Stromsteuerung (Betrieb mit konstantem Strom) und der gemischten Steuerung (Spannungsquelle mit Vorwiderstand) zu unterscheiden. Stand der Technik ist die Stromsteuerung mit Stromabsenkung im Ruhezustand, da diese ein relativ konstantes Drehmoment unabhängig von der Drehzahl bietet (vergl. REGT05). Schrittsteuerung Mögliche Betriebsarten: • Vollschrittsteuerung (einfach, unruhiger Lauf) • Halbschrittsteuerung • Mikroschrittsteuerung (aufwendig, sehr ruhiger Lauf) Bei der Halbschrittsteuerung sollte der Strom pro Spule in den Phasen, wo beide Spulen be√ stromt werden, auf 1/ 2 abgesenkt werden. Bei der Mikroschrittsteuerung erfolgt die Ansteuerung der beiden Spulen mit einem Strom, der proportional zum Sinus bzw. zum Kosinus des Mikroschrittwinkels ist. 4.2.2 Gleichstrommotoren Gleichstrommotoren bieten einen höheren Wirkungsgrad (bei Motoren mit 1 W Nennleistung bis zu 80 %), allerdings benötigen Sie zusätzlich einen (z.B. optischen) Encoder zur Drehzahlregelung. Außerdem kann die Verwendung von bürstenbehafteten Gleichstrommotoren EMVProbleme mit sich bringen, und nicht zuletzt ist ihre Lebenserwartung schlechter als die eines Schrittmotors. Gleichstrommotoren können außerdem nur dann verwendet werden, wenn z.B. durch Verwendung einer Peristaltik mit Schneckenantrieb sichergestellt ist, daß der Pumpkopf im stromlosen Zustand blockiert. Ich habe bisher keine bürstenlosen Gleichstrommotoren gefunden, die für eine so geringe Leistung und Drehzahl, wie hier benötigt, geeignet wären. 22 4.3 Getriebealternativen Zur Zeit wird ein zweistufiges Stirnradgetriebe mit einer Untersetzung von 1:25 und einem Modul von 2 mm verwendet. Für die Ankopplung des Antriebs an die Peristaltik werden zwei Kegelräder mit jeweils 16 Zähnen verwendet. Als Alternative könnte ein Planetengetriebe in Frage kommen, daß einen hohen Wirkungsgrad η ≈ 0, 85 bietet und hohe Momente übertragen kann (vergl. BGJ02, S. 35). Das Kegelradgetriebe ist aufgrund der kleinen Zahnräder und der Notwendigkeit der genauen Ausrichtung der Achsen nicht unproblematisch. Eine Alternative könnte der Hypoidantrieb darstellen. Im Gegensatz zum normalen Kegelradantrieb sind hier die Achsen von Antriebsund Tellerrad versetzt, schneiden sich also nicht. Durch die Desaxierung wird das Antriebsrad größer, das Tellerrad kleiner gestaltet und es befinden sich mehr Zähne im Eingriff. Dadurch erhöhen sich die Laufruhe und die Belastbarkeit bei gleichzeitiger Platzersparnis. (aus: Wik05) Als weitere Alternative kämen Kronräder in Frage, bei denen eine der Achsen frei verschiebbar bleibt. Die Wiederentdeckung der Kronräder für technische Anwendungen begann in den 1990er Jahren als Alternative zu Kegelrädern, als Fertigungs- und Berechnungsverfahren zur Verfügung standen, um Kronräder automatisiert in größeren Stückzahlen zu fertigen. (aus: Wik06) 4.4 Architekturalternativen 4.4.1 System-Architektur Da es für den Aufbau von Infusionspumpensteuerungen keine direkt passende DIN Norm gibt, orientiere ich mich hier an den von DIN VDE 0801 (vergl. VDE95) für sichere, speicherprogrammierbare Steuerungen definierten Anforderungsklassen. Ich gehe davon aus, daß für den Einsatz der Infusionspumpe mit Medikamenten, die nicht lebensnotwendig sind eine Steuerung analog der Anforderungsklasse 4 (AK4) (normale Verfügbarkeit) genügt, während bei lebensnotwendigen Medikamenten eine Steuerung analog der Anforderungsklasse 5 (AK5) (hohe Verfügbarkeit und/oder Sicherheit) mir angemessen erscheint. Für AK5 ist - außer Selbsttests der Zentraleinheit (ZE) und testbaren E/A- Baugruppen die redundante Auslegung der Zentraleinheit vorgeschrieben. Eine solche Systemarchitektur erscheint mir auch für die gegebene Aufgabenstellung sehr attraktiv: Eine redundante Auslegung der ZE ist heute mit sehr geringem Aufwand (Platz, Kosten, Energie) machbar. Durch den Einsatz diversitärer Software auf identischer Standard-Hardware sowie dem Vergleich von Zwischenergebnissen läßt sich eine sehr gute Fehlererkennungsrate sowohl bei Hardware- als auch bei vielen Software Fehlern erreichen (insbesondere bei Compilerund Biblioteksfehlern). 23 Diversitäre Software läßt sich auf einfache Weise dadurch erzeugen, daß derselbe Quellcode von verschiedenen Compilern übersetzt wird. Zusätzlich müssen alle sicherheitskritischen Algorithmen identifiziert und durch manuelle Diversität und/oder durch Zurückrechnen überprüft werden. Das Prinzip der Isolation sicherheitskritischer Komponenten läßt sich per Hardware oder per Software umsetzten. Eine Softwareimplementation könnte wie folgt aussehen: 1. Überwachungsfunktion als separate Task 2. nur in dieser Funktion wird der on Chip Hardware-Watchdog zurückgesetzt 3. wenn der Watchdog zuschlägt wird das System in den sicheren Zustand überführt und gibt Alarm Eine hinreichend geringe Fehlerwahrscheinlichkeit des Codes dieser Task könnte z.B. durch einen Codereview, am besten auch auf der Ebene des Maschinencodes sichergestellt werden. Eine Hardwareimplementierung würde ein bis zwei zusätzliche Prozessoren erfordern7 . Das könnte zwar die Sicherheit weiter erhöhen, führt aber aufgrund der gestiegenen Systemkomplexität auch zu einer Verringerung der Verfügbarkeit. 4.4.2 Software-Architektur Wahl der Programmiersprache Aus Kostengründen sowie aus Platz- und Energiemangel muß die Software für den Einsatz mit sehr stark begrenzten Ressourcen optimiert werden. In diesem Umfeld entspricht der Einsatz von C als Programmiersprache dem Stand der Technik, insbesondere wenn ein statischer Codechecker wie z.B. Splint8 zur Gewährleistung der Typsicherheit zum Einsatz kommen (siehe auch S. 14). Noch besser wäre eine Codierung gemäß den MISRA9 C Regeln (vergl.: Scz02). MISRA C (2004) definiert eine Untermenge der Sprache C für den Einsatz in sicherheitskritischen Systemen. Diese Untermenge wird über 121 verpflichtende und 20 empfohlene Regeln definiert, deren Einhaltung zu 80-90 % mit automatischen Werkzeugen10 sichergestellt werden kann. Die Einhaltung der restlichen Regeln kann nur manuell (über Codierungsrichtlinien und Codereviews) überprüft werden. MISRA C stellt einen anerkannten Standard für die Codierung sicherheitskritischer Systeme in C dar, der zwar aus der Automobilindustrie stammt, aber auch in anderen Anwendungsgebieten wie der Medizintechnik immer mehr Verbreitung findet. Die Verwendung von C++ würde folgende Vorteile bieten: 7 8 9 10 Prof. Halang hat ein solches System, das DIMI 40 in (WHRK03, S. 89ff) ausführlich beschrieben Secure programming lint: Ein Open Source Werkzeug entwickelt an der Universität von Virginia. (vergl. EL03) Motor Industry Software Reliability Association derartige Werkzeuge verursachen allerdings Kosten im 4-stelligen Euro Bereich. Wenn man sich damit zufrieden gibt, ca. 82% der zwingend einzuhaltenen Regeln von MISRA C (1998) automatisch überprüfen zu können, kann man auch preiswerte Werkzeuge wie PC-lint einsetzen 24 1. Einfachere Codegenerierung aus UML-Diagrammen 2. bessere Umsetzung des Prinzips des information hiding“ durch Unterstützung von pri” vaten und geschützten Attributen Allerdings ist es in C++ sehr leicht, durch unbedachte Verwendung leistungsstarker Features Code zu erzeugen, der hohe Kosten (RAM/ Laufzeit) verursacht. Bei der Verwendung von C hat man die Kosten besser im Blick. Die Komplexität von C++ erhöht die Wahrscheinlichkeit von Compilerfehlern und erschwert die Zertifizierung von Compilern für sicherheitskritische Systeme. Als eine weitere Alternative käme NesC11 in Frage, das als C-Präprozessor implementiert ist und eine gute Unterstützung für nebenläufige Programmierung bietet. Betriebssysteme für eingebette Systeme Stand der Technik für die Programmierung von Echtzeitsystemen sind präemptive und kooperative Echtzeitkerne (RTOS), die sowohl in C als auch in Assembler in großer Zahl verfügbar sind. Diese Echtzeitkerne verfügen allerdings in der Regel nur über sehr wenige Gerätetreiber, so daß viele Gerätetreiber (z.B. für den I2C Bus oder für einen Schrittmotor) individuell implementiert werden müssen. Bei der Implementierung von Gerätetreibern dürfen Interrupts nur mit großer Vorsicht verwendet werden, da es andernfalls sehr schwer wird, Zeitschranken für die Funktionen des Hauptprogramms zu berechnen. Verschachtelte Interrupts sind Tabu. Wolfgang Halang schreibt (vgl. WHRK03, S. 140): • Der Gebrauch von Unterbrechungen soll zugunsten zyklischer Abfragens eingeschränkt werden • Unterbrechungen dürfen nicht geschachtelt werden • Unterbrechungen dürfen benutzt werden, wenn sie ein System vereinfachen Entwurfsmethoden Aus Sicherheitsgründen sollte der Top-Down Entwurf12 verwendet werden (vergl. WHRK03, S. 132), hierbei gilt UML, insbesondere UML-Zustandsdiagramme als Mittel der Wahl für die Entwurfsspezifikation. Für die Umsetzung von UML Zustandsdiagrammen in Klassen empfiehlt sich die Verwendung von C+, einer einfachen Methode zur objektorientierte Programmierung in C, die lediglich ANSI C voraussetzt, wenig Overhead hat und sowohl für die manuelle als auch für die automatische Codegenerierung gut geeignet ist. (vergl. MS02, S. 335ff) 11 12 Komponenten orientierte Sprache, Basis von TinyOS, einem Betriebssystem für drahtlose Sensornetzwerke das bedeuted, von einer Menge schriftlich formulierter formaler Anforderungen ausgehend (die vollständig und widerspruchsfrei sein muß) eine UML Entwurfsspezifikation zu entwickeln und darauf aufbauend erst den Code zu schreiben, wobei die Rückverfolgbarkeit jeder Codezeile zu einer formalen Anforderung gegeben sein muß 25 Die Verwendung von Programmiersystemen mit vollautomatische Codegenerierung wie Rhapsody wäre zwar möglich, sprengt aber etwas den Rahmen der hier gegebenen doch recht überschaubaren Aufgabenstellung. Zusammenfassung • C, insbesondere MISRA C entspricht durchaus dem Stand der Technik • C++ kann für größere eingebettete Systeme eine gute Alternative darstellen • andere Sprachen wie NesC, Pascal oder Ada haben insbesondere den Nachteil der kleineren Compiler Auswahl, was den Einsatz diversitärer Compiler nahezu unmöglich macht • die Verwendung eines Echtzeitkerns bietet große Vorteile bei der Verifizierung des Zeitverhaltens, der Einfachheit der Programmierung und der Erweiterbarkeit der Software, wenn seine Verlässlichkeit entweder aufgrund seiner Betriebsbewährtheit und/oder seiner Kleinheit und Lesbarkeit des Quellcodes sowie der Verfügbarkeit einer automatischen Testsuite verifiziert werden kann • systematische Anforderungserfassung, Top-Down Entwurf, UML als Sprache für die Entwurfsspezifikation sowie die Verwendung von in C+ implementierten Zustandsmaschinen entsprechen dem Stand der Technik 4.5 Prozessoralternativen 4.5.1 Auswahlkriterien Die folgenden Auswahlkriterien habe ich für den Einsatz von Prozessoren in mobilen Infusionspumpen erarbeitet. Bisher kommt in den Pumpen u.a. ein kleiner“ Aktorprozessor (8 kBytes ” Flash) und ein großer“ Hauptprozessor (mit 128 kBytes externem Flash) zum Einsatz. ” Wünschenswert erscheint mir: • zukünftig nur noch Prozessoren mit internem Daten- und Programmspeicher einzusetzen, da dadurch die Zuverlässigkeit erhöht und die Stromaufnahme erheblich gesenkt wird • nur eine Prozessorfamilie sowohl für große als auch für kleine Aufgaben zu verwenden, um Synergieeffekte beim Lernaufwand und bei der Anschaffung von Werkzeugen nutzen zu können13 . Konkret ergeben sich daraus die folgenden Auswahlkriterien: 1. Stromaufnahme - Imax (maximale Stromaufnahme) - IRuhe (maximale Stromaufnahme für Datenerhalt) 13 um Diversität der sich gegenseitig überwachenden Einheiten zu gewährleistet, ist die Verwendung diversitärer Compiler wirksamer als diversitäre Hardware. Eine nähere Begründung erfolgt in 5.1 26 - MIPS14 / mA (die auf die Stromaufnahme bezogene Rechenleistung bei 3.3 V)15 2. Betriebsspannung/en - für 3.3 V verfügbar16 - zwei Spannungen erforderlich 17 3. linearer Programmspeicher > 64 kBytes 18 4. mit internem Flash bis 256 kBytes verfügbar 19 5. interner Flash mit Bootloader Sektion (wichtig für nachträgliche Firmware Aktualisierungen) 6. mit internen RAM ≥ 4 kBytes verfügbar 7. sowohl klein (20 Pin) als auch groß (100 Pin) verfügbar 8. Peripherie - Anzahl Timer - Watchdog mit niedriger Stromaufnahme - RTC mit niedriger Stromaufnahme - I2C Ports - SPI Ports - PWM Ausgänge - A/D-Wandler (Anzahl Kanäle, Auflösung, Geschwindigkeit) - wakeup on I2C adress recognition, wakeup on pin change 9. Verfügbarkeit von Software Werkzeugen - Compiler Verfügbarkeit einer Kommandozeilenversion Einbindung in die IDE Eclipse Quelltext der Biblioteken MISRA C Unterstützung - Simulator 14 15 16 17 18 19 Millionen Maschinenbefehle pro Sekunde diese Angabe ist mit Vorsicht zu betrachten. Ich verwende sie als groben Schätzwert für die Integer Rechenleistung, die Wortbreite spielt natürlich - neben vielen anderen Faktoren - auch noch eine Rolle. Beim Vergleich von Prozessoren gleicher Wortbreite kann dieser Wert als erster Anhaltspunkt dienen. da viele der hier verwendeten Sensoren 3.3 V benötigen macht eine andere Spannung jetzt und in den nächsten Jahren wenig Sinn manche Prozessoren benötigen zusätzlich zu den 3.3 V eine weitere Betriebsspannung Banking benutzen zu müssen, weil der lineare Adressbereich nicht ausreicht, ist zeitaufwendig, fehlerträchtig und macht ein deterministisches Zeitverhalten unmöglich das entspricht dem doppelten des bisher maximal benötigten Programmspeichers 27 - Emulator - RTOS - Biblioteken I2C Treiber LCD Treiber TCP Treiber Verschlüsselungs- Module 10. on Chip debugging möglich 4.5.2 Prozessorfamilien Ich betrachte hier die bisher verwendete Prozessorfamilie (8051 Derivate) sowie zwei mögliche Alternativen mit besonders guten technischen Eigenschaften. 8051 Derivate die Stromaufnahme bezieht sich auf den bisher verwendeten P89LPC922 Prozessor von Philips, ein aktuelles Modell mit vergleichsweise guten Werten - kein linearer Adressraum > 64 kByte - kein Hardware-Stack > 256 Bytes möglich - nur ca. 0.25 bis 0.5 MIPS/mA bei 8 Mhz Taktfrequenz o als RTOS von den hier betrachteten nur Salvo verfügbar + große Typenvielfalt + viele Hersteller Atmel AVR Familie alle Zahlenangaben beziehen sich auf die Prozessoren ATmega168 und ATmega1281, die den o.g. Auswahlkriterien am besten genügen + linearer Adressraum bis 16 MByte + Hardware Stack nur durch RAM Größe begrenzt + ca. 1 MIPS/mA bei 8 Mhz Taktfrequenz + schnelle PWM verfügbar20 20 für die hier betrachtete Schrittmotorsteuerung sollte die PWM Frequenz über 20 kHz liegen, damit das Choppen unhörbar ist 28 + phasensynchrone PWM verfügbar + von 8 bis 100 Pin verfügbar + on Chip Debugging Support + Ruhestromaufnahme typ. 1 µA max. 3 µA + FreeRTOS, MicroC/OS2 und Salvo verfügbar o GCC bis 128 kBytes Codegröße verfügbar21 - nur ein Hersteller ARM7 Prozessoren Alle Zahlenangaben beziehen sich auf den AT91SAM7S128 Prozessor, einen Chip mit 32 kBytes RAM und 128 kBytes on Chip Flash. Die SAM7 Reihe umfasst Chips von 32 kBytes bis 256 kBytes Flash Speicher. + linearer 32 Bit Adressraum + sehr schnell, ca. 45 MIPS bei 50 Mhz (bei I ' 32 mA) + SAM7-Reihe: viel Peripherie incl. 10 Bit A/D- Wandler on Chip + viele Hersteller + ca. 1,4 MIPS/mA bei 32 Bit Wortbreite + GCC verfügbar + FreeRTOS, MicroC/OS2 und Salvo verfügbar - nicht mit < 48 Pins verfügbar - Ruhestromaufnahme ca. 35 µA - zwei Betriebsspannungen nötig 21 GCC ist ein freier C/C++ Compiler, der für viele Prozessoren Code erzeugen kann. Die Version 3.4.5 von AVR-GCC unterstützt noch keine 24 Bit Pointer, daher die Beschränkung auf 128 kBytes Codegröße. Für die Version 4.x von GCC sind Patches zur Unterstützung von bis zu 16 MBytes Programmspeicher verfügbar. 29 4.6 Auswahl eines Echtzeitkerns (RTOS22 ) 4.6.1 Auswahlkriterien 1. RAM-Bedarf 2. ROM-Bedarf 3. Portierbarkeit 4. Betriebsart (Kooperativ/ Präemptive) 5. Verifizierbarkeit (Eignung für sicherheitskritische Systeme) Kooperative Betriebsart Ein kooperativer Echtzeitkern zeichnet sich dadurch aus, dass eine Task einen ausdrücklichen Yield() Aufruf absetzen muß, um einen Taskwechsel herbeizuführen. Dies Verfahren hat den Nachteil, daß es in der Verantwortung des Anwendungsprogrammierers liegt, maximale Taskwechselzeiten sicherzustellen aber den Vorteil, daß keine Probleme durch nicht-atomaren Zugriff auf Mehrbyte Variable oder Datenstrukturen entstehen können. Präemptive Betriebsart Bei einem präemptiven Echtzeitkern ist der Echtzeitkern für die Taskumschaltung verantwortlich. Kritische Bereiche müssen vom Anwendungsprogrammierer explizit geschützt werden. Dies bietet den Vorteil, daß sich sehr kurze Umschaltzeiten leichter erreichen lassen und als Nachteil das Risiko nicht-atomarer Variablenzugriffe. Verifizierbarkeit Die korrekte Funktion eines Echtzeitkerns läßt sich gut verifizieren, wenn: 1. er im Sourcecode vorliegt 2. klein ist (möglichst nicht größer als 2000 Lines of Code (LOC)) 3. er weitestgehend in C und nicht in Assembler erstellt wurde 4. eine gute Dokumentation existiert 5. eine Testsuite existiert 6. seine korrekte Funktion bereits für Geräte, die für eine hohe Sicherheitsklasse zertifiziert wurden, verifiziert worden ist 22 Realtime Operating System 30 4.6.2 FreeRTOSTM FreeRTOSTM ist ein kleiner, portierbarer Open Source Echtzeitkern (Real Time Kernel), frei verfügbar und ohne Lizenzgebühren auch in kommerziellen Anwendungen einsetzbar. Es sind Portierungen für zahlreiche Mikrocontroller verfügbar, da er weitestgehend in C geschrieben ist sind Portierungen auf neue Prozessoren einfach durchzuführen. Es ist zwar auch eine Portierung für 8051 Prozessoren verfügbar, diese hat m.E. allerdings einen viel zu hohen Overhead, um praktikabel einsetzbar zu sein (bei einem Taskwechsel wird der komplette Hardware Stack in den erweiterten RAM Bereich ausgelagert). Es kann sowohl präemptiv als auch kooperativ verwendet werden, umschaltbar über eine #define Anweisung. Im Umfang des Pakets sind zahlreiche Beispiele, Debug-Tools und eine Test-Suite enthalten(vergl. Bar03). 4.6.3 Salvo Salvo ist ein kooperativer Echtzeitkern, der als einer der wenigen auch für 8051 Prozessoren vernünftig geeignet, aber auch für viele andere Prozessoren verfügbar ist. Es ist ab 1-2K ROM und 50-100 Bytes RAM verwendbar. Er ist ausschließlich kommerziell verfügbar. Von daher sprengt sein Einsatz den Kostenrahmen einer Bachelor-Arbeit. 4.6.4 MicroC/OS2 MicroC/OS2 ist ein portabler, präemptiver Echtzeitkern für Mikrocontroller und DSP’s. Es hat einen kleinen Speicherbedarf (ab 2k ROM + 300 Bytes RAM + Stack) und ist vollständig konfigurierbar, so daß nur die wirklich benötigten Funktionen wirklich im Objektcode landen. Ein Validierungs-Suite, wie sie für sicherheitskritische Systeme benötigt wird, ist verfügbar. Der Quellcode wird - mit ausführlichen Erläuterungen - als Buch vertrieben (vergl. Lab02). Ein tabellarischer Vergleich von MicroC/OS2 und FreeRTOS findet sich in Anhang A. 4.6.5 selbstgeschriebener Echtzeitkern Ein Echtzeitkern mit den hier wünschenswerten Features23 hat eine Codegröße von etwa 2000 LOC. Um so etwas in guter Qualität zu erstellen, braucht man zumindest eine Testsuite von weiteren 4000 LOC. Das selber zu schreiben, dafür bräuchte ich (der ich wenig Erfahrung im Betriebssystembau habe) schätzungsweise 1,5 Jahre. Das ist unwirtschaftlich und das Ergebnis wäre sicherlich nicht besser als der Einsatz eines kommerziellen oder Open Source Kerns, der sich schon in vielen Projekten praktisch bewährt hat. 23 Taskswitcher, absolute und relative Timer, Prioritäten, Semaphore, Message-Queue, Debug-System 31 5 Optimierungsansätze 5.1 verbesserte Systemarchitektur Wie im Abschnitt 4.4.1 beschrieben, ist die redundante Auslegung der Zentraleinheit sehr attraktiv. Bei einer Neuentwicklung der kompletten Pumpenelektronik (und nicht nur der Schrittmotorsteuerung im auf S. 7 definierten Sinne) würde ich folgenden Aufbau vorschlagen: 1. nur noch zwei identische Prozessoren1 mit jeweils 128 bis 256 kBytes Programmspeicher (Flash) und jeweils 64 Pins sind an der Flußsteuerung und -Überwachung beteiligt 2. alle Eingangssignale werden an beide Prozessoren geführt, alle Ausgänge können von beiden Prozessoren gesteuert werden 3. die funktionale Aufteilung in Hauptprozessor und Aktorprozessor bleibt im Normalbetrieb erhalten, inaktive Ausgänge eines Prozessors werden in den High-Z Zustand geschaltet 4. der Hauptprozessor erfüllt folgende Aufgaben: - Benutzerinterface - Echtzeituhr - Interface für externe Kommunikation, z.B. via BlueTooth - Überwachung aller Betriebsspannungen, des Drucks und des geförderten Volumens - Überwachung des Aktorprozessors 5. Hochauflösender A/D-Wandler mit I2C-Bus Anschluss für die Druckmessung 6. Batterieladecontroller mit I2C-Bus Anschluss 7. Verbindung beider Prozessoren untereinander und mit den o.g. E/A-Einheiten über den I2C-Bus 8. Anschluss beider Prozessoren an einen gemeinsamen seriellen EEPROM über den SPIBus2 , um die aufgezeichneten Überwachungsdaten abzulegen3 1 2 3 wie Prof. Halang in Kap. 7 von (WHRK03) nachweist, ist ein System mit identischer Hardware und diversitärer Software einem System mit diversitärer Hardware in der Fehlererkennungsrate zumeist überlegen, da durch einen Vergleich von Zwischenergebnissen viele Fehler erkannt werden können, deren Erkennung bei der Verwendung diversitärer Hardware nicht möglich ist der SPI-Bus bietet erheblich höhere Geschwindigkeiten als der I2C-Bus, außerdem ist es sinnvoll, Speicherzugriffe von der Kommunikation zwischen den Prozessoren und den E/A-Einheiten zu entkoppeln, dadurch erreicht man ein deterministischeres Zeitverhalten der interne EEPROM der infrage kommenden Prozessoren ist zu klein, um die geforderte Speichertiefe zu bieten 32 9. Überwachung des Hauptprozessors durch den Aktorprozessor 10. Verwendung diversitärer Compiler für die Software auf beiden Prozessoren, z.B. GCC und IAR-C4 11. redundante Anbindung der Alarmgeber, die auch im Falle eines Kurzschlusses eines der beiden Alarmgeber-Ausgänge noch funktioniert und auch bei Ausfall der Hauptbatterie 12. redundante Anbindung der Notabschaltung (Spannungsversorgung der Treiberstufen) 13. beide Prozessoren verfügen über eine unabhängige interne Hardware-Watchdog Bei einem derartigen Aufbau wäre es möglich, daß im Falle des Ausfalls eines der beiden Prozessoren der andere seine Funktion übernimmt (Notbetrieb, dieser sollte allerdings z.B. zeitlich begrenzt sein und dem Anwender deutlich signalisiert werden). Außerdem würden bei diesem Aufbau auch Rechen- und RAM-Fehler sowie viele selten auftretende Softwarefehler des Hauptprozessors erkannt werden können. interne vs. externe Watchdog Der im Rahmen dieser Arbeit gebaute Prototyp verwendet eine prozessorinterne Watchdog, das ist einfacher als das bisherige Konzept, bei dem indirekt über mehrere Software- und Hardwarewatchdogs im Fehlerfall ein Reset ausgelöst wurde. Einfachheit ist ein wesentlicher Aspekt sicherheitskritischer Systeme. Andererseits hätte die Verwendung einer externen Hardware-Watchdog, wie z.B. dem MAX 823 von Maxim5 den Vorteil der Unanfälligkeit gegenüber Software-Fehlern (sie kann nicht versehentlich abgeschaltet werden). Auch sind Hardware-Watchdogs erhältlich, die nicht nur überwachen, ob das Rücksetzsignal vorliegt, sondern auch eine maximale Häufigkeit garantieren, mit der es auftreten darf (Beispiel: Der MAX 6323). So wird auch dann ein Reset ausgelöst, wenn im Fehlerfall in einem Interrupt ständig die Watchdog betätigt wird. Diese Vorteile einer externen Watchdog sind gegenüber den Nachteilen (Platzbedarf, Kosten, geringere Flexibilität bei der Wahl der Zeitschranken) abzuwägen. 5.2 verbesserte Softwarearchitektur Für eine Zweiprozessorarchitektur mit gegenseitiger Überwachung ist ein RTOS nahezu zwingend erforderlich, da jeder der Prozessoren neben seiner Hauptaufgabe auch noch die Überwachung des anderen Prozessors im Hintergrund ausführen muß. Die Umsetzung einer Zweiprozessorarchitektur mit gegenseitiger Überwachung sprengt den Rahmen dieser Arbeit, allerdings habe ich mich bemüht, die hier entwickelte Aktorsoftware so zu schreiben, daß die zusätzlichen Überwachungsalgorithmen einfach hinzugefügt werden können. 4 5 IAR ist ein Hersteller von C/C++ Compilern und Zubehör, siehe http://www.iar.com/ vergl. auch die Application Note Watchdogs Improve Reliability“ ” siehe: http://www.maxim-ic.com/appnotes.cfm/appnote_number/1926 33 Ich habe mich im Rahmen dieser Arbeit für die Verwendung von FreeRTOS (vergl. Abschnitt 4.6.2) entschieden, zum einen aufgrund seiner freien Verfügbarkeit und zum anderen aus dem Grunde, daß ich mich mit der Funktion dieses Echtzeitkerns bereits seit längerem beschäftige und mir die Zeit für die Einarbeitung in ein anderes RTOS momentan nicht zur Verfügung steht (falls die hier betrachtete Infusionspumpe einer Zertifizierung durch die FDA6 unterzogen werden soll, wäre ein Wechsel zu MikroC/OS2 zu überlegen, da hierfür alle nötigen Zertifizierungsunterlagen verfügbar sind (der Wechsel eines RTOS ist nicht so besonders aufwendig, sofern es vom gleichen Typ (präemptiv oder kooperativ) ist). Um eine niedrige Stromaufnahme zu erreichen, ist es üblich, daß die IDLE-Task7 des RTOS den Prozessor in den Tiefschlaf8 versetzt, und er von einem Timer z.B. alle 2 ms wieder geweckt wird. Dies setzt allerdings voraus, daß für den Hauptoszillator ein RC-Oszillator verwendet wird, da nur dieser Oszillatortyp schnell genug (in max. wenigen µs) anschwingt. Die relativ hohe Frequenztoleranz von RC-Oszillatoren (1-2 % nach Kalibrierung) muß berücksichtigt werden. 5.3 Verwendung eines besser geeigneten Prozessors Ich habe mich für die Verwendung von Prozessoren aus der Atmel AVR Reihe (vergl. 4.5.2) entschieden, da sie unter Berücksichtigung der in 4.5.1 angegebenen Kriterien über die besten Eigenschaften aller 8-Bit Prozessoren verfügen. Insbesondere: 1. ermöglichen sie die Verwendung eines RTOS, da schon der kleine ATmega168 über 1 kByte RAM und einen beliebig dimensionierbaren Stack verfügt, größere Typen über bis zu 8 kBytes an internem RAM 2. ermöglichen sie deutliche Vereinfachungen, da sie über ein Wakeup-on-I2C-Adress-De” tektion“ Feature verfügen 3. bieten sie eine höhere Rechenleistung, so daß der Hauptprozessor entlastet wird (schnellere Reaktion auf I2C-Bus Befehle, der Hauptprozessor muß weniger lange warten) bei verringerter Stromaufnahme 4. sie erlauben die Verwendung des GCC, eines freien C Compilers, so daß - falls die symmetrische Zweiprozessorarchitektur mit diversitären Compilern zum Einsatz kommen soll nur ein kommerzieller Compiler gekauft werden muß 5. bieten sie einen Hardware-Watchdog mit sehr niedriger Stromaufnahme und (mehr als) einen schnellen Hardware PWM Ausgang 6. ermöglichen sie die In-Circuit-Programmierung“ mit Verify ohne Abschaltung der Ver” sorgungsspannung, bei Verwendung eines geeigneten Boot-Loaders ist auch eine Neuprogrammierung über den I2C Bus oder die RS232 Schnittstelle möglich 7. verfügen viele AVR-Derivate über einen On-Chip-Emulator, der ein Debuggen der Software über den Reset-Pin ermöglicht 8. sind sie im sehr kleinen MLF Gehäuse lieferbar (5*5 mm2 Baugröße beim ATmega168) 6 7 8 Federal Drug Administration, amerikanische Gesundheitsbehörde Task, die ausgeführt wird, wenn nichts zu tun ist oder in einen anderen Stromsparmodus, z.B. in den IDLE Zustand, wenn der PWM Ausgang aktiv bleiben muß 34 9. bietet die Architektur einen linearen Adressraum von 24 Bit, sodaß Banking bei allen hier infrage kommenden Programmgrößen jetzt und in den nächsten Jahren überflüssig ist Im Rahmen dieser Arbeit werde ich die Prozessoren vom Typ ATmega168 einsetzen, diese können mit nur geringen Anpassungen durch die Typen ATmega1281 oder ATmega2561 ersetzt werden, wenn eine symmetrische Zweiprozessorarchitektur implementiert werden soll. Zum jetzigen Zeitpunkt bietet die Verwendung der kleineren ATmega168 Prozessoren den Vorteil der besseren Vergleichbarkeit mit der bisherigen Lösung, was Platz- und Energiebedarf sowie die Kosten betrifft, außerdem ist der Einarbeitungsaufwand bei den kleineren Prozessoren geringer, da sie über weniger Features verfügen. Das Problem des fehlenden Zweitherstellers relativiert sich dadurch ein wenig9 , daß zumindest drei pinkompatible Prozessoren notfalls einsetzbar sind (ATmega128, ATmega1281, ATmega2561), so daß für den Fall, daß der gewünschte Typ nicht lieferbar ist, auf zwei andere ausgewichen werden kann. Die Verwendung von ARM7 Prozessoren hätte den Vorteil einer größeren Zukunftssicherheit. Andererseits benötigen sie mehr Ruheenergie und würden eine höhere Einarbeitungszeit erfordern. Der einzige Zweck, den ich mir z.Zt. vorstellen kann, für den die Rechenleistung von ARM7 Prozessoren in Infusionspumpen benötigt werden könnte ist die Verschlüsselung von Daten, falls die Pumpen einmal remote über das Internet ausgelesen werden sollen. Bei der Verwendung von BlueTooth könnte die Aufgabe der Verschlüsselung aber auch dem BlueTooth10 -Modul11 überlassen werden. 5.4 verbesserte Motoransteuerung flexiblere Steuerung von Strom und Drehmoment Bei der bisherigen Steuerung war es bereits möglich, entweder zu Choppen, oder auch nicht. Gar nicht zu choppen führt zu sehr hohen Spitzenströmen am Anfang und am Ende jeder Pulsgruppe, wenn man wie bisher implementierte Art und Weise choppt, ist das Drehmoment unter Umständen12 zu gering. Besser wäre es, den Grad des Choppens und somit das Drehmoment per Software einstellbar zu machen, wobei z.B. eine Pulsweite von 80 % dem jetzigen Choppen entspräche, und bei einem Wert von 100% bei voller Drehzahl nicht mehr gechoppt wird, sondern nur beim Anfahren und Bremsen, um die Stromerhöhung durch die verlängerten Motorschritte auszugleichen und somit die hohen Spitzenströme zu vermeiden, ohne das Drehmoment zu beeinträchtigen. 9 10 11 12 zumindest bei der Variante mit der symmetrischen Zweiprozessorarchitektur BlueTooth ist eine digitale Kurzstreckenfunktechnik, die für den Einsatz in Krankenhäusern zugelassen ist die hier infragekommenden BlueTooth Module haben auf einer Fläche von wenigen cm2 neben der Funkschnittstelle eine serielle Schnittstelle mit i.d.R. 112 kBaud. Die BlueTooth Spezifikation sieht eine Verschlüsselung der übertragenen Daten vor, von daher gibt es auch Module, die dies unterstützen. beispielsweise unterliegen die hier verwendeten Schrittmotoren nicht unerheblichen Exemplarstreuungen 35 variable Maximaldrehzahl Bei der jetzigen Motoransteuerung kann der Motor nur mit voller Schrittrate arbeiten. Um auch mit niedrigeren Maximaldrehzahlen arbeiten zu können13 , muß das Choppen per HardwarePWM14 erfolgen. Dabei gibt es zwei Möglichkeiten: a) nur einen PWM-Kanal für beide Spulen b) getrennte PWM-Kanäle für beide Spulen Für Halbschrittbetrieb genügt a), für Mikroschrittbetrieb ist b) erforderlich. Für Mikroschrittbetrieb sind - insofern eine stufenlos einstellbare Schrittfrequenz gewünscht und auf Tricks verzichtet wird - vier Timer erforderlich: 1. Timer für den RTOS-Tick 2. Mikroschritt-Timer 3. Timer für PWM-Kanal 1 4. Timer für PWM-Kanal 2 Vier Hardware-Timer sind jedoch in den ATmega168 Prozessoren nicht verfügbar, sondern nur in deutlich größeren und teureren Prozessoren15 . Unter Abwägung der Vor- und Nachteile habe ich mich entschieden, auf die Implementierung einer Mikroschrittsteuerung zu verzichten: 1. ihr einziger Vorteil wäre die größere Laufruhe16 . Ich werde jedoch zunächst versuchen, durch eine Verringerung der Maximaldrehzahl eine größere Laufruhe zu erreichen. Sollte dies nicht zum Erfolg führen, könnte die Implementierung einer Mikroschrittsteuerung erneut geprüft werden. 2. Nachteilig wäre der höhere Hardwareaufwand durch zweikanaliges Choppen und zweikanalige Strommessung. 3. nicht zuletzt ist mit einem höheren Strombedarf der Ansteuerschaltung zu rechnen, da mehr Rechenleistung zur Berechnung der Mikroschritte erforderlich ist (im Vergleich zum Halb- und Vollschrittbetrieb). Die Implementierung der folgenden I2C-Bus befehle erscheint mir sinnvoll: • setze die Maximaldrehzahl 13 14 15 16 dies ist nötig, um den Wirkungsgrad und die Geräuschentwicklung bei unterschiedlichen Maximaldrehzahlen erproben zu können bei der bisherigen Implementierung wird die Ausschaltzeit beim Choppen per Busy-Waiting realisiert, deshalb kann sie nicht zu groß gewählt werden, ohne die verfügbare Rechenleistung und den Energieverbrauch unakzeptabel negativ zu beeinflussen. Eine kleine Einschaltzeit und somit große Ausschaltzeit ist aber für niedrige Drehzahlen erforderlich. der kleinste Atmel Prozessor mit vier Timern ist der ATmega162. Er hat einen um 32 mm2 höheren Platzbedarf und kostet ca. 70% mehr als der ATmega168, also etwa 0.84 EUR mehr bei Abnahme von 1000 Stck. die höhere Positioniergenauigkeit ist bei einer Flußsteuerung irrelevant 36 • setze die Pulsweite (0..100%) Die Pulsweite muß bei reduzierter Maximaldrehzahl auch reduziert werden. In welchem Maße, das ist noch durch Versuche zu bestimmen. genauere Steuerbarkeit Das geförderte Volumen ließe sich genauer steuern, wenn nicht nur die Anzahl der Pulsgruppen in einem Förderauftrag angegeben werden kann, sondern die genaue Anzahl der Motorschritte. Dazu genügt ein zusätzlicher (Byte-) Parameter. Die genauerer Steuerbarkeit bietet keinen medizinischen Vorteil, da die erzielbare Genauigkeit auch jetzt schon vom Pumpkopf bestimmt wird, und nicht von der Ansteuerelektronik. Sie würde aber folgende Vorteile bieten: • auch die Verabreichung kleinster (medizinisch unsinniger) Boli würde noch eine hörbare Reaktion der Pumpe hervorrufen. Dies kann das Vertrauen von Betatestern in die Pumpe erhöhen, die alle einstellbaren Grenzwerte austesten. • die Zeit, die für einen Genauigkeitstest der Förderrate erforderlich ist, könnte deutlich reduziert werden. Bisher ist ein Jitter von +- einer Pulsgruppe pro Minute zu berücksichtigen, der sich erst nach längerer Zeit ausmittelt. Dies Problem könnte um den Faktor 96 (Anzahl der Schritte einer Pulsgruppe) reduziert werden. 5.5 Motorüberwachung persistenter Schrittzähler Der Hauptprozessor kann die real abgegebenen Motorschritte nicht so genau zählen, wie der Aktorprozessor. Um diese Schrittzahl im Aktor zu zählen, ist folgendes erforderlich: 1. ein Zähler im RAM 2. ein Abspeichern des Zählerstandes im EEPROM des Aktorprozessors17 bei Auftreten des PowerSoonDown Interrupts (von der Spannungsversorgung) 3. ein Wiederherstellen des Zählers im RAM beim Reset 4. ein I2C-Bus Befehl zum Setzen des Zählers auf einen dem Beutelvolumen entsprechenden Zählerstand nach dem Wechsel des Beutels 5. ein I2C-Bus Befehl zum Auslesen des Zählers 17 hierbei muß die Zyklenfestigkeit des EEPROMS berücksichtigt werden. Diese beträgt beim ATmega168 100 000 Schreibzyklen. Das genügt auch ohne zusätzliche Redundanzmaßnahmen für 10 Jahre Lebensdauer bei einem Ausschaltvorgang je Stunde. 37 Messung des Motorstroms Wie in Abschnitt 3.4 beschrieben, dient die Messung der Motorstroms der Erhöhung der Verlässlichkeit der Pumpe. Die Messung des Motorstroms (max. 300 mA) erfolgt über einen Messwiederstand von 0, 50 Ω (1% Toleranz) mit einem nachgeschalteten Verstärker (10 fache Verstärkung). Somit ergibt sich am Ausgang des Verstärkers eine maximale Meßspannung von 1,5 Volt. Diese wird mit dem 10 Bit A/D-Wandler des ATmega168 gemessen. Es werden mehrere Messungen bei voller Schrittfrequenz vorgenommen und gemittelt, sodaß für jede Pulsgruppe ein mittlerer Motorstrom zum Auslesen bereitsteht. Beim Überschreiten eines Grenzwertes wird ein Schrittverlust erkannt. Darauf kann unterschiedlich reagiert werden: 1. wenn vom Motor nicht die volle Drehzahl verlangt wird wäre es sinnvoll, den Versuch zu unternehmen, die Förderung bei reduzierter Maximaldrehzahl und mit einer gegenüber dem Standardwert vergrößerten Pulsweite fortzusetzen18 2. wenn weiterhin Schrittverluste auftreten, sollte der Motor stoppen und eine Fehlermeldung an den Anwender erfolgen Folgende I2C-Bus Befehle sollten implementiert werden: 1. Auslesen des mittleren Motorstroms der letzten Pulsgruppe 2. Es ist noch nicht klar, wie genau sich die Anzahl der verlorenen Schritte bei Überlast detektieren lassen. Falls dies hinreichend genau möglich ist, sollte ihre Anzahl auslesbar sein, andernfalls der maximale Motorstrom der letzten Pulsgruppe 18 dies entspricht der Anforderung an sicherheitskritische Echtzeitsysteme, falls irgend möglich bei Überlastung ihre Leistung gezielt herunterzufahren, nicht aber plötzlich ganz auszusetzen 38 6 Umsetzung Die Umsetzung erfolgte auf der Grundlage des auf der folgenden Seite abgebildeten Blockdiagramms. Kerstück ist die ActorCPU1 . Sie steuert über den StepperDriver (Schrittmotor-Treiber) den StepperMotor. Die ActorCPU überwacht über den Current IN Eingang den Strom durch die Motor Spulen. Die Keyboard-Eingänge der ActorCPU ermöglichen es ihr, die korrekte Funktion des Hauptprozessors (der MainCPU) zu überwachen (Softwaretechnisch noch nicht realisiert). Über den TXD Ausgang können Debug-Signale ausgegeben werden. Die MainCPU hat folgende Aufgaben: 1. Abfrage der Tastatur 2. Ansteuerung der LCD-Anzeige 3. Kommunikation mit externen Geräten, z.B. PC oder Palm 4. Überwachung der Flußrate über den Hallsensor, der die Umdrehungen des Pumpkopfes zählt 5. Drucküberwachung 6. Ansteuerung und Überwachung der ActorCPU 7. Alarmsignalisierung im Fehlerfall 8. Blinken mit der grünen LED wenn Pumpe läuft 9. Bereitstellung einer Echtzeituhr 10. Aufzeichnung von Ereignissen im EEPROM Zu Testzwecken kann an die serielle Schnittstelle ein Laptop/PC angeschlossen werden. 1 die korrekte deutsche Schreibweise wäre Aktor CPU. Ich benutze hier die englische Schreibweise, um die im (englischen) Blockdiagramm verwendeten Begriffe beizubehalten. 39 6.1 Blockdiagramm Abbildung 6.1: Blockdiagramm 40 6.2 Schaltplan Abbildung 6.2: Schaltplan 41 Abbildung 6.3: Motortreiber 42 Schaltplan Links auf dem Schaltplan sieht man den Hauptprozessor, rechts den Aktorprozessor. Oben ist die Stiftleiste zum Messen der Signale mit einem Oszilloskop und/oder einem Logic-Analyser zu sehen. Ganz links die Tastatur, daneben die Anschlüsse für ein einfaches LCD Display (zwei Zeilen mit je 16 Zeichen). Ganz rechts das Netzteil (ein fertiges Modul, daß 2005 von der Firma Pegasus GmbH unter wesentlicher Mitwirkung des Autors entwickelt wurde). Das Netzteil erzeugt aus einer Batteriespannung von 2-3 Volt die Betriebsspannungen von 3,3 und 5 Volt. Außerdem verfügt es über eine Notstromversorgung, die bei Entnahme der Batterien die 3,3 Volt Spannung noch für ca. 300 ms aufrecht erhält und dies rechtzeitig über das 1V8 IRQ Signal ankündigt. Ganz rechts oben der Treiber (Pegelwandler) für die serielle RS232 Schittstelle, der über ein Autoshutdown Feature verfügt (die Stromaufnahme wird bei Abziehen des Steckers automatisch auf ein Minimum reduziert). Rechts unten die rote LED, die von beiden Prozessoren als Fehleranzeige angeschaltet werden kann, und die grüne LED, die im Betrieb regelmäßig aufblinkt. Folgende Komponenten fehlen im Vergleich zur realen Pumpe: • Druckmeßwandler • Akku-Ladeteil • akustischer Alarm • Echtzeituhr • Ereignisrecorder (großer EEPROM) • Überwachung von Temperatur und Betriebsspannungen (All dies ist für den hier gegebenen Zweck - Messung von Wirkungsgrad, Drehmoment, Schrittgenauigkeit etc. nicht nötig.) Motortreiber Der Motortreiber ist aus preiswerten Standardbauteilen aufgebaut. Neu ist die Möglichkeit des Choppens über einen separaten PWM-Eingang sowie die Möglichkeit der Strommessung. Der Zweck von R10/ R12 liegt in einer Nullpunktverschiebung, damit auch ein negativer Offset des (preiswerten) Operationsverstärkers gemessen und korrigiert werden kann. Der verwendete Operationsverstärker hat folgende Merkmale: • preiswert (< 0.50 EUR) • niedrige Stromaufname (< 10 µA) • Ein- und Ausgänge sind Rail-to-Rail fähig, können also (fast) über den gesamten Betriebsspannungsbereich genutzt werden. • kleine Bauform (SC70-5 Gehäuse) 43 6.3 Software 6.3.1 Formale Anforderungen Die formalen Anforderung an den Hauptprozessor und an den Aktorprozessor habe ich in den folgenden beiden Diagrammen dargestellt: Abbildung 6.4: Formale Anforderungen Hauptprozessor 44 Abbildung 6.5: Formale Anforderungen Aktorprozessor 45 6.3.2 Zustandsdiagramme Der Kern der Steuerung wird vom Ramp Controller“ gebildet, der Klasse, die für die Erzeu” gung der Pulsgruppen incl. der Beschleunigungs- und Bremsrampe zuständig ist. Die Funktion dieser Klasse wird im folgenden Diagramm dargestellt: Abbildung 6.6: Zustandsdiagramm Ramp Controller Der Befehl run(wGroupCount, wDelayMS, wDelayPart) startet diese Zustandsmaschine, die dann die vorgegebene Anzahl von Pulsgruppen erzeugt. Die Länge einer jeden Pulsgruppe beträgt konstant 96 Vollschritte, das entspricht zwei Motorumdrehungen. Der Vorteil der Pulsgruppensteuerung besteht in der verringerten Leistungsaufnahme bei niedrigen Förderraten im Vergleich zur kontinuierlichen Förderung, da in den Pausen zwischen den Pulsgruppen der Motor ganz und die Steuerung fast ganz abgeschaltet werden können. 46 6.3.3 Echtzeitkern (RTOS) Als Echtzeitkern verwende ich FreeRTOS. Die Zustände, die eine Task annehmen kann, sind im folgenden Diagramm zu sehen: Abbildung 6.7: Zustände einer FreeRTOS Task 47 6.3.4 Zeitverhalten Alle hier angegebenen Zeiten gelten nur unter den folgenden Voraussetzungen: 1. Taktfrequenz 8 Mhz ± 2% 2. Compiler GNU C Version 3.4.5, Optimierung -s Um ein verifizierbares Zeitverhalten zu erreichen, verwende ich folgende Interrupts und Tasks: 6.3.4.1 Interrupts Wie auf S. 25 erläutert, sollten Interrupts sparsam verwendet werden und sich nicht gegenseitig unterbrechen können. Ich verwende die folgenden Interrupts: 1. Timer1 CMI (Compare Match Interrupt) (max. alle 900 µs, Dauer der IRQ-Routine max. 150 µs) 2. RS232 Data Received Interrupt (max. alle 263 µs, Dauer max. 30 µs) 3. Clock Tick (genau alle 1/512 sec, Dauer max. 100 µs) Der Clock Tick Interrupt ist für den Taskswitcher erforderlich. Die RS232 Interrupts sind erforderlich, da bei 38000 Baud alle 263 µs ein neues Byte eintreffen kann, daß in einem Puffer gesammelt werden muß, um dann vollständige Befehle von der zuständigen Task auswerten zu lassen. Der Timer1 CMI dient der Erzeugung der Halbschritte, die nicht nur sehr schnell generiert werden müssen, sondern auch nur einen kleinen Jitter haben dürfen. Um dieser Anforderung gerecht zu werden, ohne mit einem höher priorisierten Interrupt zu arbeiten, der andere IRQ Routinen unterbrechen kann, verwende ich folgendes Konzept: • der Timer1 CMI wird 110µs ausgelöst, BEVOR ein neuer Halbschritt ausgegeben werden muß • in einer Busy Waiting“ Schleife wird darauf gewartet, daß der genaue Zeitpunkt erreicht ” ist, und dann der neue Halbschritt ausgegeben. Rechenlast Der Timer1 CMI erzeugt eine Rechenlast von max. 15%, der RS232 Interrupt eine Rechenlast von max. 12%, der Clock Tick eine Rechenlast von max. 5%. Somit ergibt sich eine gesamt Interrupt-Last von max. 32%, die bei der Berechnung der Rechenzeiten der Funktionen im Hauptprogramm berücksichtigt werden muß. 48 Rechtzeitigkeit Bei der Abarbeitung des Clock-Ticks sei ein Jitter von 10%, also von 200µs zulässig (dies ist im folgenden zu beachten). Diese Bedingung ist erfüllt, da durch Timer1 und RS232 Interrupt eine Verzögerung von max. 150µs + 30µs = 180µs auftreten kann. Bei der Abarbeitung des RS232 Interrupts darf eine Verzögerung von max. 263µs auftreten. Diese Bedingung ist erfüllt, da durch den Clock Tick und den Timer1 IRQ eine max. Verzögerung von 100µs + 150µs = 250µs auftreten kann. Bei der Abarbeitung des Timer1 CMI darf eine Verzögerung von max. 110µs auftreten, die von der Busy Waiting Schleife kompensiert wird. Diese Bedingung ist erfüllt, da der Timer1 CMI eine höhere Priorität als alle anderen Interrupts hat und somit durch den Clock Tick und den RS232 Interrupt eine max. Verzögerung von max(100µs, 30µs) = 100µs auftreten kann. 6.3.4.2 Tasks und Koroutinen Ich verwende die folgenden, parallel laufenden Tasks: 1. Kommando Interpreter incl. I2C Treiber 2. Förderauftrag Abwicklung (hierzu gehört das Hochfahren der Geschwindigkeit am Anfang einer Pulsgruppe, das langsame Abbremsen am Ende sowie die Erzeugung von n Pulsgruppen im per Parameter definerten Zeitabstand) 3. Selbsttest (insbesondere CRC des Programmspeichers) I2C-Treiber und Kommando Interpreter habe ich Zwecks Speicherplatz-Ersparniss in einer Task zusammengefasst. Außerdem verwende die folgende Koroutinen im Hintergrund (Idle-Task): 1. Erzeugung des Signals für die externe Watchdog (wird nur generiert, wenn der ein Förderauftrag läuft) 2. Erzeugung des Signals für die interne Watchdog (wird immer generiert, wenn kein interner Fehler detektiert wurde) Koroutinen bieten gegenüber Tasks den Vorteil, daß sie sich einen Stack teilen und dadurch RAM Speicher sparen. Allerdings ist mit ihnen nur kooperatives Multitasking möglich, sie haben auch noch weitere Einschränkungen2 und sind somit nur für sehr einfache Aufgaben verwendbar. Die Stromüberwachung erfolgt im Timer1 Interrupt. 2 auf http://www.freertos.org/croutine.html findet sich ein ausführlicher Vergleich von Tasks und Koroutinen. Als Nachteile werden genannt: Lack of stack requires special consideration“ , Restrictions on where ” ” API calls can be made“ und Co-operative operation only amongst co-routines themselves“ . ” 49 Risikobetrachtungen Risiko der Überlast Eine Interrupt Überlast könnte auftreten, wenn die RS232 Schnittstelle mit einer höheren Baudrate als 38000 Baud betrieben wird. Da die Baudrate allerdings in der Firmware hart kodiert ist, kann dies Problem bei einer guten Dokumentation der Software nur bei groben Programmierfehlern in ferner Zukunft auftreten3 . Dasselbe gilt für die max. Schrittfrequenz: Auch Sie darf nicht ohne eine erneute genaue Betrachtung des Zeitverhaltens erhöht werden. Die Frequenz des Clock Ticks darf ohne eine erneute, genaue Betrachtung des Zeitverhaltens weder erhöht (Risiko der Überlast) noch verringert werden (Riskio des Verhungerns). Risiko des Verhungerns Das Riskio des Verhungerns konnte in einem Codereview mit Dipl. Ing. Pokriefke am xx.yy.2006 ausgeschlossen werden. 6.3.5 Speicherbedarf Der Speicherbedarf hängt stark von der Anzahl der Tasks ab, diese sollte deshalb minimiert werden. Anzahl Objekttyp Einzelbedarf 4 4 2 2 2 Task Taskstack Priorität Queue QueueData 20 85 16 45 10 Gesamtbedarf (Bytes) Summe 80 340 32 90 20 562 Tabelle 6.1: Speicherbedarf Der tatsächlich von den einzelnen Tasks benötigte Stack sollte zur Laufzeit überwacht und dann der höchste gemessene Wert zzgl. einem Sicherheitsaufschlag von z.B. 20% gewählt werden. 3 leider können auch Hardwarefehler, etwa ein fälschlicherweise auf 1 Mhz programmierter Taktoszillator zu einer Überlast führen. Deshalb ist die Überwachung des Aktorprozessors durch den Hauptprozessor erforderlich, der im Störungsfall das System in den sicheren Zustand überführt 50 6.4 Das Labormuster Das Labormuster befindet sich auf einer 150 ∗ 90 mm2 großen Platine. Auf ihr finden Platz: 1. Batteriehalterung für zwei Mignon-Zellen 2. Spannungswandler für 5V und für 3,3 Volt mit Notstromversorgung 3. RS232 Treiber mit Stecker 4. Zwei Stecker zum Programmieren der Prozessoren 5. Anschluß für Logic-Analyser zu Testzwecken 6. Fünf Tasten zur Bedienung 7. Fassung für LCD-Display 8. die Prozessoren 9. der Motortreiber incl. Stecker Abbildung 6.8: Labormuster Das Layout habe ich mit der CAD- Software Target 3000 erstellt (siehe Anhang Softwarewerkzeuge). Beim Autorouten der sehr feinen SMD-Teile mußte ich sehr oft die Teile drehen und schieben, bis der Router alle Leitungen verlegen konnte. Für professionelles Arbeiten könnte die Verwendung des zusätlich erhältlichen Elektra-Autorouter viel Zeit und Nerven sparen. 51 7 Ergebnisse 7.1 Drehmoment 7.1.1 Meßaufbau Die Messung des Drehmoments der hier betrachteten Schrittmotoren erfolgt mit dem folgenden Aufbau: Der Motor ist mit Winkeln so auf einer Grundplatte befestigt, daß die Motorachse waagerecht liegt. In ca. 20 cm Abstand befindet sich darüber das Drehmomentmeßgerät. Das Drehmomentmeßgerät verfügt über eine Meßscheibe mit dem Durchmesser D1 . An ihm ihr ist eine Schnur befestigt, die über eine Schnurrolle mit dem Durchmesser D2 läuft, die auf der Motorachse befestigt ist. (Anstelle einer Schnurrolle kam eine Distanzhülse aus Kunststoff zum Einsatz, die einen Außendurchmesser von 4.0 mm hat. Außerdem wurde die Schnur auf einer Länge von ca. 6 cm durch ein ZickZack Gummiband ersetzt, dadurch erreicht man einen ähnlichen Effekt wie mit einer Elastomer Kupplung, einen ruhigeren Lauf und ein um ca. 15 % höheres Drehmoment.) Daß Drehmomentmeßgerät ist auf einem klappbaren Brett befestigt, so daß sich der Abstand vom Motor mit einer Flügelschraube fein einstellen läßt. Durch Anziehen der Flügelschraube wird die Schnur gespannt und eine Bremskraft auf den Motor ausgeübt. Diese kann dann mit dem Drehmomentmeßgerät gemessen werden. Ich habe immer versucht, das maximale Drehmoment zu bestimmen, bei dem gerade eben kein Schrittverlust (in einer Zeitspanne von einer Minute) auftritt, also zunächst die Schnur gespannt, bis Schrittverlust auftritt, und dann die Schnur wieder ein wenig gelockert, und dann das Drehmoment abgelesen. Es gilt: MM otor = Mgemessen ∗ D2 /D1 7.1.2 Meßfehler Genaue Messungen durchzuführen erwies sich als schwierig. Folgende Fehlerquellen habe ich in Betracht gezogen: F1: die Reibung der Motorachse F2: die Ungenauigkeit des Durchmessers der Distanzhülse 52 Abbildung 7.1: Meßaufbau zur Messung des Drehmoments F3: die Schwierigkeit, genau den Meßpunkt zu bestimmen, wo gerade keine Schrittverluste auftreten F4: die Auflösung des Meßgerätes F5: die Nullpunktdrift des Meßgerätes F6: das Trägheitsmoment der Distanzhülle Unter der Annahme, daß der Reibungskoeffizient des Motorlagers um den Faktor vier geringer ist, als der Reibungskoeffizient der Schnur (Naturmaterial) auf dem Kunststoff, gilt: F 1 ≤ 12.5%. 53 Aus D1 = 4 mm ± 0.1 mm folgt F 2 ≤ 2.5%. Aus der Wiederholgenauigkeit der Messungen mit ansonsten gleichem Aufbau ergibt sich für F3 als Abschätzung ein Wert von 10 %. Für MM otor > 1 mN m gilt F4 <= 6 %. Eine Nullpunktdrift von ein bis zwei Digit ließ sich nur in der ersten Minute nach dem Einschalten beobachten. Von daher läßt sie sich vernachlässigen, wenn nach dem Einschalten des Meßgerätes eine Aufwärmzeit von zumindest fünf Minuten abgewartet wird, und vor jeder Meßreihe ein erneuter Nullpunktabgleich mit frei hängender Meßschnur erfolgt. Das Trägheitsmoment der Distanzhülse tritt nur dann als Fehlerquelle in betracht, wenn der Motor im Start- Stopp Betrieb vermessen wird. Ich vernachlässige es ebenfalls, da Durchmesser und Masse dieser Hülse erheblich unter dem Durchmesser und der Masse des Ankers der hier betrachteten Motoren lag. Somit gilt für den Absolutfehler: Fabs <= F 1 + F 2 + F 3 + F 4 <= 31% und für den Relativfehler (beim Vergleich der alten mit der neuen Schrittmotorsteuerung unter Verwendung desselben Motors mit derselben Distanzhülse): Frel <= F 3 + F 4 <= 16% Der Relativfehler läßt sich durch wiederholte Messung und Mittelwertbildung weiter reduzieren. 7.1.3 Ergebnisse 7.1.3.1 Drehmoment und Wirkungsgrad Um einen Anstieg des Spulenstroms bei einer Verringerung der Halbschrittfrequenz zu vermeiden, ändere ich das Verhältnis, mit dem der Spulenstrom gechoppt wird gemäß der folgenden, experimentell gefundenen Formel: ch1 = 1 − 0.6 ∗ ((f max − f )/f max)) fmax: maximale Halbschrittfrequenz der bisherigen Schrittmotorsteuerung (1066 Hz) ch1 : choplevel (Einschaltverhältnis), ein Wert zwischen 1 und 0 Zusätzlich wird der choplevel für die Phasen, in denen beide Spulen bestromt werden, mit dem Faktor 0.88 multipliziert1 . Somit gilt: ch2 = 0.88 ∗ ch1 1 √ theoretisch müßte der Strom je Spule um den Faktor 1/ 2 abgesenkt werden, um eine minimale Welligkeit des Drehmoments zu erhalten 54 Mit dieser Ansteuerung ergibt sich die in Abb. 7.2 dargestellte Abhängigkeit von Drehmoment und Wirkungsgrad von der Halbschrittfrequenz. Gut erkennbar ist das nahezu konstante Drehmoment im Bereich f = 250 .. 1066 Hz. Bei höheren Schrittfrequenzen fällt das Drehmoment näherungsweise linear ab, es würde bei ca. 1750 Hz die Nullachse schneiden (theoretische Maximalfrequenz). In dieser Messung habe ich einen maximalen Wirkungsgrad von ca. 18% ermittelt (+35-25% vom Meßwert, dieser Fehler ergibt sich aus der Summe der Fehler der Drehmomentmessung und der Messung der Leistungsaufnahme). Abbildung 7.2: Drehmoment und Wirkungsgrad Aus dieser Messung ergibt sich, daß die bisherige Maximalfrequenz bereits das Optimum für den Motorwirkungsgrad darstellt. 7.1.3.2 Stromaufnahme und Wirkungsgrad Die Abhängigkeit der Stromaufnahme und des Wirkungsgrads vom Drehmoment bei einer konstanten Halbschrittfrequenz von 1066 Hz ist in 7.3 dargestellt. Es ergibt sich ein maximaler Wirkungsgrad bei einem Drehmoment von 1.35 mNm von ca. 20%. Außerdem ist gut erkennbar, daß im Bereich von Null bis ca. 0.8 mNm eine nahezu lineare Abhängigkeit der mittleren Stromaufnahme vom Drehmoment gegeben ist, allerdings mit der recht hohen Leerlaufstromaufnahme von ca. 44.2 mA. Dieser Zusammenhang kann genutzt werden, indirekt (über die Messung der Motorstromaufnahme) das Drehmoment zu ermitteln, daß von einer eingebauten Pumpkopf/ GetriebeKombination unter realen Bedingungen benötigt wird. Ich habe mit der Pumpkopf/ Getriebe-Kombination light 02 eine mittlere Stromaufnahme von 47 bis 55 mA gemessen. Daraus ergibt sich (aus dem Diagramm abgelesen) ein real erforder- 55 liches Drehmoment von ca. 0.2 bis 0.4 mNm sowie ein mittlerer Motorwirkungsgrad von ca. 7.5 %. Wie in 3.1 beschrieben, ist bei einem Ausgangsdruck von 1500 hPa eine mechanische Ausgangsleistung von 4.17 mW erforderlich. Aus den Meßwerten ergibt sich eine Erhöhung der Stromaufnahme um ca. 0.42 mA pro mW zusätzlicher Ausgangsleistung und somit eine maximale Erhöhung der Stromaufnahme um 1.77 mA bei maximalem Ausgangsdruck. Dieser Anstieg ist so gering, daß er meines Erachtens nicht zur indirekten Bestimmung des ausgangsseitigen Drucks verwendendet werden kann. Abbildung 7.3: Stromaufnahme und Wirkungsgrad 7.1.3.3 Pulsgruppenbetrieb Im Pulsgruppenbetrieb (96 Motorschritte, dann 20 ms Pause bei 100 ml/h, bei niedrigeren Förderraten entsprechend längere Pausen) ergibt sich ein etwas geringeres maximales Drehmoment, da das Anlaufbeschleunigungsdrehmoment zusätzlich aufgebracht werden muß und außerdem aufgrund der Trägheit des Meßaufbaus das Maximaldrehmoment nicht exakt bestimmt werden kann. Dadurch, daß die neue Steuerung in Abhängigkeit der Schrittfrequenz choppt, konnten Messungen mit einer beliebig niedrigen Startfrequenz und einer beliebig geringen Anlaufbeschleunigung durchgeführt werden, ohne daß dadurch die Anlaufstromaufnahme unzulässig angestiegen wäre. 56 Erstaunlicherweise ergab eine sehr geringe Anlaufbeschleunigung keine Verbesserung, sondern eine Verschlechterung, vermutlich aufgrund von Motorresonanzen. Mit dem gegebenen Motor ergaben folgende Werte für die Beschleunigungsrampe ein optimales Ergebnis (minimale Spitzenstromaufnahme, maximales Drehmoment): • fmin = 500 Hz • fmax = 1066 Hz • deltaV = 72 Hz (Frequenzerhöhung pro Millisekunde) Daraus ergibt sich für die Länge der Start- und der Stoprampe eine Dauer von je 8 ms. Die Ergebnisse sind in Tabelle 7.1 mit dargestellt. 7.2 Leistungsaufnahme 7.2.1 bisheriges System 7.2.1.1 Spitzenstromaufnahme Ich habe eine Spitzenstromaufnahme von ca. 200 mA gemessen (Abb. 7.4). (Meßwiderstand 1 Ohm, Kondensator 1200µF parallel zum Motortreiber, Filter 10 kOhm/ 100 nF vor dem Oszilloskopeingang, Differenzspannungsmessung, AC-Kopplung). 7.2.1.2 mittlere Leistungsaufnahme Vorbemerkung Anders als in 7.1.3.2 habe ich hier die Leistungsaufnahme am Eingang des Spannungswandlers der Steuerung, also incl. der Leistungsaufnahme der Prozessoren und der Verluste der Spannungswandler gemessen. Bei einer Eingangsspannung von 2.41 V betrug die Stromaufnahme 220 bis 270 mA. (Förderrate 100 ml/h, Aktor-Firmware 1.2, Messung am 27.05.2006, Motor/ Getriebeeinheit light 02) Daraus errechnet sich eine mittlere Leistungsaufnahme von 590 mW. 7.2.2 neues System 7.2.2.1 Spitzenstromaufnahme Ich habe eine Spitzenstromaufnahme von ca. 98 mA gemssen (Abb. 7.5). Zur Minimierung der Spitzenstromaufnahme trug der Betrieb des Chop-Timers im phasensychronen Modus bei. (Im Fast PWM Modus lag die Spitzenstromaufnahme ca. 20 % höher.) 57 Abbildung 7.4: Spitzenstromaufnahme mit alter Steuerung 7.2.2.2 mittlere Leistungsaufnahme Bei einer Eingangsspannung von 2.41 V betrug die Stromaufnahme 110 bis 140 mA. (Befehl run 1000 201 , Firmware 0.4.3, Messung am 27.05.2006, Motor/ Getriebeeinheit light 02) Daraus errechnet sich eine mittlere Leistungsaufnahme von 301 mW. 7.2.3 vergleichende Wertung Eigenschaft Förderrate Drehmoment (max) Spitzenstrom P el (im Mittel) P el (im Mittel) P el (im Mittel) 100 100 100 10 2 ml/h ml/h ml/h ml/h ml/h bisheriges neues System Veränderung Verbesserung2 0.59 mNm 200 mA 590 mW XXX mW XXX mW 1.51 mNm 98 mA 301 mW YYY mW YYY mW +156 % -51 % -49 % Faktor 2.56 Faktor 2.04 Faktor 1.96 Faktor zzz Faktor zzz Tabelle 7.1: Vergleich von Spitzenstrom und Leistungsaufnahme 1 2 dieser Befehl bedeutet: 1000 Pulsgruppen mit je 96 Vollschritten ausgeben, zwischen zwei Pulsgruppen jeweils 20 ms warten als Verbesserungsfaktor verstehe ich den Quotient neuer Wert/ alter Wert, wenn ein hoher Wert erstrebenswert ist, und anderenfalls der Kehrwert dieses Quotienten 58 Abbildung 7.5: Spitzenstromaufnahme mit neuer Steuerung Die Verbesserung des Drehmoments konnte vor allem durch die optimierte Rampensteuerung erreicht werden. Gleichzeitig war es möglich, die Leistungsaufnahme und den Spitzenstrom erheblich zu reduzieren. Bei niedrigen Förderraten konnte sogar eine Verringerung der Leistungsaufnahme um mehr als 70 % erreicht werden, d.h. die Batterielaufzeit konnte mehr als verdreifacht werden. 7.3 Platzbedarf und Kosten Ich betrachte hier vereinfachend nur die aktiven Bauelemente sowie die geschätzten Entwicklungskosten. Die Bauteilekosten beruhen auf Angeboten über 1000 Stck., die ich im Dez. 2005 und Febr. 2006 eingeholt habe, sowie einem Kurs von 1 EUR = 1,20 US$. Die Entwicklungskosten sind geschätzt. Die Größe (minimal benötigte Platinenfläche) pro Bauteil habe ich folgendermaßen berechnet: (Länge + 2 mm) ∗ (Breite + 2 mm) ich bin also von einem Bauteilabstand von 2 mm ausgegangen. Dies ist ein konservativer Ansatz, ein Bauteilabstand von 1,5 mm sollte bei einer Multilayerplatine realisierbar sein. 59 bisheriges System Ein Entwicklungsaufwand von sechs Mannmonaten à 5000 EUR, das ergibt 30000 EUR, umgelegt auf ein geschätztes Produktionsvolumen von 3000 Stck. Anzahl 1 2 1 1 1 Größe (mm2 ) Gesamtpreis (EUR) P89LPC922 Si9987 Si2301 EDS BSS123 Quarz 8.388 Mhz 82.9 119.7 22.5 22.5 37.2 1.15 4.02 0.10 0.03 0.15 Zwischensumme: Entwicklungskosten: 284.8 5.45 10.00 Gesamtsumme: 284.8 15.45 Bauteil Tabelle 7.2: Platzbedarf und Kosten bisheriges System neues System Ein Entwicklungsaufwand von drei Mannmonaten à 5000 EUR, das ergibt 15000 EUR, umgelegt auf ein geschätztes Produktionsvolumen von 3000 Stck. Anzahl 1 2 2 1 2 1 1 Bauteil Gehäuse Größe (mm2 ) Gesamtpreis (EUR) ATmega168 FDG6313N FDG6306P 74HCT00 PMEG3002TV LPV321 Quarz 32 kHz MLF SC70-6 SC70-6 TSSOP SOT666 SC70-5 49.0 32.8 32.8 58.8 35.6 17.6 28.4 1.20 0.25 0.28 0.09 0.22 0.27 0.57 Zwischensumme: Entwicklungskosten: 255.0 2.88 5.00 Gesamtsumme: 255.0 7.88 Tabelle 7.3: Platzbedarf und Kosten neues System Nicht berücksichtigt habe ich die Kosten für die Integration in das bestehende System sowie die Kosten für ein neues Platinenlayout. vergleichende Wertung Durch die Verwendung von Standardbauteilen in Kombination mit einer leistungsfähigen MCU anstelle von hochgradig spezialisierten Bauteilen wie dem Si9987 (einer H-Brücke) konnten bei 60 etwa demselben Platzbedarf die Bauteilkosten - trotz zusätzlicher Funktionalität - fast auf die Hälfte reduziert werden. Allerdings stieg die Anzahl der Bauteile deutlich an, was sich negativ auf die HardwareZuverlässigkeit auswirkt. Ich halte das für vertretbar, da hier auftretende Hardwarefehler sehr schnell erkannt und durch Inspektionsmaßnahmen nach der Bestückung weitestgehend vermieden werden können. Die Verwendung eines besser geeigneten Prozessors, besserer Entwurfswerkzeuge und einer besseren Entwicklungsmethodik führten zu einem erheblich verringerten Entwicklungsaufwand, wobei fairerweise gesagt werden muß, daß der Verfasser ein wenig auch an der Entwicklung des bisherigen Systems beteiligt war und von daher nicht bei Null anfangen mußte. 7.4 Verifizierbarkeit Die Verifizierbarkeit der korrekten Funktion und des korrekten Zeitverhalten der Firmware konnte durch die Verwendung eines Echtzeitkerns (RTOS) sowie durch die Vermeidung von verschachtelten Interrupts erheblich verbessert werden. Auch die Verfügbarkeit einer relativ schnellen (38 kBaud) gepufferten seriellen Schnittstelle, über die Debug-Ausgaben erfolgen können, verbessert die Verifizierbarkeit des Systems. 7.5 Verlässlichkeit Die Verlässlichkeit des Systems konnte durch die Überwachung des Motorstrom sowie das höhere Drehmoment erheblich gesteigert werden. (Eine Schlupfkorrektur als Fehlertoleranzmaßnahme für Schrittverluste dürfte jetzt überflüssig geworden sein.) Ein typischer Motorstromverlauf bei Überlast ist in Abb. 7.6 dargestellt. Wenn der Motorstrom 180 mA2 überschreitet wird ein Schrittverlust detektiert. Bei jedem Schrittverlust erfolgt eine Warnung3 , bei einem Schrittverlust in mehr als drei Pulsgruppen wird ein Fehler gemeldet und der Motor gestoppt. Die Fehlererkennungszeit bei einer Blockade des Motors konnte - bei einer Förderrate von 2 ml/h - von 8 Minuten auf eine Minute reduziert werden. Leider wird die bisherige Überwachung der Pumpkopfdrehung per Hallsensor durch die neue Motorstromüberwachung nicht überflüssig, da sich bestimmte (sehr seltene) Fehler, wie ein ausgehaktes Zahnrad vorläufig nur mit dem Tachopulsgenerator entdecken lassen. 2 3 bei maximalem Drehmoment lag der gemessene Maximalstrom unter 160 mA, bei Schrittverlust immer über 200 mA, deshalb wurde 180 mA als Schwellwert gewählt diese wird hier durch ein Ausgabe auf der Terminal Konsole gemeldet, in der entgültigen Pumpe wäre es sinnvoll, diese Warnung im Service-Recorder aufzuzeichnen, nicht aber dem Anwender zu melden 61 Abbildung 7.6: Motorstromverlauf bei Schrittverlusten 7.6 Features Die Abspeicherung des geförderten Volumens im Aktorprozessor in Kombination mit der Erkennung von Schrittverlusten ermöglicht eine sehr viel genauere Aufzeichnung des geförderten Volumens, z.B. können nun auch sehr kleine Entlüftungsvolumen (kleiner als ein Hallsensorpuls) erstmals aufgezeichnet werden. 7.7 Ausblick Von den sechs Optimierungszielen (siehe 2.2) konnten fünf erreicht werden. Bei einer kompletten Neuentwicklung könnte das Konzept des symmetrischen Zweiprozessorsystems umgesetzt und damit die nächsthöhere Sicherheitsklasse4 erreicht werden. Die Grundlagen dafür sind gelegt. Motorvolumen und Leistungsaufnahme ließen sich durch einen anderen Motor weiter reduzieren, dies wäre allerdings mit höheren Kosten verbunden. Die unerwartet hohe Erhöhung des Drehmoments schafft die Möglichkeit, durch eine andere Getriebeübersetzung die maximale Förderrate zu erhöhen und die Leistungsaufnahme weiter zu senken. Die Geräuschoptimierung könnte in einer weiteren Arbeit genauer untersucht werden. 4 in Anlehnung an den Normentwurf nach DIN VDE 0801 62 Als eine Hauptgeräuschquelle bei niedrigen Drehzahlen konnte ich das Getriebe identifizieren. Sein Geräusch ließe sich durch Schrägverzahnung, Präzision und Materialwahl der Zahnräder vermutlich deutlich reduzieren, so daß eine Pumpe mit low noise“ Modus (für die Nacht) reali” sierbar erscheint. Eine Ankopplung des Motors an das Getriebe über eine Elastomer-Kupplung würde neben einer weiteren Geräuschreduktion auch ein noch höheres Drehmoment ermöglichen. Auch eine Mikroschrittsteuerung konnte zur Geräuschreduzierung beitragen. 63 Literaturverzeichnis [ALR00] Avizienis, A., J.-C. Laprie und B. Randell: Dependability of computer systems: Fundamental concepts, terminologiy, and examples. Technischer Bericht, LAAS-CNRS, September 2000. [Bar03] Barry, Richard: FreeRTOSTM . http://www.freertos.org, 2003. [BGJ02] Borgolte, U., M. Gerke und A. Jochheim: Mechatronik und Robotik. Kurs 20104, Fernuniversität Hagen, 2002. [Dou98] Douglass, Bruce Powel: Real-Time UML. Addison Wesley, 1998. [EL03] Evans, David und David Larochelle: Splint Manual. Technischer Bericht, University of Virginia, 2003. [Köl05] Kölln, Harm: Die Stromaufnahme der PEGASUS Infusionspumpen. Technischer Bericht, PEGASUS GmbH, 2005. www.pegasus-gmbh.com. [Lab02] Labrosse, Jean J.: MicroC/OS-II. Osborne McGraw-Hill, 2002. [MS02] Miro Samek, Ph.D.: Practical Statecharts in C/C++. CMP Books, 2002. [REGT05] Rummich, Erich, Hermann Ebert, Ralf Gfrörer und Friedrich Traeger: Elektrische Schrittmotoren und -antriebe. expert-Verlag, 2005. [Sch02] Schlienz, Prof. Dipl.-Ing. Ulrich: Sicherer Schrittmotorbetrieb ohne Positionssensor. Elektronik, (24), November 2002. [Scz02] Sczepansky, Andreas: MISRA Programmierstandard. Technischer Bericht, QA Systems, 2002. [SW03] Six, Hans-Werner und Mario Winter: Softwaretechnik. Kurs 20100, Fernuniversität Hagen, 2003. [VDE95] VDE0801, Normentwurf DIN: Funktionale Sicherheit - Sicherheitssysteme. VDE-Verlag und Beuth Verlag, 1995. [WHRK03] Wolfgang Halang, Prof. Dr. Dr. und Prof. Dr.-Ing Rundolf Konakovsky: Sicherheitsgerichtete Echtzeitsysteme. Kurs 20216, Fernuniversität Hagen, 2003. [Wik05] Wikipedia: Artikel “Hypoidantrieb”. Stand: 18. Sep 2005 19:49. Online im Internet: http://de.wikipedia.org/wiki/Hypoidantrieb, September 2005. [Wik06] Wikipedia: Artikel “Kronräder”. Stand: 25. Jan 2006 22:06. Online im Internet: http://de.wikipedia.org/wiki/Kronenrad, Januar 2006. 64 A Vergleich von FreeRTOS und MicroC/OS2 Eigenschaft kooperatives Multitasking präemptives Multitasking Round Robin Scheduling Coroutinen Semaphore Mutexe1 Queues Event Flags Message Mailboxes relatives Delay absolutes Delay2 Interruptroutinen Zertifizierbarkeit Lizenz Lizenzkosten FreeRTOS MicroC/OS2 JA JA JA JA JA NEIN JA NEIN NEIN JA JA in C mittelschwer3 OpenSource keine NEIN JA NEIN NEIN JA JA JA JA JA JA NEIN nur in Assembler leicht Proprietär JA (bei kommerziellem Einsatz) Tabelle A.1: Vergleich von FreeRTOS und MicroC/OS2 wesentlicher Nachteil von FreeRTOS Da die Prioritäten zur Laufzeit nicht geändert werden können, besteht das Problem der Prioritätsinversion4 . Dies ließe sich vermeiden: • indem nur die Tasks mit den beiden höchsten Prioritäten auf per Semaphor geschützte gemeinsam genutzte Resourcen zugreifen • oder dadurch, daß Tasks mit niedriger Priorität, die auf eine ebensolche Resource zugreifen wollen, alle anderen Tasks mit vTaskSuspendAll() für die Dauer des Zugriffs suspendieren wesentlicher Nachteil von MicroC/OS2 Die Lizenzkosten. Für die hier betrachtete Applikation würden Lizenzkosten im unteren vierstelligen Euro-Bereich anfallen. 1 2 3 4 hier ist mit Mutex eine Semaphore gemeint, die das Problem der Prioritätsinversion5 verhindert warten bis zum Erreichen eines angegebenen Zeitpunktes Zertifizierungsunterlagen müssen selber erstellt werden eine Prioritätsinversion besteht dann, wenn eine Task mit niedriger Prioriät eine Task mit höherer Priorität daran hindert, ausgeführt zu werden. Diese kann genau dann auftreten, wenn eine Task mit hoher Priorität auf eine Resource wartet, die von einer Task mit niedriger Priorität verwendet wird, und diese von einer Task mittlerer Prioriät unterbrochen wird. 65 B Verwendete Softwarewerkzeuge Sofern nichts anderes angegeben ist, handelt es sich um Open Source Programme. Compiler • avr-gcc Variante der GNU Compiler Collection“ mit einem Codegenerator für die AT” MEL AVR Prozessoren. Volle Unterstützung von ANSI C (auch C99), eingeschränkte Unterstützung von C++ und ADA. http://winavr.sourceforge.net/ (Windows-Version) http://www.kieltech.de/uweswiki/Compiling_5fAVR_2dGCC (Linux-Version) IDE’s (Integrierte Entwicklungs Umgebungen) • Eclipse universelle IDE (für viele Programmiersprachen geeignet), geschrieben in Java http://www.eclipse.org/ • Eclipse-cdt Plugin für C/C++ Entwicklung mit Eclipse http://www.eclipse.org/cdt • AVR Studio 4 Kostenlose IDE des Herstellers, mit Integration von avr-gcc, Simulator, Debugger sowie der Ansteuerung von Programmiergeräten und Emulatoren http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2725 Ich würde Eclipse für sehr kleine Projekte NICHT empfehlen, es sei denn, man hat sowieso schon Erfahrung im Umgang mit Eclipse. Eclipse ist ein sehr leistungsfähiges Werkzeug aber erfordert einen hohen Einarbeitungsaufwand. Software Dokumentation • Doxygen Dokumentations Werkzeug for C/C++ und andere Programmiersprachen http://www.stack.nl/~dimitri/doxygen/ • Graphviz graphisches Werkzeug, kann als Zusatz von Doxygen zur Erzeugung von Aufruf- und Includegraphen verwendet werden http://www.graphviz.org/ • eclox Plugin zur Vereinfachung der Benutzung von Doxygen innerhalb Eclipse http://home.gna.org/eclox/ 66 Codeanalyse • cflow Werkzeug zu Erzeugung von Aufrufgraphen in Textdarstellung, kann zur Abschätzung der maximal benötigten Stack-Tiefe verwendet werden. http://www.gnu.org/software/cflow/ • Splint Werkzeug zur statischen Codeanalyse, seine Verwendung erhöht die Sicherheit von C Programmen. http://www.splint.org/ Erstellung der Software Spezifikation • Enterprise Architect UML Entwurfswerkzeug. Sehr leistungsfähig, kommerziell aber preiswert, keine offizielle Unterstützung von C http://www.sparxsystems.com.au/ Schaltplanerstellung und Platinenlayout Für das Platinenlayout habe ich TARGET 3001! light V12 verwendet, ein preiswertes kommerzielles Programm. http://www.ibfriedrich.com/home.htm 67 C Weitere Internetquellen Folgende Internetquellen sind interessant für denjenigen, der sich in die Entwicklung mit AVR Mikrokontrollern einarbeiten will: • Webseite des Herstellers: http://www.atmel.com/products/AVR/ • AVR-Freaks sehr viele Infos und ein sehr gutes Diskussionsforum http://www.avrfreaks.com/ • www.mikrocontroller.net eine deutschsprachige Website mit guten Tutorials http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial (als Beispiel) • Archiv der avr-gcc Mailingliste Wer Webforen nicht mag, sondern eMail bevorzugt, findet hier schnelle und sehr kompetente Antworten auf (fast) alle Fragen http://lists.gnu.org/archive/html/avr-gcc-list/ 68