29.07.2013, 09:21
Hallo zusammen.
Kürzlich begann ich damit, mich in Labview einzuarbeiten. Für ein Projekt steht mir ein Arduino Mega zur Verfügung. Ich werde nun versuchen mein grundsätzliches Vorhaben präzise zu beschreiben um auf die später folgende Beschreibung meines Problems eingehen zu können.
Projektbeschreibung:
Ziel ist es zunächst auf einfachem Level eine Ansteuerung für elektrische Schaltglieder zu realisieren. Die Idee ist demnach die, dass über ein GUI ein Betriebsmodus für den "Testaufbau" ausgewählt wird, dies an den Arduino kommuniziert wird und er daraufhin die entsprechenden I/O´s setzt. Desweiteren soll für den Anfang über zwei analoge Eingänge permanent gemessen werden (kurzzeitige Unterbrechungen wegen Umschaltung der Betriebsmodi sind zulässig).
Die Kommunikation soll für den ersten Versuch über die USB Verbindung laufen. Anschließend geht die Weiterentwicklung in Richtung Ethernet, was aber aktuell nicht relevant ist.
Die bisherige Umsetzung:
Für den Arduino schrieb ich die Software zum setzen der digitalen Ports und zum einlesen der analogen Werte sowie die entsprechende Kommunikation. In der Arduino IDE habe ich das Programm getestet. Es erwartet über dei serielle Schnittstelle Zahlenwerte von 1-4 (Format String). Jeder dieser Zahlenwerte löst dann einen im Programm definierten Betriebszustand aus, sprich die digitalen Ausgänge werden gesetzt. Mit dem seriellen Monitor der IDE funktioniert dies absolut tadellos und 100% zuverlässig. Ich bekomme permanent meine anaologen Werte geliefert und kann sämtliche Betriebsmodi schalten.
Anmerkung: Der Code für den Arduino enthält Definitionen für digitale Eingänge. Diese können ignoriert werden. Ich hatte sie in der Vergangenheit für Tests verwendet.
Nun ging ich hin und wollte die bisher manuelle Eingabe durch ein Labview VI ergänzen bzw. ersetzen. Das VI dazu schien zunächst nicht weiter kompliziert, doch komme ich nun zu meinem Problem.
Problembeschreibung:
Die analogen Werte werden gelesen und umgerechnet. Bis hierhin ist alles OK. Die Vorgabe, also das Schreiben von Labview zum Arduino, scheint aber nicht sauber zu funktionieren. Der Arduino reagiert auf die Vorgaben sehr langsam (etliche Sekunden) und beginnt dann die programmierten Betriebsmodi zu toggeln. Ich habe dafür keine Erklärung und hoffe nun hier Unterstützung finden zu können.
Kürzlich begann ich damit, mich in Labview einzuarbeiten. Für ein Projekt steht mir ein Arduino Mega zur Verfügung. Ich werde nun versuchen mein grundsätzliches Vorhaben präzise zu beschreiben um auf die später folgende Beschreibung meines Problems eingehen zu können.
Projektbeschreibung:
Ziel ist es zunächst auf einfachem Level eine Ansteuerung für elektrische Schaltglieder zu realisieren. Die Idee ist demnach die, dass über ein GUI ein Betriebsmodus für den "Testaufbau" ausgewählt wird, dies an den Arduino kommuniziert wird und er daraufhin die entsprechenden I/O´s setzt. Desweiteren soll für den Anfang über zwei analoge Eingänge permanent gemessen werden (kurzzeitige Unterbrechungen wegen Umschaltung der Betriebsmodi sind zulässig).
Die Kommunikation soll für den ersten Versuch über die USB Verbindung laufen. Anschließend geht die Weiterentwicklung in Richtung Ethernet, was aber aktuell nicht relevant ist.
Die bisherige Umsetzung:
Für den Arduino schrieb ich die Software zum setzen der digitalen Ports und zum einlesen der analogen Werte sowie die entsprechende Kommunikation. In der Arduino IDE habe ich das Programm getestet. Es erwartet über dei serielle Schnittstelle Zahlenwerte von 1-4 (Format String). Jeder dieser Zahlenwerte löst dann einen im Programm definierten Betriebszustand aus, sprich die digitalen Ausgänge werden gesetzt. Mit dem seriellen Monitor der IDE funktioniert dies absolut tadellos und 100% zuverlässig. Ich bekomme permanent meine anaologen Werte geliefert und kann sämtliche Betriebsmodi schalten.
Anmerkung: Der Code für den Arduino enthält Definitionen für digitale Eingänge. Diese können ignoriert werden. Ich hatte sie in der Vergangenheit für Tests verwendet.
Nun ging ich hin und wollte die bisher manuelle Eingabe durch ein Labview VI ergänzen bzw. ersetzen. Das VI dazu schien zunächst nicht weiter kompliziert, doch komme ich nun zu meinem Problem.
Problembeschreibung:
Die analogen Werte werden gelesen und umgerechnet. Bis hierhin ist alles OK. Die Vorgabe, also das Schreiben von Labview zum Arduino, scheint aber nicht sauber zu funktionieren. Der Arduino reagiert auf die Vorgaben sehr langsam (etliche Sekunden) und beginnt dann die programmierten Betriebsmodi zu toggeln. Ich habe dafür keine Erklärung und hoffe nun hier Unterstützung finden zu können.
Code:
Arduino Code:
void setup()
{
Serial.begin(9600);
}
//Hier endet das Setup.
void loop()
{
int state_reg=5; //1=PFC aktiv, 2=DCDC Charge aktiv, 3=DCDC Discharge aktiv, 4=IDLE, 5=Initialisierung
int pfc_operating_mode=18;
int dcdc_ch_mode=19;
int dcdc_dch_mode=20;
int idle_mode=21;
int mode;
int shunt_1=1; //Anschluss des Shunt 1 - PFC Laden und Entladen
int shunt_2=2; //Anschluss des Shunt 2 - DCDC Laden und Entladen
//Ausgangsschaltglieder: Nummer des digitalen Ports für MEGA:
int pfc=49;
int dc_load=45;
int dc_source=47;
int lessy=43;
int counter=0;
int shunt1_value;
int shunt2_value;
pinMode(pfc_operating_mode, INPUT);
pinMode(dcdc_ch_mode, INPUT);
pinMode(dcdc_dch_mode, INPUT);
pinMode(idle_mode, INPUT);
//Konfiguration der Pins für direkte Ansteuerung der Komponenten
pinMode(pfc, OUTPUT);
pinMode(dc_load, OUTPUT);
pinMode(dc_source, OUTPUT);
pinMode(lessy, OUTPUT);
do
{
shunt1_value=analogRead(shunt_1)+1000; //Werte werden mit 1000 addiert um definiert immer 9Bytes an Daten zu senden
shunt2_value=analogRead(shunt_2)+1000;
Serial.print(shunt1_value,DEC);
Serial.print("/");
Serial.print(shunt2_value,DEC);
counter++;
delay(10);
mode=Serial.read();
// Serial.println(mode);
delay(10);
switch (mode)
{
case '1':
if (state_reg!=1) {
Serial.println("PFC Operating initiiert");
Serial.println("Schaltglieder werden gesetzt. Bitte warten!");
digitalWrite(dc_load,LOW);
digitalWrite(dc_source,LOW);
digitalWrite(pfc,HIGH);
delay(500);
digitalWrite(lessy,HIGH);
delay(500);
Serial.println("Schaltglieder erfolgreich gesetzt");
state_reg=1;
Serial.println(state_reg);
break;
}
case ('2'):
if (state_reg!=2) {
Serial.println("DCDC LADE-Modus initiiert");
Serial.println("Schaltglieder werden gesetzt. Bitte warten!");
digitalWrite(pfc,LOW);
digitalWrite(dc_source,LOW);
digitalWrite(lessy,HIGH);
delay(500);
digitalWrite(dc_load,HIGH);
delay(500);
Serial.println("Schaltglieder erfolgreich gesetzt");
Serial.println();
state_reg=2;
break;
}
case ('3'):
if (state_reg!=3){
Serial.println("DCDC ENTLADE-Modus initiiert");
Serial.println("Schaltglieder werden gesetzt. Bitte warten!");
digitalWrite(pfc,LOW);
digitalWrite(dc_load,LOW);
digitalWrite(dc_source,HIGH);
delay(500);
digitalWrite(lessy,HIGH);
delay(500);
Serial.println("Schaltglieder erfolgreich gesetzt");
Serial.println();
state_reg=3;
break;
}
case ('4'):
if (state_reg!=4){
Serial.println("IDLE Mode initiiert");
Serial.println("Schaltglieder werden gesetzt. Bitte warten!");
digitalWrite(pfc,LOW);
digitalWrite(lessy,LOW);
digitalWrite(dc_load,LOW);
digitalWrite(dc_source,LOW);
delay(500);
Serial.println("Schaltglieder erfolgreich gesetzt");
Serial.println();
state_reg=4;
break;
}
}
}
while(state_reg!=0);
}