Maschinensteuerung mit SEW Umrichter


Google-Suche auf MEINE-SCHALTUNG.de :





Online Rechner

Chronik

Dauerkalender


Multifunktionszähler mit Dip-Schaltern


Schaltung Impulszähler


Mit der folgenden Schaltung liefern wir einen universellen Impulszähler, der dank gezielter Parametrierung mit Dip-Schaltern auf unterschiedliche Weise verwendbar ist. Der Zähler kann so eine positive Flanke des Eingangssignals erkennen als auch eine negative. Die Richtungszählung kann auf positiv oder negativ eingestellt werden. Beim Erreichen des Sollwertes kann der Zähler den Ablauf anhalten oder einen Impuls ausgeben, Reset durchführen und erneut die Zählung starten. Die Impulslänge ist ebenfalls mit Dip-Schaltern konfigurierbar. Mit einer Reset-Taste kann der Ablauf unterbrochen und neu eingeleitet werden. Mit einer weiteren Taste kann der eingestellte Sollwert eingesehen werden. Bei negativer Zählung kann der Zähler als ein Countdown-Zähler verwendet werden. Folgende Funktionen stehen zur Verfügung:

  • Erkennung der positiven Flanke des Eingangssignals
    Dip 1.1 – OFF / Dip 1.9 – ON / Dip 1.10 – OFF
  • Erkennung der negativen Flanke des Eingangssignals
    Dip 1.1 – ON / DIP 1.9 – OFF / Dip 1.10 – ON
  • Positive Zählrichtung
    Dip 1.2 – OFF
  • Negative Zählrichtung
    Dip 1.2 – ON
  • Impulsausgabe beim Sollwert, Reset und automatischer Neustart
    Dip 1.3 – OFF
  • Stop beim Sollwert, Ausgang dauerhaft setzen
    Dip 1.3 – ON
  • Einstellung der Signallänge am Ausgang
    Dip 1.4 bis Dip 1.7
    Einstellung binär in 250 ms Schritten. Maximale Länge 15 * 250 ms = 3,7 Sek.
    Im Programm änderbar.
  • Sollwert-Einstellung
    Dip 2.1 bis 2.5
    Einstellung binär. Maximale Einstellung in dem Beispiel beträgt 31.


ATtiny 2313A

ATtiny 2313A

Der Mikrocontroller ATtiny 2313A ist ein 20-beiniger 8-Bit-Mikrocontroller, der folglich 18 I/Os zur Verfügung stellt. Der Baustein arbeitet zwischen 1,8-5,5 Volt. Die Größe des Programmspeichers (Flash) beträgt 2kB (RAM: 0,128 kB, EEPROM 128 Byte). Er verfügt jeweils über einen 8-Bit und 16-Bit Timer, vier PWM-Kanäle und einen analogen Komparator. Bauform ist PDIP-20. Betriebs-Temperaturbereich erstreckt sich von -40 bis 85 °C.

ATtiny2313A PinOut

Pin-Out

I/O – Adressierung im Programm:
Pin 02 – PCINT 11 – Programm Adresse = 00
Pin 03 – PCINT 12 – Programm Adresse = 01
Pin 04 – PCINT 09 – Programm Adresse = 02
Pin 05 – PCINT 08 – Programm Adresse = 03
Pin 06 – PCINT 13 – Programm Adresse = 04
Pin 07 – PCINT 14 – Programm Adresse = 05
Pin 08 – PCINT 15 – Programm Adresse = 06
Pin 09 – PCINT 16 – Programm Adresse = 07
Pin 11 – PCINT 17 – Programm Adresse = 08
Pin 12 – PCINT 00 – Programm Adresse = 09
Pin 13 – PCINT 01 – Programm Adresse = 10
Pin 14 – PCINT 02 – Programm Adresse = 11
Pin 15 – PCINT 03 – Programm Adresse = 12
Pin 16 – PCINT 04 – Programm Adresse = 13
Pin 17 – PCINT 05 – Programm Adresse = 14
Pin 18 – PCINT 06 – Programm Adresse = 15
Pin 19 – PCINT 07 – Programm Adresse = 16

Programm (Sketch)

// **************************************************************************************
// Multifunktionszähler mit DIP-Schaltern
// Eine Schaltung mit DIP-Schaltern und ATtiny2313A
// Arduino IDE 2.3.5
// **************************************************************************************

#include <TM1637Display.h>                  // Bibliothek 7-Segmentanzeige mit TM1637

#define CLK 15                               // Display Pins CLK/DIO
#define DIO 16

TM1637Display display(CLK, DIO);            // Display initialisieren

int DIP [12];                               
            // DIP[0]-DIP 1.1 (Pin02-00) – Signal: OFF=positive Flanke/ON=negative Flanke
            // DIP[1]-DIP 1.2 (Pin03-01) – Signal: OFF–Zählrichtung positiv / ON–negativ      
            // DIP[2]-DIP 1.3 (Pin04-02) – Ausgang: ON – Auto Stop / OFF – Auto Reset                                     
            // DIP[3]-DIP 1.4 (Pin05-03) - Signallänge Wertigkeit 1
            // DIP[4]-DIP 1.5 (Pin06-04) - Signallänge Wertigkeit 2
            // DIP[5]-DIP 1.6 (Pin07-05) - Signallänge Wertigkeit 4
            // DIP[6]-DIP 1.7 (Pin08-06) - Signallänge Wertigkeit 8
            // DIP 1.8                   - Reserve
            // DIP 1.9            - Signal: OFF=neg. Flanke/ON=pos. Flanke
            // DIP 1.10           - Signal: OFF=pos. Flanke/ON=neg. Flanke
            // DIP[7]-DIP 2.1 (Pin11-08) - Sollwert Wertigkeit 1
            // DIP[8]-DIP 2.2 (Pin12-09) - Sollwert Wertigkeit 2
            // DIP[9]-DIP 2.3 (Pin13-10) - Sollwert Wertigkeit 4
            // DIP[10]-DIP 2.4 (Pin14-11) - Sollwert Wertigkeit 8
            // DIP[11]-DIP 2.5 (Pin15-12) - Sollwert Wertigkeit 16
int Taste_Soll = 7;                              // Taste für Anzeige des Sollwertes
int Ausgang = 13;                                // Zähler Ausgang
int Signal = 14;                                 // Untersuchtes externes Signal

int Anzeige;                                     // Inhalt für 7-Segmentanzeige
int Startwert, Sollwert, Istwert;                // Aktuelle Zählwerte
bool Freigabe;                                    // Freigabe Signalempfang
bool Aktualisierung;                            // Istwert wird aktualisiert
bool Programm_anhalten;                          // Zählvorgang stoppen
int Soll [] = {1 ,2, 4, 8, 16};                  // Binärwerte
int Ausgang_Impulslaenge;                        // Eingestellte Signallänge in ms

// **************************************************************************************
void setup() {

    display.setBrightness(10);                             // Display Helligkeit
    display.clear();                                       // Display löschen

    for (int i=0; i<7; i++) {                              // I/O Konfiguration
        DIP [i] = i;
        pinMode(DIP[i], INPUT_PULLUP);
    }
    for (int i=7; i<12; i++) {
        DIP [i] = i+1;
        pinMode(DIP[i], INPUT_PULLUP);
    }    

    pinMode(Taste_Soll, INPUT_PULLUP);
    pinMode(Ausgang, OUTPUT);
    pinMode(Signal, INPUT);

    // Einstellungen auswerten ..........................................................
    for (int i=7; i<12; i++) {
        if (digitalRead(DIP[i]) == LOW) {
            Sollwert = Sollwert + Soll [i-7];              // Sollwert Vorgabe
        }
        if (i<10) {                                        // Ausgang Signallänge
            if (digitalRead(DIP[i-4]) == LOW) {
                Ausgang_Impulslaenge = Ausgang_Impulslaenge + Soll [i-7] * 250;
            }
        }
    }    

    // Startwert abhängig von Zählrichtung ..............................................
    if  (digitalRead(DIP[1]) == LOW)  {                    // Festlegung des Startwertes
         Startwert = Sollwert;
         Sollwert = 0;
        }
    Istwert = Startwert;                                   // Startwert für Istwert
}

// **************************************************************************************
void loop() {

    // Sollwert Anzeige .................................................................
    if (digitalRead(Taste_Soll) == LOW) {                  // zwischendurch Anzeige
        Display_Anzeige (Sollwert);
        delay (1000);
    }

    // Signal positve Flanke ..........................................................
    if (digitalRead(DIP[0]) == HIGH) {                     // Erkennung positive Flanke
        if (digitalRead(Signal) == HIGH && Freigabe) {
            Freigabe = false;                              // Signal erkannt
            Aktualisiereung = true;                        // Istwert aktualisieren
            delay(100);                                    // Prellen abwarten
        }
        if (digitalRead(Signal) == LOW) {
            Freigabe = true;
        }
    }

    // Signal negative Flanke ...........................................................
    if (digitalRead(DIP[0]) == LOW) {                      // Erkennung negative Flanke
        if (digitalRead(Signal) == LOW && Freigabe) {
            Freigabe = false;                              // Signal erkannt
            Aktualisiereung = true;
            delay(100);
        }
        if (digitalRead(Signal) == HIGH) {
            Freigabe = true;
        }
    }
    
    // Istwert aktualisieren ............................................................
    if (Aktualisiereung) {                                 // Istwert Aktualisierung
        if (digitalRead(DIP[1]) == HIGH) {                 // abhängig von Zählrichtung
            Istwert++;
        } else {
            Istwert--;
        }
        Aktualisiereung = false;                           // Aktualisierung abgeschlossen
    }

    Display_Anzeige (Istwert);                             // Display aktualisieren

    // Auswertung der Grenzwerte ........................................................
    if (Istwert == Sollwert) {    
        digitalWrite(Ausgang, HIGH);                       // Ausgang setzen
        if (digitalRead(DIP[2]) == LOW) {                  // Modus mit Auto Stop
            Programm_anhalten = true;  
        }
        if (digitalRead(DIP[2]) == HIGH) {                 // Modus mit Auto Reset
            delay (Ausgang_Impulslaenge);
            Istwert = Startwert;  
            digitalWrite(Ausgang, LOW);                    // Ausgang abschalten
        }            
    }
        
    while (Programm_anhalten) { }
}

// **************************************************************************************
void Display_Anzeige (int Anzeige) {
    display.showNumberDecEx((int)Anzeige, 0b00000000, false, 4, 4); 
}

// ************************************************************************************** 


Schaltplan

Schaltplan


Testschaltung

Testschaltung



Kurzvideo

Kurzvideo


Weitere Themen:


Google-Suche auf MEINE-SCHALTUNG.de :


Home Impressum Datenschutz