Ich habe ein sehr interessantes Verhalten von meinem Arduino Nano feststellen können.
Zur Erklärung.
Ich habe ein 12 V Signal entweder an D6 oder D5 anliegen. Wenn dem so ist, soll nach der Abfrage die Variable "DacState" hoch bzw. runter gezählt werden.
Wenn sich "DacState" ändert soll ein 12 V Motor mit einem LMD298 gefahren werden. Der Motor verfügt einen Potentiometer anhand dessen ich die korrekte Stellung herausfinden kann.
Der DacState (welcher seinen Namen durch etwas anderes bekommen hat) gibt mir die Informationen, nach einer Berechnung, ob der Motor nach links oder rechts gefahren werden soll.
Alle Dinge funktionieren getrennt von einander jedoch nicht wenn 12V an Pin 5 oder 6 anliegen.
Der DacState wird hoch bzw. runter gezählt und die Logik stellt auch fest, dass der Motor nach rechts oder nach links gefahren wird. Direkt unter der Ausgabe kommen die Befehle für den LMD298 Motor treiber aber dieser fährt nicht.
Erst wenn an Pin 5 oder 6 keine Spannung mehr anliegt, fährt der Motor an die gewünschte Position.
Hat jemand ne Ahnung warum?
Hier eine gestrippte Version meines Codes:
#include <Arduino.h>
#include <MyMCP4725.h>
#define DIRA 6
#define DIRB 5
int EcuMdMinusPIN = A1;
int EcuMdPlusPIN = A0;
int ExupPotPIN = A2;
float dacState = 0.0f;
int ECUMDPlus; //Signal-open
int ECUMDMinus; //Signal-close
float ExupPotVoltage = 0.0f;
float lowerTarget = 0.0f;
float higherTarget = 0.0f;
float DRVPower = 120; // DRV Power
float offsetExup = 10.0f;
void setup()
{
Serial.begin(9600);
pinMode(DIRA, OUTPUT);
pinMode(DIRB, OUTPUT);
digitalWrite(DIRA, LOW);
digitalWrite(DIRB, LOW);
}
void loop()
{
ECUMDPlus = analogRead(EcuMdPlusPIN);
ECUMDMinus = analogRead(EcuMdMinusPIN);
ExupPotVoltage = analogReadToVoltage(analogRead(ExupPotPIN));
float targetExupVoltage = cfg.maxDacVoltage - (dacState * cfg.dacStepsValue);
lowerTarget = targetExupVoltage - (targetExupVoltage / offsetExup);
higherTarget = targetExupVoltage + (targetExupVoltage / offsetExup);
//Wenn Ziel unterhalb des max. Wertes der geschlossenen Klappe liegt
if (lowerTarget < cfg.maxExupVoltageOpen)
{
higherTarget += lowerTarget;
}
//Wenn Ziel oberhalb des max. Wertes der offenen Klappe liegt
if (higherTarget > cfg.maxExupVoltageClose)
{
lowerTarget -= abs(cfg.maxExupVoltageClose - higherTarget);
}
if (lowerTarget < ExupPotVoltage && ExupPotVoltage < higherTarget)
{
#ifdef DEBUG
Serial.println("Klappe ist genau richtig");
#endif
digitalWrite(DIRA, LOW);
digitalWrite(DIRB, LOW);
}
else if (ExupPotVoltage > higherTarget)
{
#ifdef DEBUG
Serial.println("Fahre klappe auf");
#endif
digitalWrite(DIRA, LOW);
digitalWrite(DIRB, DRVPower);
}
else if (lowerTarget > ExupPotVoltage)
{
#ifdef DEBUG
Serial.println("Fahre klappe zu");
#endif
digitalWrite(DIRA, DRVPower);
digitalWrite(DIRB, LOW);
}
if (ECUMDMinus > 100)
{
if (dacState < cfg.dacSteps)
{
#ifdef DEBUG
Serial.println("DACSTEP ++");
#endif
dacState++;
}
}
if (ECUMDPlus > 100)
{
if (dacState > 0)
{
#ifdef DEBUG
Serial.println("DACSTEP --");
#endif
dacState--;
}
}
}
Die Logausgabe ist wie folgt, wenn 5V an einem Inputtpin anliegen:
DACSTEP++
Fahre klappe auf
DACSTEP++
Fahre klappe auf
DACSTEP++
Fahre klappe auf
DACSTEP++
Fahre klappe auf
DACSTEP++
Fahre klappe auf
DACSTEP++
Fahre klappe auf
DACSTEP++
Fahre klappe auf
DACSTEP++
Fahre klappe auf
DACSTEP++
Fahre klappe auf
Fahre klappe auf
Fahre klappe auf
Fahre klappe auf
Fahre klappe auf
Fahre klappe auf
Klappe ist genau richtig
Klappe ist genau richtig
Klappe ist genau richtig
Klappe ist genau richtig
Klappe ist genau richtig
Klappe ist genau richtig
Und wie gesagt er fährt erst an den Motor zu fahren, wenn der Inputpin keine Spannung mehr anliegen hat
Bei dem Code würde solange auf ECUMDMinus Spannung anliegt der Motor laufen. Sobald die Spannung weg ist, wird der Motor gestoppt.
Die Realität zeigt, dass der Motor nicht fährt, außer ich gebe ganz kurze Impulse auf die Leitung. Dann fährt der Motor immer nur ein Stück (Weil der else Block den Motor wieder stoppt.
Denk dir den Else Block mal komplett weg. Dann wäre das Verhalten so, dass solange ECUMDMinus > 100 ist er den Motor nicht fährt. Erst wenn er da raus ist, würde der Motor anfangen zu fahren
Hab den Code noch mehr ausgedünnt, hoffe dann wird klar was mein Problem ist und was passieren soll
In der Loop funktion habe ich folgenden Code
ECUMDMinus = analogRead(EcuMdMinusPIN);
if (ECUMDMinus > 100)
{
if (!tst)
{
tst = true;
Serial.println("Motor soll fahren");
digitalWrite(DIRA, LOW);
digitalWrite(DIRB, HIGH);
}
}
tst ist ein bool welcher einmalig auf true gesetzt wird. Damit sorge ich dafür, das alles nach "if (!tst) nur einmal ausgeführt wird.
Ich führe den Code aus und gebe dann 5V auf ECUMDMinus und ich springe in die Bedinung. Das Log gibt "Motor soll fahren" aus und digitalWrite wird an DIRA und DIRB gesetzt.
Das Problem ist nun, solange auf ECUMDMinus eine Spannung anliegt fährt der Motor nicht. Erst wenn ECUMDMINUS keine Spannung mehr hat, fährt der Motor immer weiter nach links.
Der Motor soll aber schon in dem Moment anfangen zu drehen wo auf ECUMDMinus eine Spannung anliegt.