Böcker Sirius STK1 Starter-Kit (Teil 2): Verstärker und A/D-Wandler

 

Nachdem wir im 1. Teil unseres Mikrocontroller-Kurses mit dem Böcker Sirius Starter-Kit STK1 die grundlegende Bedienung des PSoC-Designers kennengelernt haben, kommen wir nun zu dem was die PSoC-Controller von Cypress eigentlich ausmachen: Den User-Modulen. Das sind Komponenten, die sowohl einen Einfluss auf die Hardware des PSoCs haben als auch Funktionsbibliotheken für den Zugriff auf das jeweilige Modul bieten. Für dieses Tutorial werden wir uns 3 User-Module anschauen:

 

LCD: Eine Komponente zur einfachen Ansteuerung von LCD-Anzeigen. Dieses Modul besteht nur aus Sofware, nimmt uns aber auch einige Einstellungen bezüglich der benutzten Pins ab. 

 

PGA: Ein programmierbarer Operationsverstärker mit Verstärkungen von 0,062 bis 48 in 33 einstellbaren Stufen.

 

ADCINC: Ein inkrementaler AD-Wandler mit einer einstellbaren Auflösung von 6 bis 14 Bit

 

Öffnen Sie nun ein neues Projekt, vergeben Sie einen Namen und wählen Sie für den Ziel-Controller wieder den CY8Y24423, der sich auf dem Böcker Merkur PEv1-Board befindet. Nachdem Sie den Dialog bestätigt haben, öffnet sich das Startfenster des Designers mit dem folgenden Block in der Mitte:

 

Startschirm.PNG
 

Der mittlere Block stellt die hardwaremäßige Aufteilung dar. Sie können die einzelnen Pins an den Randbereichen erkennen, die verfügbaren digitalen Modulplätze befinden sich oben und die analogen Modulplätze unten. Es macht keinen Sinn, alle Bestandteile dieses Fensters vorab zu erklären. Das können Sie viel besser bei der Umsetzung der Beispiele verstehen. 

 

Als erstes wollen wir das LCD-Modul im Projekt installieren und es danach auch sofort ausprobieren.Dazu öffnen Sie im Fenster "User Modules" unten rechts den Eintrag "Misc Digital" und klicken doppelt auf den Eintrag LCD.

 

LCD_Auswahl.png

 

Im Parameter-Fenster (links, Mitte) werden nun Einträge für das LCD-Modul sichtbar. Der Name wird vom Designer standardmäßig mit dem Modulnamen einem Unterstrich und einer laufenden Nummer vergeben. Sie können den Namen aber beliebig ändern. Wir lassen den Namen so wie er ist und wählen den Port, an dem unser LCD-Modul angeschlossen ist. Im Fall des Böcker Merkur PEv1-Boards ist das der Port 2.

 

Port_Auswahl_LCD.png
 

Der Eintrag "BarGraph" gibt an, ob wir die LCD-Anzeige als Balkenanzeige nutzen möchten. Auch wenn wir das nicht wollen, kann der Eintrag auf "enable" stehen bleiben. Damit sind alle Angaben eingetragen.

 

Der Designer hat nun die Anschlüsse am Port 2 entsprechend belegt, wie wir im Fenster "Pinout" (unten, links) erkennen können:

 

Pinout_LCD.png



Nun haben wir alle notwendigen Vorbereitungen getroffen, um die LCD-Anzeige mit dem Board einzusetzen. Um etwas darzustellen, brauchen wir natürlich noch Software. Dafür steht bei jedem Modul eine Sammlung von Funktionen (API) zur Verfügung. Wechseln wir also in den Quellcode-Editor.

 

Workspace-Editor.png

 

Dazu wählen wir im Workspace-Explorer (oben, rechts) unter "Source Files" einfach die Datei "main.c" aus, das ist die standardmäßige Startdatei und Sie landen im Editor.

 

Sourcecode_1.png

 

Wenn Sie es möchten, können die Kommentare löschen, für unser Beispiel ist der grüne Text eh nicht relevant. Die Funktionen eines jeden Moduls können Sie sich anschauen, indem Sie im User-Modules-Fenster auf das jeweilige Modul rechts klicken und sich dann das Datenblatt anzeigen lassen. Um einen simplen Text auf der LCD-Anzeige auszugeben, benötigen wir lediglich 3 Befehle:

 

LCD_Prog.png
 

LCD_1_Start() ist nahezu selbsterklärend, alternative dazu könnten Sie auch LCD_1_Init() aufrufen. Beide Funktionen sorgen u. a. dafür, dass die Pins in der Art und Weise angesteuert werden, wie Sie es im Designer vorgegeben haben. Mit LCD_1_Position geben Sie die Zeile und die Spalte der LCD-Anzeige an. LCD_1_PrCString gibt dann den Text aus. Würden Sie eine String-Variable verwenden, müssen Sie die Funktion LCD_1_PrString(string) wählen. Diese Unterscheidung ist wichtig, weil Stringvariablen im RAM abgelegt werden und Konstanten - wie sie ein fester Text ja nun mal sind - im ROM. Es gibt noch sehr viele weitere LCD-Funktionen z. B. zur Darstellung von Integer- oder Byte-Werten:

 

- LCD_1_PrHexByte(byte)

- LCD_1_PrHexInt(Integer)

 

Hinweis: Hätten Sie den Namen des User-Moduls LCD_1 in LCD geändert, dann würden sich auch alle Funktionsaufrufe z. B. in LCD_Start() ändern. Auch alle symbolischen Variablen, die bei den API-Funktionen zum Einsatz kommen, unterliegen dieser Regel. 

 

Unser Programm zur Ausgabe wäre damit fertig. Ein Build-Vorgang würde uns allerdings eine Fehlermeldung einbringen, denn jedes Mal, wenn wir die Hardware neu konfiguriert haben, müssen wird zunächst die Konfigurationsdateien neu erzeugen. Alles in einem Schritt wird beim Klick auf das linke Symbol in der Tool-Leiste oder durch Drücken der F6-Taster erreicht. 

 

PSoC_11.PNG

 

Schließen Sie nun die LCD-Anzeige (Steckplatz 8) und den Programmer (Steckplatz b) an  und laden Sie das Programm über "Program" -> "Prgram Part" in den Controller.

 

PSoC_Board_Uebersicht1_klein.jpg

 

Wenn der Download beendet ist, schalten Sie die Versorgung im Programmer-Dialog wieder ein und Sie können nun den Text auf Ihrer LCD-Anzeige sehen. 

 

LCD_1.png
 

 

Der Verstärker PGA

 

Wir erweitern unsere kleine Anwendung nun um einen Verstärker. Wechseln Sie dazu zunächst wieder in die Designer-Ansicht, in dem Sie oben die Registerkarte mit dem Projektnamen anklicken (neben main.c). Dann klicken Sie im Fenster "User Modules" im Ordner "Amplifiers" diesmal doppelt auf den Eintrag PGA. Diesmal passiert ein wenig mehr, denn ein PGA besteht sowohl aus einer Software- wie auch aus einer Hardware-Komponente. 

Der PSoC-Designer hat die PGA-Komponente in die erste Spalte der analogen Module platziert. Die Platzierung der Module ist nicht ganz egal und auch nicht überall möglich. Hier müssen Sie ein wenig planen. Zunächst müssen wir unseren Verstärker mit einem Pin verbinden. Auf dem Böcker Merkur PEv1-Board befindet sich ein kleiner Spannungsteiler mit einem Poti, der für unsere Zwecke geeignet ist. Er ist mit dem Pin P0.1 verbunden. Wie bekommen wir nun den Pin P0.1 zum Verstärker?

 

Analog-Routing1.png

 

Am besten gehen Sie vom Eingang des Verstärkers aus. Wenn Sie direkt auf das Wort "Input" klicken, erhalten Sie eine Auswahlliste. Allerdings finden wir noch nicht unseren Port-Pin 0.1. Dazu benötigen wir den Multiplexer direkt über dem PGA-Modul. Er trägt die Bezeichnung "AnalogColumn_InputMUX_0". Haben Sie diese Verbindung hergestellt, sehen Sie folgendes Bild:

 

Analog-Routing2.png
 

Der Verstärker ist jetzt mit dem Ausgang des Multiplexers verbunden, der allerdings noch nicht mit dem richtigen Eingangs-Pin. Klicken Sie jetzt auf den Multiplexer und Sie erhalten wieder eine Auswahlliste:

 

Analog-Routing3.png

 

Dort können Sie nun den gewünschten Pin P0.1 auswählen. Sie sehen übrigens, dass Sie nur die ungeraden Pins von Port 0 wählen können. Möchten Sie z. B. unbedingt P0.2 als Eingang haben, dann müssten Sie das PGA-Modul in die 2. analoge Spalte verschieben. Dort stehen dann sogar 2 Multiplexer zur Verfügung und Sie könnten sowohl die geraden als auch die ungeraden Pins als Eingang wählen. Wir wollen es aber bei unserer jetzigen Konstellation belassen.

 

Analog-Routing4.png

 

Durch das Verbinden von P0.1 mit einem analogen Modul wurde übrigens automatisch auch die "Select"-Eigenschaft von P0.1 von Standard-CPU "StdCPU" auf "AnalogInput" geändert, wie Sie durch einen Klick auf das Pin-Symbol links erkennen können:

 

Analog-Routing5.png

 

Nun werden wir den Verstärker selbst konfigurieren und gehen dazu wie beim LCD-Modul zuvor auch in das "Parameter"-Fenster (links, Mitte ):

 

PGA_Parameter_2.png
 


Die erste Eigenschaft, die wir einstellen, ist der Verstärkungsfaktor. Wir wählen ein Wert von 2,000. Der nächste Wert "Input" ist schon ausgefüllt, denn wir haben das Routing ja grafisch durchgeführt. Die Werte, die wir für die Verstärkung im Parameter-Fenster eingegeben haben, sind natürlich nicht unveränderbar. Über den Funktionsaufruf "PGA_SetGain(Gain)" können Sie im Programm den Wert jederzeit wieder ändern. 

 

PGA_Parameter_2b.png

 

Mit "Reference" geben wird den Bezugspunkt an. ACB01 und ASC10 sind analoge Blöcke, AGND ist die virtuelle analoge Masse, die genau zwischen Vdd und Vss liegt. Bei einem 5-V-Betrieb sind das 2,5 V, um bipolare Signale aufnehmen zu können. Da wir lediglich eine Gleichspannung am Eingang haben, wählen wir Vss als Bezugspunkt. 

 

PGA_Parameter_3.png

 

Mit dem letzten Parameter wählen wir nun den Ausgang. Wenn Sie das Signal einem A/D-Wandler zuführen wollen und nur intern verarbeiten, dann können Sie diesen Wert auf "Disable" setzen. Wollen Sie den Ausgang analog direkt auf einen Controller-Pin führen, dann müssen Sie den PGA mit dem "AnalogOutBus0" verbinden. 

 

PGA_Ausgang1.png

 

Am "AnalogOutBus_0" steht uns allerdings nur Pin 0.3 zur Verfügung. In der 2. analogen Modulspalte wäre es P0.5. Alle verfügbaren analogen Ausgangs-Pins sehen Sie ganz rechts. Alle Anschlüsse, die als analoge Eingänge konfiguriert werden können, sind hingegen ganz links im Designer angeordnet. 

 

Damit wäre unser Verstärker konfiguriert. In unserem kleinen Programm müssen wir nur den Funktionsaufruf PGA_1_Start() unterbringen und einen Parameter für die Energieversorgung des analogen Blocks angeben. In unserem Fall wählen wir den Wert PGA_1_HIGHPOWER. Mit diesem Parameter wird die Leistung für den analogen Block bereitgestellt. 

 

 

Code_PGA1.png

 

Erstellen Sie das Programm wieder über "Generate/Build" damit die Hardware neu konfiguriert und das Programm kompiliert und laden Sie das Ergebnis ins Board. Stecken Sie das kleine Potentiometer in den Steckplatz "4" auf dem Board und vergleichen Sie die Spannung mit einem Multimeter am Pin 0.1 und Pin 0.3. Damit Sie nicht im Datenblatt nachschauen müssen, klicken Sie einfach im Workspace-Explorer auf die "Pinout"-Datei: 

 

PSoC_Pinout.png
 

 

Sie haben gerade kein Multimeter zur Hand? Dann müssen Sie mir entweder glauben oder Sie bauen sich kurzerhand ein eigenes Multimeter mit Ihrem PSoC-Starterkit. 

 

Der A/D-Wandler ADCINC

 

Da Sie sich mittlerweile schon recht gut in der PSoC-Designer-Oberfläche auskennen, werde ich die Integration des A/D-Wandlers etwas weniger ausführlich darstellen. Als erstes wählen Sie im Fenster "User Modules" unter ADC den ersten Eintrag ADCINC aus. Sie können diesmal 2 Varianten wählen. Einen A/D-Wandler mit ein- oder zweistufigem Modulator. Letzterer hat ein besseres Quantisierungsrauschen, benötigt aber 2 analoge und einen digitalen Block. Die einstufige Variante kommt mit einem analogen und einem digitalen Block aus. Da es hier nur um das Prinzip geht, reicht uns die einstufige Ausführung.

 

Select_ADCINC.png

 

Nach dem Platzieren sehen Sie oben in den digitalen Modulplätzen einen Teil des A/D-Wandlers und direkt unter dem PGA den zweiten Block. Der digitale Teil bieten eine PWM-Funktion, die uns momentan nicht interessiert. Deshalb konzentrieren wir uns ausschließlich auf den unteren analogen ADC-Block. Wir konfigurieren ihn diesmal komplett im "Parameter-Fenster":

 

ADC_Settings.png

 

Als Name wählen wir diesmal ADC1, weil uns ADCINC zu lang ist. Das Datenformat ist vorzeichenlos, also unsigned und für die Auflösung reichen uns 10 Bit. Die Taktquelle ist VC1 (dazu komme ich gleich noch im Detail) und der Eingang ist der Block ACB00, dort sitzt der Verstärker PGA. Dass dem Ausgang des PGA schon der Pin P0.3 zugewiesen wurde, stört nicht. Das Ihre Eingaben erfolgreich waren, sehen Sie am folgenden Bild:

 

ADC_PGA.png
 

Der Ausgang des PGA ist wie gewünscht mit dem A/D-Wandler verbunden. Wir ändern nun aber die Verstärkung im PGA auf  "1", damit wir den vollen Bereich besser ausnutzen können. Wenn Sie die Parameter für ein anderes Modul ändern wollen, markieren Sie den entsprechenden Eintrag im Workspace-Explorer oder das platzierte Modul selbst, dann öffnet sich sofort das dazugehörige Parameter-Fenster.

 

Nun aber wie versprochen zur Taktquelle VC1. Dieser Wert wird in den "Global Settings" bestimmt. 

 

Global_Resources_1.png

 

In der ersten Zeile sehen Sie, das der Systemtakt (SysClk) auf 24 MHz steht. Der Wert für VC1 wird in der 6. Zeile bestimmt, indem der Systemtakt durch 3 geteilt wird. Sie können auch beliebige andere Werte zwischen 1 und 16 eingeben. Weitere Teiler finden Sie in VC2 und VC3. VC2 kann ebenfalls Werte zwischen 1 und 16 annehmen, bei VC3 können die Eingaben zwischen 1 und 256 variieren. Wir haben einen Wert von 3 gewählt, also hat VC1 den Wert 8 MHz. Das ist allerdings nicht die Abtastrate für den A/D-Wandler. Mit der Formel möchte ich Sie hier verschonen, Sie finden Sie aber im Datenblatt des ADCINC. Für 10 Bit und 8 MHz Takt ergibt sich auf jeden Fall eine A/D-Wandlerrate von ca. 1,8 kHz. 

 

Auch der Eintrag bei "Ref Mux" ist für unsere Anwendung interessant. Hier stellen Sie den Referenzbereich ein, der im PSoC genutzt wird. Da wir Spannungen zwischen 0 und 5 V messen wollen, stellen wir die Wert (Vdd/2) +/- (Vdd/2), denn 2,5 V +/- 2,5 V ergibt nunmal genau 0 bis 5 V. 

 

Das wäre es zur Konfiguration des A/D-Wandlers auch schon. Der Source-Code ist allerdings ein wenig umfangreicher, als bisher gehabt. Gehen wir ihn Zeile für Zeile durch:

 

ADC_Code.png

 

Zunächst brauchen wir eine Integer-Variable (Zeile 11), die unseren Messwert aufnimmt. In Zeile 18 starten wir wie schon von den anderen Modulen bekannt den A/D-Wandler. Mit der Funktion ADC1_GetSamples(0) bestimmen wir die Anzahl der Wandlungen, 0 bedeutet kontinuierliche Wandlung. Das Makro M8C_EnableGInt gibt die globalen Interrupts frei. Nun gehen wir in eine Endlos-Schleife und fragen ganz zu Anfang ab, ob Daten aus der Wandlung da sind. So lange dies nicht der Fall ist, warten wir. Sind Daten da, speichern wir diese in iMesswert. Die Funktion ADC1_iClearFlagGetData() holt die Daten und setzt das Flag zurück, damit neue Daten gewandelt werden können. Die 3 LCD-Funktionen geben dann den Messwert aus. LCD_1_PrHexInt gibt eine Integer in einem 4-stelligen hexadezimalen Format aus. Und das Ergebnis sieht jetzt so aus:

 

IMG_2374.jpg

 

Ich hoffe, es hat Ihnen Spaß gemacht und Sie sind neugierig auf weitere Informationen rund um diesen faszinierenden Controller. Im nächsten Teil werden wir uns mit Timern, Countern, dem D/A-Wandler und der Interrupt-Verarbeitung beschäftigen. Ich würde mich freuen, wenn Sie wieder mit dabei sind. 

 

Für weitere Informationen und Bestellungen des Böcker PSoC-Starter-Kits einfach auf nachfolgenden Link klicken:

logo_klein.png Böcker Sirius STK1 Starter-Kit                   
 

 

Falls Sie Fragen zum Thema haben, wenden Sie sich einfach an uns.

Wir helfen Ihnen gern weiter!

 

Ihr Team von Böcker Systemelektronik

 

Hinweis: Unser Tutorialangebot wird in unregelmäßigen Abständen erweitert. Wenn Sie sofort über eine Neuerscheinung informiert werden möchten, tragen Sie sich bitte hier in unsere Benachrichtigungsliste "Tutorials" ein. Sie können diesen unverbindlichen Service jederzeit in Ihrem Kundenkonto oder per E-Mail wieder abbestellen.  

 

 

Copyright © Böcker Systemelektronik