MCUs gibt es mit beliebiger Anzahl an Pins, Bits, Architekturen und fast jeder Kombination aus Flash und RAM. Der Großteil der Anbieter konzentriert sich darauf, mehr Leistungsmerkmale hinzuzufügen und die Auswahl zu erweitern. Einige behaupten, dass sich bei ausreichender Taktgeschwindigkeit und ausreichendem Programmspeicher jede Anwendung nur mit universellen I/Os, einem A/D-Wandler und einer PWM schreiben lässt. Dies ist weder sinnvoll noch praktisch. Embedded-Anwendungen benötigen eine Vielzahl von Peripherie, was die Sache kompliziert macht.

Es kommt daher vor, dass Entwickler mit einer bestimmten MCU ein Projekt starten und dann in der Mitte des Projekts zu einer anderen MCU wechseln, da schwer zu erkennen ist, wie die Peripheriefunktionen im eigentlichen Einsatz interagieren. Es kann auch schwierig sein, die Entwicklung der Hardware vorherzusagen, da sich die Projektanforderungen ändern und der Termindruck steigt.

Pins für jede Peripherie neu anordnen

Eck-Daten

Gerade bei Embedded-Anwendungen sind eine Vielzahl von Peripherie-Funktionen notwendig, was die Auswahl der geeigneten MCU für ein Entwicklungsprojekt kompliziert gestaltet. Aktuelle MCUs mit Peripheral Pin Select und Core-unabhängiger Peripherie erlauben es dem Entwickler jedoch, auch mitten im Projekt noch neue Funktionen zu etablieren, ohne dass eine Änderung des Leiterplatten-Layouts nötig wird. Der Beitrag von Microchip erläutert im Detail, wie sich zum Beispiel nachträglich eine 16-Bit-PWM-Funktion ohne zusätzliche externe Bauelemente realisieren lässt.

Die aktuellsten MCU-Familien bieten jedoch intelligente Möglichkeiten, die Pins für jede Peripherie neu anzuordnen. Dies gilt nicht für eine einzige alternative Pin-Funktion, sondern für eine vollständige Neubelegung der Pinbelegung für analoge und digitale Funktionen. Bei den 8-, 16- und 32-Bit-MCUs von Microchip ist diese Funktion als Peripheral Pin Select (PPS) bekannt. Jeder Pin des Bausteins lässt sich als Eingang für eine beliebige Anzahl von Peripherien verwenden (bei einigen Modellen bis zu 64) und Peripherieausgänge lassen sich auf bis zu 16 verschiedenen Pins (bei einigen Modellen 32 Pins) legen. Analogeingänge zum A/D-Wandler werden ähnlich zwischen der Vielzahl der MCU-Pins gemultiplext, zum Beispiel bis zu 35 von 40 Pins.

Dies verringert zwar das Risiko von Inkompatibilitäten beim Übergang auf neue Designs – entscheidend bei Microchip-Bausteinen ist allerdings die Core-unabhängige Peripherie (CIPs, Core Independent Peripherals). CIPs sollen die CPU entlasten, indem sie Aktivitäten auf unterer Ebene und Koordinationsaufgaben, die herkömmliche Peripherie erfordern, automatisieren. Durch die zusätzliche verfügbare Verbindung und die Flexibilität der CIPs eignen sie sich ideal für Änderungen in der Projektmitte.

PWM-Funktion erstellen

Als Beispiel soll hier die Verbesserung eines Automotive-Sensors dienen. Das System umfasst mehrere Timer, zwei 10-Bit-PWM-Module und einen Analog-Komparator, die alle in einer 28-Pin-PIC16F18855-MCU zu finden sind. Damit wird eine Grenze erreicht und ein PWM-Register mit 12 Bit oder höherer Auflösung ist erforderlich. Leider hatte jede ähnliche 8-Bit-PIC-MCU mit kompatiblem Formfaktor und entsprechender Pinbelegung entweder einen zu kleinen Programmspeicher oder viel mehr Peripherie integriert, was die Kosten in die Höhe treibt. Alles was benötigt wurde, war ein weiteres PWM-Register mit 12 Bit oder besserer Auflösung.

Bild 1: Jede PWM lässt sich aus einem periodischen Impuls und einem Limit-Zähler zusammensetzen, um die Periode und den Tastgrad der resultierenden Rechteckwelle bereitzustellen.

Bild 1: Jede PWM lässt sich aus einem periodischen Impuls und einem Limit-Zähler zusammensetzen, um die Periode und den Tastgrad der resultierenden Rechteckwelle bereitzustellen. Microchip

Zum Glück lassen sich PWM-Peripheriefunktionen auf einem Chip mit ein paar flexiblen Blöcken und Glue Logic einfach synthetisieren. Jede PWM lässt sich aus zwei Elementen zusammensetzen: einem periodischen Impuls und einem Limit-Zähler. Bild 1 beschreibt die Kombination beider, um die Periode und den Tastgrad der resultierenden Rechteckwelle bereitzustellen.

Einstellen der Zeitbasis

Die Zeitbasis lässt sich mit jedem Standard-Timer implementieren, solange er einen periodischen Impuls mit der gewünschten Frequenz von etwa 500 Hz erzeugen kann. Für diese Anwendung kann der Timer ein 8-Bit-Basis-Timer/Zähler sein, der sich mit anderen Funktionen teilen lässt. Timer 2, ein einfacher 8-Bit-Timer mit einem Match-Register (T2PR), wurde wiederverwendet. Die Konfiguration des Timer-2-Moduls als Basis-Timer erfordert nur ein Registerpaar.

Bild 2: Mit dem MPLAB-Code-Configurator lässt sich recht einfach eine Initialisierungsroutine erstellen, hier im Bild für Timer 2.

Bild 2: Mit dem MPLAB-Code-Configurator lässt sich recht einfach eine Initialisierungsroutine erstellen, hier im Bild für Timer 2. Microchip

Die herkömmliche Entwicklung einer Initialisierungsroutine für den Basis-Timer würde ein Eintauchen in das umfangreiche Datenblatt der PIC-MCU erfordern, um die Bitmuster zu identifizieren, die für jedes der Register erforderlich sind. Dies kann ein langwieriger und fehleranfälliger Prozess sein, sogar für eine einfache Peripheriefunktion. Hilfe verspricht der MPLAB-Code-Configurator (MCC), ein in der MPLAB-X-IDE integriertes Rapid-Development-Tool-Plugin, das mit wenigen Mausklicks eine Initialisierungsroutine erzeugt. In Bild 2 sind alle für Timer 2 verfügbaren Optionen so angelegt, dass sie aus mehreren Auswahlfeldern und Eingabefeldern ausgewählt werden können.

Limit-Zähler konfigurieren

Bild 3: Ein Signal-Measurement-timer bietet interessante Möglichkeiten, zwei Trigger/Reset-Eingänge bei MCUs mit Peripheral Pin Select zu kombinieren.

Bild 3: Ein Signal-Measurement-timer bietet interessante Möglichkeiten, zwei Trigger/Reset-Eingänge bei MCUs mit Peripheral Pin Select zu kombinieren. Microchip

Der Limit-Zähler ist anspruchsvoller, aber nicht zu komplex. Einmal ausgelöst, muss dieser Timer bis zu einem Grenzwert zählen, einen Puls erzeugen und stoppen. Er wird zurückgesetzt und beginnt beim nächsten Trigger-Eingang von neuem. Dies wird oft als „retriggerbar monostabil“ oder in der PIC-Literatur als Hardware-Limit-Timer (HLT) bezeichnet. Leider wird der typische HLT auf einer PIC-MCU für eine 12-Bit- oder höhere Auflösung des PWM-Tastgrads nicht funktionieren. Auf aktuellen PIC-MCUs bieten geradzahlige Timer die HLT-Funktion, stellen aber nur einen 8-Bit-Zähler zur Verfügung. Es gibt aber noch eine andere, weniger bekannte Peripherie, die diese Auflösung erzielen kann. Dazu zählt der Signal-Measurement-Timer (SMT) in Bild 3.

Bild 4: Mithilfe des MCC-Tools lässt sich der SMT1 einfacher konfigurieren und erlaubt es auch Anfängern, dieses recht wenig genutzte CIP einzusetzen.

Bild 4: Mithilfe des MCC-Tools lässt sich der SMT1 einfacher konfigurieren und erlaubt es auch Anfängern, dieses recht wenig genutzte CIP einzusetzen. Microchip

Wenn der HLT etwas mehr als ein Timer mit einem zusätzlichen Trigger/Reset-Eingang ist, dann ist der SMT ein Timer mit zwei solchen Eingängen. Es gibt interessante Möglichkeiten, diese beiden Eingänge zu kombinieren, um verschiedene Zeit-, Frequenz- und Tastgrad-Messungen zu erhalten. Das Datenblatt listet 11 solcher Modi auf, die ausreichen, um Anfänger zu verunsichern und den SMT zu den am meisten missverstandenen und zu wenig genutzten CIPs zu machen. Einer der Modi (Window-Measurement-Mode) wandelt den SMT in einen sehr großen HLT um, da der SMT einen 24-Bit-Zähler und ein Periodenregister mit übereinstimmender Größe aufweist. Auch hier lässt sich der SMT1 mithilfe des MCC-Tools einfacher konfigurieren (Bild 4).

Effektive Auflösung der PWM

Ein gängiges Missverständnis ist, dass die Auflösung eines PWM-Registers einfach durch die nominale Anzahl der Bits des Timers gegeben ist, der die Dauer des Ein-Impulses (Tastgrad) steuert. Nach dieser Definition wäre eine 24-Bit-PWM-Funktion gerade zusammengestellt worden, aber das ist falsch. Die Periode und das Tastverhältnis einer PWM sind keine vollständig unabhängigen Größen, aber beide sind durch Timer/Zähler gesteuert und es gibt eine gemeinsame Beziehung mit dem Peripherietakt der MCU.

Für jeden Peripherietakt kann der für die Einschaltzeit verantwortliche Zähler nur bis zu einem maximalen Wert (Max-Count) zählen, bevor sich die Zeitbasisperiode wiederholt. An diesem Punkt hat das PWM-Register einen Tastgrad von 100 Prozent erreicht – es kommen aber niemals zusätzliche Bits in seinem Register zum Einsatz. Die Formel Max-Count = TPeriode · fTakt bestimmt die effektive Auflösung der neu erstellten PWM-Funktion, wobei TPeriode = 2,048 ms und eine Peripherie-Taktfrequenz von 32 MHz vorliegen. Das SMT lässt sich direkt mit der maximalen Systemoszillatorfrequenz takten und ist nicht auf den CPU-Befehlstakt beschränkt, der durch 4 geteilt wird. Damit beträgt Max-Count also 65.356.

Der Logarithmus zur Basis 2 des Max-Count-Wertes ist die effektive Auflösung der PWM in Bits, genau 16 Bit. Dieses Ergebnis bestätigt, dass das neue PWM-Modul tatsächlich genauer ist als die PIC-Standard-10-Bit-PWM-Module und das ursprüngliche Ziel übertrifft.

Fazit

Eine effektive 16-Bit-PWM-Funktion ließ sich ohne zusätzliche externe Bauelemente erstellen. Dafür wurden einige Funktionen auf dem Chip einfach konfiguriert, miteinander verbunden und wiederverwendet. Die neu erstellte Funktion kann die bereits vorhandene ersetzen, ohne das Layout der Leiterplatte ändern zu müssen, da die PPS-Funktion den Einsatz der neuen Funktion auf beliebigen Pins ermöglicht. Ferner verhält sich das Modul als eine vollständig autonome Funktion, da keine Prozessorzeit erforderlich ist, um seinen kontinuierlichen Betrieb neben dem anfänglichen Setup und der gelegentlichen Einstellung des Tastgrads aufrechtzuerhalten.