Hallo,
ich habe einen Arduino Nano ESP32 welchen ich für ein Leistungsmessgerät verwende.
Ich möchte die gemessenen Werte auf einem Display anzeigen lassen, gleichzeitig über Serial ausgeben und auf einer SD Karte Speichern. (Auf das Display kann ggf. verzichtet werden)
Ich möchte eine Aktualisierungsrate der Messwerte am liebsten alle 20 ms, noch besser wären alle 10 ms erhalten.
Mit meinem Aktuellen Programm komme ich, wenn ich es wie oben überall anzeigen lasse auf eine minimale aktualisierungsrate von 180ms... Was ziemlich schlecht ist.
Dann habe ich es nirgendswo anzeigen lassen, sondern die Messwerte nur auf der SD Karte gespeichert und komme dann auch eine minimale Aktualisierungsrate von 20 - 22 ms.
Kurze Erklärung:
Ardunio erhält über SPI Messdaten vom Mess-IC ADE9153A.
Dann zeigt er sie über Serial an.
Dann zeigt er sie über ein Display über I2C an.
Dann schreibt er per SPI die Daten auf die SD Karte.
Wie kann ich mein Programm auf Geschwindigkeit optimieren.
Mir würde es genügen wenn ich die Daten über Serial ausgebe und auf der SD Karte speichern kann und das mit einer Rate von 10ms bis max 20ms.
Hier mein Programm:
(Nur der Wichtige teil:
Serial.println("Die Messung wird gestartet!");
Serial.println("Neue Datei wird Erstellt...");
messdatei();
digitalWrite(messungLED, HIGH);
file_counter++;
speicherzeit = millis();
/////////////////////////////////////////////Aktualisierungsrate//////////////////////////////////////////////////////
while(true){
// Erfasse die aktuelle Zeit seit dem Start des Mikrocontrollers in Millisekunden
unsigned long aktuellerReport = millis();
// Überprüfe, ob genügend Zeit seit dem letzten Bericht vergangen ist
if ((aktuellerReport - letzterReport) >= abtastrate_int) {
// Aktualisiere die Zeit des letzten Berichts auf die aktuelle Zeit
akt_speicherzeit = millis();
verg_speicherzeit = akt_speicherzeit - speicherzeit;
letzterReport = aktuellerReport;
// Lese die Messdaten vom IC
SPI.begin();
SPI.beginTransaction(SPISettings(SPI_SPEED,MSBFIRST,SPI_MODE0));
ade9153A.ReadPowerRegs(&powerVals);
ade9153A.ReadRMSRegs(&rmsVals);
ade9153A.ReadPQRegs(&pqVals);
SPI.endTransaction();
//Speicher die Daten auf der SD Karte.
speichern();
}
}
void speichern(){
SPI.begin();
if (SD.exists(dateiname)) {
File datenfile = SD.open(dateiname, FILE_APPEND);
if (datenfile) {
datenfile.println("");
datenfile.print("Zeit: ");
datenfile.println(verg_speicherzeit);
datenfile.print("Spannung: ");
datenfile.print((float)rmsVals.VoltageRMSValue/1000, 3);
datenfile.println(" V");
datenfile.print("Strom: ");
datenfile.print((float)rmsVals.CurrentRMSValue/1000, 3);
datenfile.println(" A");
datenfile.print("Frequenz: ");
datenfile.print(pqVals.FrequencyValue);
datenfile.println(" Hz");
datenfile.print("Wirkleistung: ");
datenfile.print((float)powerVals.ActivePowerValue/1000, 2);
datenfile.println(" W");
datenfile.print("Blindleistung: ");
datenfile.print((float)powerVals.FundReactivePowerValue/1000, 2);
datenfile.println(" var");
datenfile.print("Scheinleistung: ");
datenfile.print((float)powerVals.ApparentPowerValue/1000, 2);
datenfile.println(" VA");
datenfile.close();
}
} else {
Serial.println("Fehler beim Öffnen der Datei!");
delay(1000);
}
SPI.end();
}
Das Programm so zu betreiben, ermöglicht wie schon erwähnt eine minimale Aktuallisierung von 20 - 22 ms.
Wie kann ich mein Programm auf höhere Geschwindigkeiten trimmen.
Beste Grüße auf Bayern