/*
Einstellungen am TB6600 für 6400 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 off off
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 off off
*/
#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 = 6400;
byte richtung1 = HIGH;
byte schrittposition1 = 0;
// Der Microwert für pwzeit & whzeit nicht unter 200 !
unsigned long pwablauf1 = 0;// Pulswechselablaufzeit1
unsigned long whablauf1 = 0;// Wiederhohlablaufzeit1
unsigned long rampenstart1 = 500;
unsigned long rampenende1 = 50;
word rampenrichtung1 = 1;
unsigned long mini1 = rampenstart1;
unsigned long maxi1 = rampenende1;
byte enable1 = 6;
byte dir1 = 5;
byte pul1 = 4;
//--------------------------------------------------------------
//------Steuerung für den zweiten Schrittmotor------------------
word x2 = 0;
word schritte2 = 6400;
byte richtung2 = HIGH;
byte schrittposition2 = 0;
// Der Microwert für pwzeit & whzeit nicht unter 200 !!
unsigned long pwablauf2 = 0;// Pulswechselablaufzeit2
unsigned long whablauf2 = 0;// Wiederhohlablaufzeit2
unsigned long rampenstart2 = 500;
unsigned long rampenende2 = 50;
word rampenrichtung2 = 1;
unsigned long mini2 = rampenstart2;
unsigned long maxi2 = rampenende2;
byte enable2 = 10;
byte dir2 = 9;
byte pul2 = 8;
//--------------------------------------------------------------
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("Motor1 ");
lcd.print(schritte1);
lcd.print(" Schritte");
lcd.setCursor(0, 1);
lcd.print("Tempo1 ");
lcd.print(rampenstart1);
lcd.print("-");
lcd.print(rampenende1);
lcd.print(" Micro");
lcd.setCursor(0, 2);
lcd.print("Motor2 ");
lcd.print(schritte2);
lcd.print(" Schritte");
lcd.setCursor(0, 3);
lcd.print("Tempo2 ");
lcd.print(rampenstart2);
lcd.print("-");
lcd.print(rampenende2);
lcd.print(" Micro");
//----------Steuerpins für den ersten Treiber aktivieren-------
Serial.begin(BAUD);
pinMode(enable1, OUTPUT); // Enable1
pinMode(dir1, OUTPUT); // Step1
pinMode(pul1, OUTPUT); // Dir1
digitalWrite(6, LOW); // Set Enable1 low
//---------------------------------------------------------------
//----------Steuerpins für den zweiten Treiber aktivieren--------
pinMode(enable2, OUTPUT); // Enable2
pinMode(dir2, OUTPUT); // Step2
pinMode(pul2, OUTPUT); // Dir2
digitalWrite(enable2, LOW); // Set Enable2 low
//---------------------------------------------------------------
}
void loop()
{
//---------------------------------------------------------------------
//----------Treiber eins aktivieren------------------------------------
//---------------------------------------------------------------------
digitalWrite(enable1, HIGH); // Set Enable high
digitalWrite(dir1, richtung1); // Set Dir
if (x1 < schritte1) // Ziel noch nicht erreicht?
{
//----------------------Motor 1----------------------------------------
//---------------------Schritt 0---------------------------------------
if ((schrittposition1 == 0) && (micros() - whablauf1 >= mini1)) {
digitalWrite(pul1, HIGH); // Step auf high
schrittposition1 = 1; // Steuerung für Schritt 1 einstellen
pwablauf1 = micros(); // Timer für Schritt 1 starten
}
//----------------------Motor 1----------------------------------------
//---------------------Schritt 1---------------------------------------
if ((schrittposition1 == 1) && (micros() - pwablauf1 >= mini1)) {
digitalWrite(pul1, LOW); // Step auf low
schrittposition1 = 0; // 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
mini2 = rampenstart2; //Rampe für Motor 2 Neustart
}
//---------------------------------------------------------------------
//---------------------------------------------------------------------
//----------Treiber zwei aktivieren------------------------------------
//---------------------------------------------------------------------
digitalWrite(enable2, HIGH); // Set Enable high
digitalWrite(dir2, richtung2); // Set Dir
if (x2 < schritte2) // Ziel noch nicht erreicht?
{
//----------------------Motor 2--------------------------------------
//---------------------Schritt 0-------------------------------------
if ((schrittposition2 == 0) && (micros() - whablauf2 >= mini2)) {
digitalWrite(pul2, HIGH); // Step auf high
schrittposition2 = 1; // Steuerung für Schritt 1 einstellen
pwablauf2 = micros(); // Timer für Schritt 1 starten
}
//----------------------Motor 2--------------------------------------
//---------------------Schritt 1-------------------------------------
if ((schrittposition2 == 1) && (micros() - pwablauf2 >= mini2)) {
digitalWrite(pul2, LOW); // Step auf low
schrittposition2 = 0; // 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;
richtung2 = !richtung2; // Dir Richtung wechseln
delay(1000); // Eine Sekunde Pause
}
//--------------------------------------------------------------------
}