DesignSpark Electrical Logolinkedin
Menu Suche
Ask a Question

21 Feb 2019, 13:53

Experimente mit Peripheriegeräten und dem Clicker 2 für PSoC 6

Die PSoC-6-Einheit von Cypress Semiconductor ist ein sehr leistungsstarker und flexibler Mikrocontroller mit einer Vielzahl an großartigen Funktionen. Das ist zwar toll, man wird jedoch beim Betrachten der ganzen Dokumentation abgeschreckt (Cypress dokumentiert gerne alles) und überlegt, wie steil die Lernkurve sein wird, wenn man schon mit einem recht einfachen Projekt loslegt, insbesondere wenn die Gestaltung der eigenen Platine für die Anwendung das letztendliche Ziel ist. Hier kann der Mikroelectronica Clicker 2 für PSoC 6 dazu beitragen, die Elemente eines einfachen Projekts zu fokussieren. In diesem Artikel gehen wir zurück zu den Basics und stellen uns so auf, dass wir einfach mit Sensoren (oder anderen Peripheriegeräten) experimentieren können, die wir in einem PSoC-6-Projekt verwenden möchten.

Einführung des Clicker 2 für PSoc 6

Der Clicker 2 hat ein hübsches minimalistisches Design, insbesondere im Vergleich zu den meisten modernen Entwicklungsplatinen, die versuchen, jedes Merkmal der MCU auf einer Platine zu zeigen. Wenn Sie sich den Schaltplan anschauen, sehen Sie ein PSoC 6, ein PSoC 5 (für die Programmierung und das Debugging des PSoC 6), einen LTC3586 USB Power Manager und Steckverbinder für die Montage von zwei Mikroelectronica Click-Platinen. Abgesehen von den erforderlichen passiven Bauelementen zur Gewährleistung des reibungslosen Betriebs unserer Geräte gibt es nicht mehr viel. Aber keine Sorge, Sie haben auch noch die Druckschalter und LEDs, die für eine ordnungsgemäße Anwendung wichtig sind.

Das vereinfachte Design macht es leichter, sich ganz auf das zu konzentrieren, was Sie von einem MCU-Projekt erwarten, ohne störende Geräte und Funktionen, die Sie sowieso nicht verwenden werden. Darüber hinaus fällt das Experimentieren mit Sensoren und anderen Geräten (durch einfaches Austauschen der Click-Platine) leichter, um so entscheiden zu können, ob es sich tatsächlich um die richtigen Teile handelt, die Sie in Ihr Projekt integrieren möchten.  

Und das ist auch eine gute Überleitung zu dem, was wir heute tun werden. Ich hatte seit Monaten einen MQ-7-basierten Kohlenmonoxid-Detektor (CO click) in meiner Schublade herumliegen. Ich hatte überlegt, ich könnte ihn beim Erstellen eines IoT-basierten (oder eines Bluetooth-basierten) Warnsystems verwenden. Daher bietet es sich jetzt an, den Detektor mit einer MCU auszuprobieren, die die vollständige Anwendung einfach handhaben wird.

Einrichtung

Was bei integrierten Systemen zu wünschen übrig lässt, ist, dass man nicht weiß, was im Inneren vorgeht. Daher kann es beim Entwickeln einer Anwendung schwierig sein, herauszufinden, was funktioniert und was nicht. Wir werden dieses Problem durch die Verwendung von FreeRTOS beheben, das in PSoC Creator integriert ist, um STDOUT an ein Terminalfenster umzuleiten, das über das USB-Gerät verbunden ist. Auf diese Weise können wir die treue „Printf“-Funktion verwenden, die uns verrät, was in unseren Programmen vorgeht. Dies ist eine einfache Einrichtung, die zu Beginn jedes PSoC-Projekts wiederverwendet werden kann, um das Debugging zu erleichtern.

Öffnen Sie den PSoC Creator 4.2, und wählen Sie „File -> New Project“ (Datei -> Neues Projekt). Sie werden nach einem Zielgerät gefragt. Wenn Sie den PSoC 6 bereits verwendet haben, wird Ihnen Folgendes angezeigt:

In unserem Fall verwenden wir die PSoC 63-Einheit. Klicken Sie auf „Next“ (Weiter) und im nächsten Fenster erneut auf „Next“ (Weiter) (wir verändern die Standardeinstellungen nicht), bis die Option „Select project template“ (Wählen Sie eine Projektvorlage aus) angezeigt wird. In unserem Fall wählen wir den leeren Schaltplan aus. Geben Sie dem Projekt einen Namen, und klicken Sie auf „Finish“ (Fertigstellen). Daraufhin wird ein leerer Arbeitsbereich angezeigt:

Wir verwenden einen UART für unsere Kommunikation. Daher müssen wir einen aus dem Komponentenkatalog rechts neben dem Hauptfenster abrufen. Die einfachste Möglichkeit, Komponenten zu finden, besteht darin, das gewünschte Element in der Suchleiste oben im Komponentenkatalog-Fenster einzugeben. Dann ziehen wir einfach die Komponente und legen Sie in unserem Hauptfenster ab:

Wir behalten die UART-Standardeinstellungen bei. Daher müssen wir nicht darauf doppelklicken, um den Einstellungsbildschirm aufzurufen. Aber wir müssen den UART mit den richtigen Ausgabe-Pins verbinden, die sich auf dem Schaltplan der Clicker-2-Platine befinden:

Das heißt, wir benötigen P12.1 und P12.0, die wir durch Doppelklicken auf „pins“ (Pins) im Workspace-Explorer (links vom Hauptfenster) einrichten können:

Hmm, es scheint, als gäbe es eine Diskrepanz zwischen meiner Version des Schaltplans und dem PSoC Creator bezüglich der Stifte Rx und Tx. Also arbeiten wir mit der Version des PSoC Creator.

Jetzt müssen wir unsere STDIO wieder auf den UART anpassen, damit wir unsere „Printf“-Anweisungen erhalten können, die an das Terminal gesendet werden. Wir beginnen mit dem Einrichten von FreeRTOS. Klicken Sie mit der rechten Maustaste auf den Projektnamen und wählen Sie „Build Settings...“ (Build-Einstellungen):

Dann navigieren wir zu „Peripheral Driver Library“ (Peripherietreiberbibliothek) und wählen unter FreeRTOS (unter Verwendung des Standard-Heap) die Option „Memory Management“ (Speicherverwaltung) und „Retarget I/O“ (E/A neu ausrichten) aus:

Jetzt können wir zur oberen Menüleiste navigieren und die Option „Build -> Generate Application“ (Build -> Anwendung generieren) auswählen, um sicherzustellen, dass wir alles richtig eingerichtet haben. Großartig!

Der PSoC Creator hat nun einige Dateien, einschließlich FreeRTOS, stdio_user.c, stdio_user.h and retarget_io, zu unserem Projekt hinzugefügt. Wir müssen stdio_user.h überarbeiten:

Wir fügen oben Folgendes hinzu:

#include <project.h>

Und ändern die UART-Definitionen:

#define IO_STDOUT_UART          UART_1_HW
#define IO_STDIN_UART           UART_1_HW

Als nächstes öffnen wir „FreeRTOSConfig.h“

und kommentieren die Warnung in Zeile 45 aus, bevor wir die Heap-Größe in Zeile 71 ändern:

#define config_TOTAL_HEAP_SIZE      (48*1024)

Nun haben wir die Änderungen abgeschlossen und können zu main_cm4.c (im Workspace Explorer aufrufen) wechseln, und einige Codes hinzufügen, um den UART für unsere Kommunikation zu starten und etwas an das Terminal auszugeben.

#include "project.h"
#include <stdio.h>
 
int main(void)
{
    __enable_irq(); /* Enable global interrupts. */
 
    /* Place your initialization/startup code here (e.g. MyInst_Start()) */
 
    PWM_1_Start();
    UART_1_Start();
    
    printf("\033[2J\033[H"); // Clear Screen
    printf("Test\r\n");
    
    
    for(;;)
    {
        /* Place your application code here. */
    }
}

Wir benötigen nur noch eine Sache, bevor wir unseren Code ausführen können: einen Terminal-Emulator wie Putty oder Tera Term. Zum Einrichten müssen wir den Geräte-Manager von Windows öffnen und schauen, mit welchem COM-Anschluss der KitProg2 USB-UART verbunden ist:

Ich verwende also COM12. Wir können das in unseren Terminal-Einstellungen festlegen. Ich verwende Putty und meine Einstellungen sehen wie folgt aus:

Öffnen Sie das Terminal und kehren Sie dann zum PSoC Creator zurück. Klicken Sie dann auf die Schaltfläche „Program“ (Programm) (direkt über dem Workspace Explorer). Nachdem die Anwendung erstellt und auf den PSoC 6 geladen wurde, können wir zurück zu unserem Terminal und, siehe da! Da ist unsere Nachricht:

Hinzufügen des Sensors

Da unser Debugging-Schaltplan nun eingerichtet ist, können wir jetzt herumexperimentieren. Auf dem Schaltplan der CO click-Platine können wir sehen, dass wir einen Analogausgang haben, der vom Sensor zum analogen Pin führt:

Wenn wir uns wieder unseren Schaltplan der Clicker-2-Platine anschauen, erkennen wir, dass der analoge Pin auf der ersten Click-Platinenseite mit P10.4 des PSoC 6 verbunden ist. Daher müssen wir einen Analog-Digital-Wandler (ADC) einrichten, um die Spannung auf diesem Pin zu erfassen.

Wenn wir im Komponentenkatalog im PSoC Creator nach „ADC“ suchen, finden wir den Scan-ADC mit sukzessiver Approximation (SAR), den wir auf unsere oberste Designebene setzen:

Wir müssen das einrichten, um für unser 5-V-Gerät einen einseitigen Eingang mit ausreichender Spannung im Eingangsbereich zu gewährleisten:

Nach Einrichtung dieser Werte benötigen wir einen analogen Pin, an den wir den ADC anschließen können. Wir können diesen im Komponentenkatalog finden. Ziehen Sie die Komponente in das Design und verbinden Sie sie mit dem Eingang unseres ADC:

Anschließend verbinden wir diesen Pin mit P10.4 im Pin-Diagramm:

Zum Ausführen unserer Datenerfassung benötigen wir ein Programm. Ich habe im Beispielprogramm für den CO click auf der Website von Mikroelectronica eine Gleichung gefunden, mit der die vom ADC gemessene Spannung in ppm (Teile pro Million) umgewandelt werden kann. Diese verwenden wir in unserem eigenen Programm:

/* ========================================
 *
 * Reading data from an MQ-7 CO sensor
 *
 * ========================================
*/
#include "project.h"
#include <stdio.h>
#include <math.h>

const double Rl       = 5000.0;              // Rl (Ohm) - Load resistance
const double Vadc_2x  = 0.0016113281;        // ADC step 2*Vref/4096 1.61mV (12bit ADC)
const double Vadc_33  = 0.0008056641;        // ADC step 3.3V/4096 0.81mV (12bit ADC)
double Vrl;                                  // Output voltage
double Rs;                                   // Rs (Ohm) - Sensor resistance
double ppm;                                  // ppm
double ratio;                                // Rs/Rl ratio

int16_t adc_rd, adc_V;
char txt[16];

//Calculation of PPM
void calculatePPM() {
  double lgPPM;
  Vrl = (double)adc_rd * Vadc_2x;            // For 3.3V Vcc use Vadc_33
  Rs = Rl * (5 - Vrl)/Vrl;                   // Calculate sensor resistance
  ratio = Rs/Rl;                             // Calculate ratio
  lgPPM = (log10(ratio) * -3.7)+ 0.9948;     // Calculate ppm
  ppm = pow(10,lgPPM);                       // Calculate ppm
}

int main(void)
{
    __enable_irq(); /* Enable global interrupts. */

    UART_1_Start();
    printf("\033[2J\033[H"); // Clear Screen
    printf("Terminal Output Running...\r\n");
    
    ADC_1_Start();
    
    printf("Conversion starting now...\r\n\n");

    for(;;)
    {
        ADC_1_StartConvert();
        Cy_SysLib_Delay(50);
        adc_rd = ADC_1_GetResult16(0);                // Connected to mikroBus1 AN pin/P10.4
        Cy_SysLib_Delay(50);
        adc_V = ADC_1_CountsTo_Volts(0, adc_rd);  
        Cy_SysLib_Delay(50);
        ADC_1_StopConvert();
        Cy_SysLib_Delay(50);
        
        calculatePPM();                               // Calculating PPM value
        printf("ADC value = %d, Volts = %f, ppm = %f\r\n", adc_rd, Vrl, ppm);
        Cy_SysLib_Delay(5000);
    }
}

/* [] END OF FILE */

Jetzt können wir den PSoC 6 programmieren. Wenn wir all das auf das Gerät hochladen und uns unseren Terminal anschauen, dann sehen wir einige Daten, yeah!

Zur Überprüfung: Wenn wir die Spannung am analogen Pin und dem Massekontakt auf der CO click-Platine messen (mit unserem vertrauten RS Pro-Digitalmultimeter), so werden die gleichen Spannungspegel angezeigt. Großartig, unser ADC funktioniert erwartungsgemäß!

Wenn jetzt also der PSoC 6 meldet, dass in der Luft eine hohe CO-Konzentration herrscht, kommt die Frage auf, wie ich meine Spannung (mit dem Potentiometer auf dem CO click) optimieren kann, um ppm-Messwerte zu erhalten, die in der richtigen Größenordnung liegen. Jetzt ist es an der Zeit, uns das MQ-7-Datenblatt anzuschauen.

So, ich habe etwas Interessantes entdeckt: Es stellt sich heraus, dass der Sensor in der Tat eine kompliziertere Einstellung erfordert, als die von uns gewählte Einstellung. Um möglichst genaue Messergebnisse zu erhalten, müssen wir die integrierte Sensorheizung so einstellen, dass sie bei hohen und niedrigen Heizzyklen betrieben wird, wobei wir (nach 48 Stunden Heizzeit bei 5 V) für 60 Sekunden 5 V anwenden und diese Messwerte nicht verwenden. Dann wenden wir 90 Sekunden lang 1,4 V an und verwenden diese Messwerte für unsere CO-Messungen. In der Hochtemperaturphase verdampft CO (und alle anderen brennbaren Gasverbindungen) von der Sensorplatte. Diese wird im Grunde für die Messphase bei niedriger Temperatur gereinigt, wodurch genaue Messungen ermöglicht werden. Wir würden mit der Wiederholung dieser Zyklen fortfahren.

Unser CO click ist für diesen Zyklus nicht eingerichtet. Wir können zwar immer noch Kohlenmonoxid nachweisen, es sieht aber danach aus, als müsste ich unser Design über die auf dem Modul angebrachten Komponenten hinaus noch einmal überdenken, um wirklich genaue Messwerte zu erzielen.

Abschließende Worte

Obwohl sich die genaue Messung von Kohlenmonoxid mit dem MQ-7-Sensor aufwendiger erwies, als ich anfangs angenommen hatte, stellte sich das Ausprobieren durch den Clicker 2 für den PSoC 6 als doch recht einfach heraus. Es wäre genau so einfach, die Kohlenmonoxid-Clickplatine (CO 2 click) auszuprobieren, aber in dem Fall sollte ich mir vorher lieber das Datenblatt des Sensors durchlesen, bevor ich herumexperimentiere!

Als Grundgerüst für die PSoC 6-Entwicklungsplatine, gefällt mir der Clicker 2. Man kann sich voll und ganz auf die Sensoren oder auf andere Peripheriegeräte konzentrieren, die man in seinem Projekt verwendet. Und ich kann es auch kaum abwarten, schon bald an einigen anderen Click-Platinenmodulen dieser Platine zu tüfteln.

Mark completed his Electronic Engineering degree in 1991 and went on to work in real-time digital signal processing applications engineering, later moving into technical marketing.

21 Feb 2019, 13:53

Kommentare