| Längenmessung mit PIC12F615
|
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.
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-SegmentanzeigeDie 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.
SpannungsreglerDer 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
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
Testschaltung
// 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
Google-Suche auf MEINE-SCHALTUNG.de : |