Hallo liebe Community,
Ich hab ein vielleicht sogar software übergreifendes Problem.
Ich verwende einen Arduino Mega2650 und möchte Signale der Seriellen Schnittstelle0(also per USB verbunden) auslesen und diese dann Verarbeiten und mit einem DAC als Spannung weitergeben. (Ich habe es mit 115200 und jetzt 57600 Baud probiert um zu sehen ob es daran liegt.
Dazu habe ich zuerst getestet, ob es denn überhaupt funktioniert und die Lampe blinken lassen - ergo ich sehe, dass ein Signal ankommt.
#include <Wire.h>
#include <Adafruit_MCP4725.h>
#include <unistd.h>
Adafruit_MCP4725 dac;
int Eingang = 0;
int Ausgang;
void setup(void)
{
Serial.begin(115200); //öffnet die serielle Schnittstelle mit einer datenrate von 115200 bit/s
dac.begin(0x60); //Zuweisung der richtigen Adresse
pinMode(6, OUTPUT); //setzt Pin 6 und 7 auf den Output modus, damit wir den Pin auf HIGH und LOW setzen können
pinMode(7, OUTPUT);
pinMode(13, OUTPUT);
}
void loop(void) {
if (Serial.available() >0) {
Eingang=Serial.read();
Ausgang=Eingang*2;
if (Eingang>0)
{
digitalWrite(13, HIGH);
Serial.write(Ausgang);
delay(200);
digitalWrite(13, LOW);
}
}
}
Funktioniert soweit und es blinkt in Abständen.
Sobald ich nun wirklich eine Spannung ausgeben möchte und mit dem Multimeter die Ausgegebene Spannung überprüfe, kommen da nur Hausnummern raus.
#include <Wire.h>
#include <Adafruit_MCP4725.h>
#include <unistd.h>
Adafruit_MCP4725 dac;
void SpannungAusgeben(int Spannung);
double Spannung=0; //Globale Variable die zur Speicherung der aktuellen Ausgabespannung verwendet wird
void setup(void)
{
Serial.begin(57600); //öffnet die serielle Schnittstelle mit einer datenrate von 57600 bit/s
dac.begin(0x60); //Zuweisung der richtigen Adresse
pinMode(6, OUTPUT); //setzt Pin 6 und 7 auf den Output modus, damit wir den Pin auf HIGH und LOW setzen können
pinMode(7, OUTPUT);
//dac.setVoltage(50*0.001*4095/1.25, false);
pinMode(13, OUTPUT);
SpannungAusgeben(Spannung);
}
void SpannungAusgeben(int Span) //Eine Void Funktion (Funktion ohne Rückgabewert), welche die Spannung ausgiebt.
{
if (Span > 0) //Wenn die Spannung positiv ist, wird der 7er pin LOW gesetzt und der 6er Pin auf HIGH, somit wird die Spannung direkt ausgegeben
{
digitalWrite(7,LOW);
digitalWrite(6,HIGH);
}
else //Wenn die Spannung nicht positiv ist, dann wird der 6er pin LOW gesetzt und der 7er Pin auf HIGH, somit wird die Spannung direkt ausgegeben
{
digitalWrite(6,LOW);
digitalWrite(7,HIGH);
Span=Span*(-1);
}
dac.setVoltage(Span*0.001*4095/1.25, false); //Die Ausgabespannung muss von 0-1000V auf 0-5V verringert werden. Dies passiert durch die Division durch 1000 und Multiplikation mit 4095. Normalerweise ist das maximum 4096 bei 12 bit, aber dann gibt das Gerät etwas zu viel Spannung aus, ka warum.
Serial.println(Spannung);
}
void loop(void) {
if (Serial.available() >0) {
Spannung=Serial.read();
SpannungAusgeben(Spannung);
}
else
{
Serial.println ("Ausfall");
}
}
Zu meinem Code der die Schnittstelle anspricht (in Freebasic - lange Geschichte warum) aber ebenfalls hier:
CLS
DIM as Integer k1,k2, k3, k4, k5
k2=2000
k1=100
k3=300
k4=0
k5=-100
Do While (k1<2000)
Print "Test"
Sleep 1000
rem USB Schnittstelle öffnen
OPEN COM "COM3:57600,N,8,1,CS0,DS0,LF" AS #3
Print #3, k1
Print k1
sleep k2
Print #3, k4
print k4
sleep k2
Print #3, k3
print k3
sleep k2
Print #3, k5
print k5
sleep k2
Print #3, k4
print k4
sleep k2
Close #3
loop
Close #3
END
Ich habe es eben mit 115200 und 57600 Baud probiert, mit leider demselben Ergebnis.
Muss ich vielleicht die Bit die ankommen irgendwie umwandeln? also dass da tatsächlich nur eine Codewurst ankommt und ich die decodieren muss? oder mit von mir gewählten Start/Stopbits versehen?
EDIT: Es blinken manchmal TX, RX ganz kurz auf? Heißt das, dass etwas mit der Übergabe der Daten nicht passt?