/*
Einstellungen am TB6600 für 200 Schritte pro Umdrehung
und für den Nema 17 Motor mit 1,0 bis 1,2 Amp.
Dippschalter 6 5 4 3 2 1
Stellungen 0n off on off on on
und für den Nema 17 Motor mit 1,5 bis 1,7 Amp.
Dippschalter 6 5 4 3 2 1
Stellungen off on on off on on
*/
#include <Wire.h> // Kommunikation mit Arduino IDE
#include <LiquidCrystal_I2C.h> // LCD Display
// LCD Display´s haben Adresse 0x27 oder 0x3F !!
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
#define BAUD (115200)
//------Steuerung für den ersten Schrittmotor------------------
word x1 = 0;
word schritte1 = 3200;
byte richtung1 = HIGH;
byte schrittposition1 = 1;
// Der Microwert für pwzeit & whzeit nicht unter 200 !
unsigned long pwablauf1 = 0;// Pulswechselablaufzeit1
unsigned long whablauf1 = 0;// Wiederhohlablaufzeit1
unsigned long rampenstart1 = 500;// Microsekundenx2 pro Impuls bei Anfahrt
unsigned long rampenende1 = 200;// Microsekundenx2 pro Impuls bei Voller Fahrt
unsigned long stopbeginn1 = 0;
unsigned long stopzeit1 = 5000;// Pausezeit von Stopp bis Anfahrt
word rampenrichtung1 = 1;
unsigned long mini1 = rampenstart1;
unsigned long maxi1 = rampenende1;
byte enabl1 = 6;
byte dir1 = 5;
byte puls1 = 4;
//--------------------------------------------------------------
//------Steuerung für den zweiten Schrittmotor------------------
word x2 = 0;
word schritte2 = 3200;
byte richtung2 = HIGH;
byte schrittposition2 = 1;
// Der Microwert für pwzeit & whzeit nicht unter 200 !!
unsigned long pwablauf2 = 0;// Pulswechselablaufzeit2
unsigned long whablauf2 = 0;// Wiederhohlablaufzeit2
unsigned long rampenstart2 = 500; // Microsekundenx2 pro Impuls bei Anfahrt
unsigned long rampenende2 = 200; // Microsekundenx2 pro Impuls bei Voller Fahrt
unsigned long stopbeginn2 = 0;
unsigned long stopzeit2 = 5000;
word rampenrichtung2 = 1;
unsigned long mini2 = rampenstart2;
unsigned long maxi2 = rampenende2;
byte enabl2 = 10;
byte dir2 = 9;
byte puls2 = 8;
//--------------------------------------------------------------
//------Steuerung für den dritten Schrittmotor------------------
word x3 = 0;
word schritte3 = 3200;
byte richtung3 = HIGH;
byte schrittposition3 = 1;
// Der Microwert für pwzeit & whzeit nicht unter 200 !!
unsigned long pwablauf3 = 0;// Pulswechselablaufzeit3
unsigned long whablauf3 = 0;// Wiederhohlablaufzeit3
unsigned long rampenstart3 = 500; // Microsekundenx2 pro Impuls bei Anfahrt
unsigned long rampenende3 = 200; // Microsekundenx2 pro Impuls bei Voller Fahrt
unsigned long stopbeginn3 = 0;
unsigned long stopzeit3 = 5000;
word rampenrichtung3 = 1;
unsigned long mini3 = rampenstart3;
unsigned long maxi3 = rampenende3;
byte enabl3 = 45;
byte dir3 = 44;
byte puls3 = 43;
unsigned long laufzeit = 0;
unsigned long laufzeitEnde = 0;
//--------------------------------------------------------------
void setup()
{
Wire.begin();
lcd.begin(20, 4); // initialize the lcd for 20 chars 4 lines, turn on backlight
lcd.backlight(); // LCD Beleuchtung ein
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Mot.1 ");
lcd.print(schritte1);
lcd.print(" Schritte");
lcd.setCursor(0, 1);
lcd.print("Temp1 ");
lcd.print(rampenstart1);
lcd.print("-");
lcd.print(rampenende1);
lcd.print(" Micro");
lcd.setCursor(0, 2);
lcd.print("Mot.2 ");
lcd.print(schritte2);
lcd.print(" Schritte");
lcd.setCursor(0, 3);
lcd.print("Temp2 ");
lcd.print(rampenstart2);
lcd.print("-");
lcd.print(rampenende2);
lcd.print(" Micro");
Serial.begin(115200);
//----------Steuerpins für den ersten Treiber aktivieren-------
pinMode(enabl1, OUTPUT); // Enable1
pinMode(dir1, OUTPUT); // Step1
pinMode(puls1, OUTPUT); // Dir1
digitalWrite(enabl1, HIGH); // Set Enable1 High
//---------------------------------------------------------------
//----------Steuerpins für den zweiten Treiber aktivieren--------
pinMode(enabl2, OUTPUT); // Enable2
pinMode(dir2, OUTPUT); // Step2
pinMode(puls2, OUTPUT); // Dir2
digitalWrite(enabl2, HIGH); // Set Enable2 High
//---------------------------------------------------------------
//----------Steuerpins für den dritten Treiber aktivieren--------
pinMode(enabl3, OUTPUT); // Enable3
pinMode(dir3, OUTPUT); // Step3
pinMode(puls3, OUTPUT); // Dir3
digitalWrite(enabl3, HIGH); // Set Enable3 High
//---------------------------------------------------------------
}
void loop()
{
laufzeit = micros();
//---------------------------------------------------------------------
//----------Treiber 1 aktivieren---------------------------------------
//---------------------------------------------------------------------
if (millis() - stopbeginn1 >= stopzeit1) {
digitalWrite(enabl1, LOW); // Treiber Motor1 ein
digitalWrite(dir1, richtung1); // Set Dir
if (x1 < schritte1) // Ziel noch nicht erreicht?
{
//----------------------Motor 1----------------------------------------
//---------------------Schritt 1---------------------------------------
if ((schrittposition1 == 1) && (micros() - whablauf1 >= mini1)) {
digitalWrite(puls1, HIGH); // Step auf high
schrittposition1 = 2; // Steuerung für Schritt 1 einstellen
pwablauf1 = micros(); // Timer für Schritt 1 starten
}
//----------------------Motor 1----------------------------------------
//---------------------Schritt 2---------------------------------------
if ((schrittposition1 == 2) && (micros() - pwablauf1 >= mini1)) {
digitalWrite(puls1, LOW); // Step auf low
schrittposition1 = 1; // Steuerung für Schritt 0 einstellen
whablauf1 = micros(); // Timer für Schritt 0 starten
x1++;
//-----------------------------------------------------------------
//-----------------Rampensteuerung Motor1--------------------------
if (x1 <= rampenstart1) {
rampenrichtung1 = HIGH;
} else {
rampenrichtung1 = LOW;
}
if (rampenrichtung1 == HIGH) {
if (mini1 > maxi1) {
mini1 = mini1 - 1; // Rampe für Motor 1 Gas geben
}
}
if (rampenrichtung1 == LOW) {
if (x1 + rampenstart1 > schritte1) {
mini1 = mini1 + 2; // Rampe für Motor 1 bremsen
}
}
//-----------------------------------------------------------------
}
}
//-------------------------Motor 1-------------------------------------
//----------------------Ziel erreicht ?--------------------------------
if (x1 == schritte1) {
x1 = 0;
richtung1 = !richtung1; // Dir Richtung wechseln
mini1 = rampenstart1; //Rampe für Motor 1 Neustart
digitalWrite(enabl1, HIGH);//Motor1 aus
stopbeginn1 = millis();
}
}
//---------------------------------------------------------------------
//---------------------------------------------------------------------
//----------Treiber 2 aktivieren---------------------------------------
//---------------------------------------------------------------------
if (millis() - stopbeginn2 >= stopzeit2) {
digitalWrite(enabl2, LOW); // Treiber Motor2 ein
digitalWrite(dir2, richtung2); // Set Dir
if (x2 < schritte2) // Ziel noch nicht erreicht?
{
//----------------------Motor 2--------------------------------------
//---------------------Schritt 1-------------------------------------
if ((schrittposition2 == 1) && (micros() - whablauf2 >= mini2)) {
digitalWrite(puls2, HIGH); // Step auf HIGH
schrittposition2 = 2; // Steuerung für Schritt 1 einstellen
pwablauf2 = micros(); // Timer für Schritt 1 starten
}
//----------------------Motor 2--------------------------------------
//---------------------Schritt 2-------------------------------------
if ((schrittposition2 == 2) && (micros() - pwablauf2 >= mini2)) {
digitalWrite(puls2, LOW); // Step auf low
schrittposition2 = 1; // Steuerung für Schritt 0 einstellen
whablauf2 = micros(); // Timer für Schritt 0 starten
x2++;
//-----------------------------------------------------------------
//-----------------Rampensteuerung Motor2--------------------------
if (x2 <= rampenstart2) {
rampenrichtung2 = HIGH;
} else {
rampenrichtung2 = LOW;
}
if (rampenrichtung2 == HIGH) {
if (mini2 > maxi2) {
mini2 = mini2 - 1; // Rampe für Motor 1 Gas geben
}
}
if (rampenrichtung2 == LOW) {
if (x2 + rampenstart2 > schritte2) {
mini2 = mini2 + 2; // Rampe für Motor 1 bremsen
}
}
//----------------------------------------------------------------
}
}
//-------------------------Motor 2------------------------------------
//----------------------Ziel erreicht ?-------------------------------
if (x2 == schritte2) {
x2 = 0;
mini2 = rampenstart2; //Rampe für Motor 2 Neustart
richtung2 = !richtung2; // Dir Richtung wechseln
digitalWrite(enabl2, HIGH);//Motor2 aus
stopbeginn2 = millis();
}
}
//--------------------------------------------------------------------
//---------------------------------------------------------------------
//----------Treiber 3 aktivieren---------------------------------------
//---------------------------------------------------------------------
if (millis() - stopbeginn3 >= stopzeit3) {
digitalWrite(enabl3, LOW); // Treiber Motor3 ein
digitalWrite(dir3, richtung3); // Set Dir
if (x3 < schritte3) // Ziel noch nicht erreicht?
{
//----------------------Motor 3--------------------------------------
//---------------------Schritt 1-------------------------------------
if ((schrittposition3 == 1) && (micros() - whablauf3 >= mini3)) {
digitalWrite(puls3, HIGH); // Step auf high
schrittposition3 = 2; // Steuerung für Schritt 1 einstellen
pwablauf3 = micros(); // Timer für Schritt 1 starten
}
//----------------------Motor 3--------------------------------------
//---------------------Schritt 2-------------------------------------
if ((schrittposition3 == 2) && (micros() - pwablauf3 >= mini3)) {
digitalWrite(puls3, LOW); // Step auf low
schrittposition3 = 1; // Steuerung für Schritt 0 einstellen
whablauf3 = micros(); // Timer für Schritt 0 starten
x3++;
//-----------------------------------------------------------------
//-----------------Rampensteuerung Motor3--------------------------
if (x3 <= rampenstart3) {
rampenrichtung3 = HIGH;
} else {
rampenrichtung3 = LOW;
}
if (rampenrichtung3 == HIGH) {
if (mini3 > maxi3) {
mini3 = mini3 - 1; // Rampe für Motor 1 Gas geben
}
}
if (rampenrichtung3 == LOW) {
if (x3 + rampenstart3 > schritte3) {
mini3 = mini3 + 2; // Rampe für Motor 1 bremsen
}
}
//----------------------------------------------------------------
}
}
//-------------------------Motor 3------------------------------------
//----------------------Ziel erreicht ?-------------------------------
if (x3 == schritte3)
{
laufzeitEnde = micros();
Serial.println("test");
Serial.println(laufzeitEnde - laufzeit); // 40
Serial.println(mini3); // 1200
Serial.println(maxi3); // 200
Serial.println(x3); // 3200
x3 = 0;
mini3 = rampenstart3; //Rampe für Motor 3 Neustart
richtung3 = !richtung3; // Dir Richtung wechseln
digitalWrite(enabl3, HIGH);//Motor3 aus
stopbeginn3 = millis();
}
}
//--------------------------------------------------------------------
}