Sinamics von Siemens


Google-Suche auf MEINE-SCHALTUNG.de :





Online Rechner

Chronik

Dauerkalender


Längenmessung mit PIC12F615
und Ultraschall


Längenmessung Anordnung


In dem Versuch kommt ein Ultraschall von Pepperl+Fuchs zum Einsatz und hilft uns, den aktuellen Abstand zu einem Objekt zu messen. Bei dem Näherungssensor handelt es sich um einen in der Industrie einsetzbaren Ultraschallsensor, der mit der Standardsteuerspannung von 24 VDC arbeitet und ein analoges Signal von 0 bis 10V liefert. Die Auswertung des Signals übernimmt der achtbeiniger Mikrocontroller PIC12F615. Der Chip kann dank entsprechender Konfiguration auch analoge Signale erfassen und sie in einen digitalen Wert umwandeln. Die ermittelte Länge wird mithilfe zwei 7-Segmentanzeigen als zweistellige Zahl sichtbar gemacht. Um die große Anzahl an Elementen der 7-Segmentanzeigen anzusteuern, werden zwischen den Mikrocontroller und den Anzeigen zwei Schieberegister geschaltet. Da der Mikrocontroller mit 5V arbeitet und folglich auch analoge Signale in diesem Spannungsbereich auswerten kann, wird das analoge Signal des Ultraschallsensors mit einem Spannungsteiler halbiert.
Die Aufgabe der Schaltung wird simpel definiert. Es soll eine Länge von bis zu 30 cm gemessen werden können. Die Messgenauigkeit soll +/- 1 cm betragen.

PIC12F615

PIC12F615

PIC12F615

Bei dem PIC12F615 handelt es sich um einen 8-Bit-Mikrocontroller, der unter anderem in einem PDIP-8-Gehäuse verfügbar ist. Von den acht Pins werden zwei (Pin 1, VDD, Pluspol und Pin 8, VSS, Minuspol) für die Spannungsversorgung, die im Bereich von 2,0 bis 5,5 V liegen muss, benötigt. Bei den restlichen sechs handelt es sich um allgemeine digitale Ports, die als GP0 bis GP5 gekennzeichnet sind. Der GP3 (Pin Nummer 4) kann ausschließlich als Eingang benutzt werden. Die restlichen Pins können beliebig als Eingänge oder Ausgänge konfiguriert werden.

PIC12F615 Pinbelegung

PIC12F615 Pinbelegung

Der Chip verfügt über einen Flashspeicher, der 100.000 Mal beschrieben werden kann. Die Größe des Programmspeichers beträgt 1024 Words, der Datenspeicher hat eine Größe von 64 Byte. Für Assembler-Programmierer stehen 35 Befehle zur Verfügung.
Zu den zahlreichen Funktionen des Mikrocontrollers zählen u.a.:
- interner Präzisionsoszillator
- via Software einstellbare Frequenz 4 MHz oder 8MHz
- Stromsparender Sleep-Modus
- Watchdog Timer
- Analoges Komparatormodul
- A/D Wandler mit 10-Bit-Auflösung
- Zwei 8-Bit-Timer, 1 x 16-Bit-Timer
- PWM Modul


Schieberegister 74HC595

Schieberegister 74HC595

Schieberegister 74HC595
Der Schieberegister 74HC595, da er acht Ausgänge zur Verfügung stellt, kann sehr gut zum Ansteuern einer 7-Segmentanzeige verwendet werden. In der Schaltung werden zwei Schieberegister, die in einer Kaskadenschaltung verschaltet sind (Reihenschaltung) eingesetzt.

Schieberegister 74HC595

7-Segmentanzeige

7-Segmentanzeige

Bei den Anzeigen handelt es sich um 7-Segmentanzeigen, die zusätzlich mit einer Punkt-Anzeige ausgestattet sind. Um sie komplett anzusteuern, werden demnach acht Ausgänge benötigt. In dem Beispiel wird die Punktanzeige nicht gebraucht.

7-Segmentanzeige

Spannungsregler

Spannungsregler

Die Schaltung arbeitet mit zwei Spannungen. Die Spannung von 24VDC dient der Einspeisung des Näherungssensors. Damit auch der Mikrocontroller, die beiden Schieberegister und die Anzeigen ihre Arbeit erledigen können, wird die hohe Eingangsspannung mit dem Spannungsregler auf 5VDC runtergeregelt. Das fertige Modul verfügt über eine Taste, mit der die Spannungsanzeige umgeschaltet werden kann. Wahlweise kann die Eingangs- bzw. Ausgangsspannung angezeigt werden.

Spannungsregler

Ultraschallsensor Pepperl+Fuchs UB2000-F54-U-V15

Ultraschallsensor

Der Ultraschallsensor UB2000-F54-U-V15 von Pepperl + Fuchs ist ein industrieller Näherungssensor, der auch in roher Umgebung eingesetzt werden kann. Der Sensor arbeitet im Spannungsbereich 15-30V und kann Entfernungen bis zu 2 m erfassen. Dank eines Synchronisationseingangs können mehrere Sensoren synchronisiert werden. Das zu erfassende Abstandsfenster wird mithilfe eines Lerneingangs festgelegt. Das analoge Ausgangssignal kann fallend oder steigend bei zunehmendem Objektabstand parametriert werden.

Technische Daten

Erfassungs-/ Einstellbereich (80 ... 2000) / (100 … 2000) mm
Blindzone 0 ... 80 mm
Ansprechverzug ≤ 150 ms
LED grün permanent grün: Betriebsanzeige
LED grün blinkend: Lernfunktion
LED gelb permanent gelb: Objekt im Auswertebereich
LED gelb blinkend: Lernfunktion, Objekt erkannt
LED rot aus: Normalbetrieb
LED rot permanent rot: Lernfunktion, Objekt unsicher
LED rot blinkend: Störung, kein Objekt erkannt
Betriebsspannung: 15 ... 30 V DC
Leerlaufstrom ≤ 55 mA
Synchronisation: 1 Synchroneingang
Programmierung: 1 Lerneingang
Ausgang: 1 Analogausgang 0 ... 10 V
Auflösung: 0,47 mm
Umgebungstemperatur: -25 ... 70 °C
Anschlussart: Gerätestecker M12 x 1 , 5-polig
Masse 100 g

Ultraschallsensor Anschlußbelegung

Parametrierung

Die Einstellung der Auswertegrenzen erfolgt mit dem Lerneingang. Der Eingang wird für mindestens 1 Sek. mit Versorgungsspannung -UB bzw. +UB verbunden. Mit -UB wird die untere Auswertegrenze und mit +UB die obere Auswertegrenze eingelernt. Das Einlernen erfolgt, indem man zuerst an der gewünschter Auswertegrenze das Objekt positioniert und anschließend den Einlerneeingang mit –UB oder +UB verbindet.


Der Schaltplan

Der Schaltplan

Der Schaltplan


Die Testschaltung

Testschaltung

Testschaltung

Das Programm

// ***************************************************************************
// Längenmessung mit PIC12F615 und Ultraschallsensor
// MPLAB X IDE v6.00
// XC8-Compiler 2.4
// ***************************************************************************
             
// PIC12F615 Configuration Bit Settings 
// CONFIG 
#pragma config FOSC = INTOSCIO  // Oscillator Selection bits (INTOSCIO oscillator: I/O  
                                // function on GP4/OSC2/CLKOUT pin, I/O function on  
                                // GP5/OSC1/CLKIN) 
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT enabled) 
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled) 
#pragma config MCLRE = OFF      // MCLR Pin Function Select bit (MCLR pin function is  
                                // digital input, MCLR internally tied to VDD) 
#pragma config CP = OFF         // Code Protection bit (Program memory code protection  
                                // is disabled) 
#pragma config IOSCFS = 4MHZ    // Internal Oscillator Frequency Select (4 MHz) 
#pragma config BOREN = OFF      // Brown-out Reset Selection bits (BOR disabled) 

#include <xc.h>                 // Einbindung der Bibliotheken 
#include <stdbool.h>

union {                         // Struckt-Konstrukt für späteren Bit-Zugriff 
  unsigned char Ziffer;
  struct {
    unsigned b0:1;
    unsigned b1:1;
    unsigned b2:1;
    unsigned b3:1;
    unsigned b4:1;
    unsigned b5:1;
    unsigned b6:1;
    unsigned b7:1;
  };
} byte_u;

#define SH_CP_Pin  GPIObits.GP1   // Schieberegister 74HC595 SH_CP 
#define ST_CP_Pin  GPIObits.GP2   // Schieberegister 74HC595 ST_CP 
#define DS_Pin  GPIObits.GP4      // Schieberegister 74HC595 DS 
#define _XTAL_FREQ 100000         // Taktfrequenz 

int Wert_Analog;                  // Aktueller Wert am Analogeingang 
unsigned int Laenge;
unsigned int Anzeige_Ziffer [2];  // Einzelne Ziffer für 7-Segmentanzeige 

void Ziffer_Anzeige () {          // Bits Übertragung zum Schieberegister 
    SH_CP_Pin = false;            // Startvorbereitung 
    DS_Pin = byte_u.b0;           // Bitwert 
    SH_CP_Pin = true;             // Übernehmen 
    
    SH_CP_Pin = false;
    DS_Pin = byte_u.b1;    
    SH_CP_Pin = true;
    
    SH_CP_Pin = false;
    DS_Pin = byte_u.b2;    
    SH_CP_Pin = true;
    
    SH_CP_Pin = false;
    DS_Pin = byte_u.b3;    
    SH_CP_Pin = true;

    SH_CP_Pin = false;
    DS_Pin = byte_u.b4;    
    SH_CP_Pin = true;
    
    SH_CP_Pin = false;
    DS_Pin = byte_u.b5;    
    SH_CP_Pin = true;

    SH_CP_Pin = false;
    DS_Pin = byte_u.b6;    
    SH_CP_Pin = true;
    
    SH_CP_Pin = false;
    DS_Pin = byte_u.b7;    
    SH_CP_Pin = true;   
}

void main(void) {

    GPIO  = 0b00000000;       // Alle GPIOs nullen 
    TRISIO = 0b00001001;      // 0-Ausgang  1-Eingang 
    ANSEL = 0b01010001;       // ADC Frequenz mit Fosc/16 = 0b101 
    ADCON0 = 0b10000001;      // GP0 als Analogeingang 

    while (true) {                                             // Endlosschleife 
        ADCON0bits.GO_DONE = 1;                                // GO_DONE Bit setzen 
        while (ADCON0bits.GO_DONE) {                           // Schleife Analogwert lesen 
            Wert_Analog = (ADRESH << 8) + ADRESL;   // Variable Wert_Analog beschreiben 
        }                
        Laenge = (Wert_Analog * 30) / 1000;                    // Längenberechnung  
        
        Anzeige_Ziffer [1] = Laenge / 10;                      // Ziffern für 7-Segmentanzeige 
        Anzeige_Ziffer [0] = Laenge - (Anzeige_Ziffer [1] * 10);

        ST_CP_Pin = false;                                     // Schieberegister ST_CP 
        for (int i=0; i<2; i++)    {                           // For-Schleife für beide Ziffern  
                                                               // der Anzeige 
            int a = Anzeige_Ziffer [i];
            switch (a) {
                case 0: byte_u.Ziffer = 0b11111100;            // Bitbelegung für Elemente der  
                                                               // 7-Segmentanzeige 
                        Ziffer_Anzeige ();                     // Unterprogramm aufrufen  
                                                               // (Schieberegister füllen)) 
                        break;
                case 1: byte_u.Ziffer = 0b01100000;            // usw. 
                        Ziffer_Anzeige ();
                        break;   
                case 2: byte_u.Ziffer = 0b11011010;
                        Ziffer_Anzeige ();
                        break;
                case 3: byte_u.Ziffer = 0b11110010;
                        Ziffer_Anzeige ();
                        break;
                case 4: byte_u.Ziffer = 0b01100110;
                        Ziffer_Anzeige ();
                        break;
                case 5: byte_u.Ziffer = 0b10110110;
                        Ziffer_Anzeige ();
                        break;
                case 6: byte_u.Ziffer = 0b10111110;
                        Ziffer_Anzeige ();
                        break;
                case 7: byte_u.Ziffer = 0b11100000;
                        Ziffer_Anzeige ();
                        break;
                case 8: byte_u.Ziffer = 0b11111110;
                        Ziffer_Anzeige ();
                        break;
                case 9: byte_u.Ziffer = 0b11110110;
                        Ziffer_Anzeige ();
                        break;                    
            }
        }
        ST_CP_Pin = true;                                // 7-Segmentanzeige aktualisieren   
        __delay_ms(5000);                                // Wartezeit 
    }
}        

Der Ultraschallsensor wird so eingestellt, dass das analoge Ausgangssignal mit zunehmender Entfernung steigt (Steigende Rampe). Bei der eingestellten minimalen Entfernung liefert der Ausgang 0V-Signal. Bei der maximalen Entfernung, in dem Beispiel auf 30 cm eingestellt, bekommen wir am Ausgang ein 10V-Signal. Da der Mikrocontroller mit 5V arbeitet, muss das analoge Signal vom Ultraschall angepasst werden. Diese Anpassung erfolgt mit einem Spannungsteiler, der aus zwei in Reihe geschalteten Widerständen (R17 und R18) besteht. Damit wird das Signal halbiert und ist auch bei vollem Ausschlag von 10V für den Mikrocontroller ungefährlich.
Das Signal landet am Eingang GP0 (Pin 7) des Mikrocontrollers und wird intern in eine Zahl zwischen 0 und 1023 (10 Bit Auflösung) umgewandelt. Das Programm errechnet daraus die Entfernung. Die Entfernung ist in diesem Beispiel direkt proportional zu dem Signal am analogen Eingang.
Die ermittelte Zahl wird anschließend in zwei getrennte Ziffern aufgeteilt, die dann bitweise in die Schieberegister geladen werden. Bei jedem Durchlauf werden 16 Bits in die Schieberegister, die in Kaskadenschaltung verschaltet sind, übertragen. Nach erfolgter Übertragung werden mit der Anweisung „ST_CP_Pin = true;“ die Ausgänge der beiden Schieberegister aktiviert und damit auch die 7-Segmentanzeigen.
Mit dem Spannungsregler wird die Versorgungsspannung von 24VDC auf 5VDC runtergeregelt. Die hohe Eingangsspannung versorgt den Ultraschallsensor. Mit der kleinen Spannung von 5V werden die restlichen Schaltungselemente eingespeist.

Kurzvideo zur Schaltung

Kurzvideo


Weitere Themen:


Google-Suche auf MEINE-SCHALTUNG.de :


Home Impressum Datenschutz