Hallo,
Ich will einen Motor über einen Kraftsensor (Wägezelle) ansteuern, um diesen zu positionieren.
Der Motor hat also 2 Laufrichtungen. Am Motor sind Hall-Sensoren verbaut, von denen einer für die Positionsbestimmung ausgelesen wird.
Je nach Krafteintrag und Position soll der Motor seine Laufrichtung ändern und eine neue Position anfahren. Wenn ich den externen Interrupt nach einer Addition stoppe und bei Positionsumkehr neu starte um zu Subtrahieren entsteht zu viel Slippage. Die Idee ist, je nach Drehrichtung den Wert zu errechnen und dann abzuziehen. Der letzte Teil des Sketch ist das Problem.
//Waage
#include "HX711.h"
HX711 scale;
uint8_t dataPin = 6;
uint8_t clockPin = 7;
//Motor
const int SensorPin = 2; //Interrupt Pin (nur 2 oder 3 @ Arduino Uno)
const byte Brake = 8;//Pinausgang Bremse, HIGH = Vollbremsung
const byte PWM = 9;// Pinausgang für Drehzahl
const byte power = 50;// Motor-Drehzahl-Normalbetrieb
const byte Drehrichtung = 10;// Pin Drehrichtungswechsel LOW/HIGH Drehrichtung
unsigned long wzMillis;
unsigned int Counter;
bool setupStep = LOW;
bool Normalbetrieb = LOW;
String Programmposition;//dient nur der Kontrolle
void motor(bool Stop, bool Richtung, int pwmSignal) {
digitalWrite (Brake, Stop);
digitalWrite (Drehrichtung, Richtung);
analogWrite (PWM, pwmSignal);
}
void M_Stop() {
motor(HIGH, LOW, 0);
}
void M_Hoch() {
motor(LOW, HIGH, power);
}
void M_Runter() {
motor(LOW, LOW, power);
}
void count() {
Counter++;
}
void setup() {
Serial.begin(9600);
//Waage
scale.begin(dataPin, clockPin);
scale.set_scale(127.15);
// scale.tare();//muss unterdrückt bleiben um die Interruptfuktion zu gewährleisten
pinMode(dataPin, INPUT);
pinMode(clockPin , OUTPUT);
//Motor
pinMode(SensorPin, INPUT); //definiertes Potenzial (HIGH/LOW) von einem Hall-Sensor
pinMode(Brake , OUTPUT);
pinMode(PWM , OUTPUT);
pinMode(Drehrichtung , OUTPUT);//Drehrichung
}
void loop() {
motorSetup();
motorMatik();
// Serial.print("\t Programmposition: ");
// Serial.print(Programmposition);
Serial.print("\t Counts: ");
Serial.println(Counter);
}
void motorSetup() {
if (!setupStep) { //Variable um den Setupvorgang vom Normalbetrieb zu trennen
Counter = 0;
attachInterrupt(digitalPinToInterrupt(SensorPin), count, CHANGE);
delay(500);//kann delay sein, weil motorSetup nur einmal und ohne Wägezelle durchlaufen wird
detachInterrupt(digitalPinToInterrupt(SensorPin));//Stop zur Ermittlung der Drehzahl über 500ms
motor(LOW, LOW, 30); //Kriechgang (30) zum Anfahren der Endposition (Anschlag)
}
static unsigned long SetupMillis = 0;
if ((Counter < 10) && ((millis() - SetupMillis >= 1000))) {// 1s um den Anlaufprozess zu überbrücken
M_Stop (); // Drehzahl sinkt am Anschlag unter (10) , der Motor stopt
setupStep = HIGH;
Counter = 1000;// Counter wir auf 100 gesetzt um ein "Überfahren" in den negativen Bereich zu verhindern
}
// Der Zähler wird auf Positionsmods umgestellt, absolute Werte werden gespeichert
if (setupStep && !Normalbetrieb) {
attachInterrupt(digitalPinToInterrupt(SensorPin), count, CHANGE);
motor (LOW, HIGH, 120); //Richtungswechsel nach Anschlag
if (Counter >= 1010) {//Fahrt auf Ausgangsposition (z.B X + 10)
M_Stop ();//Setup-Phase ist beendet, Motor steht in Ausgangsposition
Normalbetrieb = HIGH;//Umschalten auf Normalbetrieb
detachInterrupt(digitalPinToInterrupt(SensorPin));
}
}
}
void motorMatik () {
if (Normalbetrieb) {
long wz = scale.get_units();
long druck[] = {2000, 3000, 4000, 6000};
long positionM[] = {1040, 1100, 1150, 1200, 1250};
long druckPosition = map (wz, 260, 4000, 1000, 1250);
attachInterrupt(digitalPinToInterrupt(SensorPin), count, CHANGE);
if (druckPosition >= Counter && Counter < positionM[4]) {
M_Runter();//Druck läßt nach, wenn der Motor runter schaltet, Counterposition wird größer
}
else if ( druckPosition <= Counter && Counter > positionM[0] ) {
M_Hoch();//Druck steigt, wenn der Motor hoch schaltet, Counterposition wird kleiner
}
else {
M_Stop();
}
Serial.print("\t wz: ");
Serial.print(wz);
Serial.print("\t druckPosition: ");
Serial.print(druckPosition);
Serial.print("\t countFlag_1: ");
Serial.print(countFlag_1);
Serial.print("\t countFlag_2: ");
Serial.print(countFlag_2);
}
}