INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
AnalogRead aus Loop-Schleife auskoppeln
15.07.2015, 14:02
Beitrag #1
AnalogRead aus Loop-Schleife auskoppeln
Hi Leute,

ich weiß einfach nicht mehr weiter-und zwar betriebe ich über ein Labornetzteil eine Heizfolie welche ich über ein Arduino Mega2560 über PWM fernsteuere(Remote Control).Über die beiden PWM-Pins kann ich nun Strom und Spannung von 0-30V und 0-30A regeln.Das funktioniert auch ganz gut soweit. Nun habe ich einen ACS 712 Stromsensor und einen Spannungsteiler, mit dem ich direkt an der Heizfolie die Werte wieder auslesen lassen möchte. Dies mach ich über die AnalogRead-Funktion, jedoch möchte ich, dass jede Sekunde Strom und Spannung gemessen, aber die PWM-Werte nur aller 10 Sekunden, mal aller 5 Sekunden usw... geändert werden d.h. ich müsste die analogRead-Funktion irgendwie aus den void loop() auskoppeln.Ich hab schon gelesen das das mit millis gehen könnte, aber wie genau muss das dann aussehen bzw. kann ich das überhaupt mit einem Mega machen oder komm ich da mit einem Due weiter?Ich habe von tiefgründiger Programmierung leider nicht so viel AhnungHuh

Danke schonmal für eure Hilfe

Gruß,
dna
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.07.2015, 14:47
Beitrag #2
RE: AnalogRead aus Loop-Schleife auskoppeln
Hallo dna,

(15.07.2015 14:02)dna5544 schrieb:  ...d.h. ich müsste die analogRead-Funktion irgendwie aus den void loop() auskoppeln.Ich hab schon gelesen das das mit millis gehen könnte...

Deine Lösung liegt tatsächlich in der Funktion millis(). In der Referenz zum Arduino gibt es auch ein Beispiel, mit dem eine LED in einem bestimmten Intervall Ein/Aus geschaltet wird. Da muss man halt nur ein wenig rechnen lassen Wink

Gruß
Torsten
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.07.2015, 16:40
Beitrag #3
RE: AnalogRead aus Loop-Schleife auskoppeln
Timer gesteuerte Interrupts können die Messungen machen, obwohl es ein klasischer Fall für eine PT oder PID Regler wäre.
Den Sketch zu sehen wäre wirklich hilfreich...

Grüße
Bnjmn
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.07.2015, 06:54
Beitrag #4
RE: AnalogRead aus Loop-Schleife auskoppeln
Schaue dir doch bitte das klassische Beispiel "Blink without delay" an. Dort findent du alles was du für diese Aufgabe brauchst.

Code:
Loop()

  if (Zeit 1 abglaufen)
Messen
Zeit 1 zurücksetzen

if (Zeit 2 abglaufen)
PWM refresh
Zeit 2 zurücksetzen

end

Wie du siehst brauchst du hier nichts "auszulagern"

@ bnjmn Was das mit einem PID-Regler zu tuen haben soll erklärt sich mir nicht.

Keep on... Ralf aka RMR
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.07.2015, 09:33
Beitrag #5
RE: AnalogRead aus Loop-Schleife auskoppeln
Irgendwie scheint es noch nicht zu funktionierenUndecided

Hier mal mein Code:

Code:
unsigned long previousMillis=0;
unsigned long interval=1000;

int Vpin = 12;
int Ipin = 5;
int Spannungspin = A1;
int Strompin = A4;
int Data = 0;
float Vmess = 0;
float current = 0;
float I = 0;


void setup(){
  
  Serial.begin(9600);
  pinMode(Vpin,OUTPUT);
  pinMode(Ipin,OUTPUT);
  pinMode(Strompin,INPUT);
  pinMode(Spannungspin,INPUT);


}


void loop(){


  unsigned long currentMillis = millis();

  
  if (currentMillis - previousMillis>interval){
  previousMillis =currentMillis;

  //Spannung messen
  Data = analogRead(Spannungspin);
  Vmess=(Data * 28.7) / 1024;
  Serial.print(Vmess);
  Serial.print(" V");
  Serial.print("    ");
  //Strom messen
  current=analogRead(Strompin);
  I=(0.026 * current) - 13.1;
  Serial.print(I);
  Serial.print(" A");
  Serial.print("    ");
  //Leistung berechnen
  Serial.print(I * Vmess);
  Serial.print(" W");
  Serial.println();

  }
  if (currentMillis - previousMillis>6000){
  previousMillis =currentMillis;

  analogWrite(Ipin,100);
  analogWrite(Vpin,20);
  }
  if (currentMillis - previousMillis>20000){
  previousMillis =currentMillis;
  analogWrite(Ipin,120);
  analogWrite(Vpin,60);
}
  
}

Er gibt mir zwar jetzt aller 1 Sekunde die Messwerte am Seriellen Monitor aus, aber ich komme noch nicht bis zu analogWrite, wo es die pwm-Werte übernimmt.Für mich wäre in dem Code logisch, dass wenn die aktuelle Zeit minus den vorhergehenden Zeitschritt >6000ms ist, dass es dann die ersten pwm-Werte übernimmt und wenn 20000ms vergangen sind die nächsten Werte usw... aber trotzdem aller 1 Sekunde die Messwerte am Seriellen Monitor anzeigtUndecided
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.07.2015, 09:56
Beitrag #6
RE: AnalogRead aus Loop-Schleife auskoppeln
PreviousMillisMESSEN
PreviousMillisPWM

Versuche das mal. Du setzt deine Zeit für den 2. State zurück.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.07.2015, 10:19
Beitrag #7
RE: AnalogRead aus Loop-Schleife auskoppeln
(16.07.2015 09:33)dna5544 schrieb:  Irgendwie scheint es noch nicht zu funktionierenUndecided
Das, was Du wahrscheinlich willst, geht wahrscheinlich so:
(Ich denke, dass das im Prinzip auch das ist, was RMR gemeint hat.)
Code:
unsigned long previousMillisMessen=0;
unsigned long previousMillisPWM=0;
int statePWM = 0;
unsigned long interval=1000;

int Vpin = 12;
int Ipin = 5;
int Spannungspin = A1;
int Strompin = A4;
int Data = 0;
float Vmess = 0;
float current = 0;
float I = 0;


void setup(){
  
  Serial.begin(9600);
  pinMode(Vpin,OUTPUT);
  pinMode(Ipin,OUTPUT);
  pinMode(Strompin,INPUT);
  pinMode(Spannungspin,INPUT);


}


void loop(){


  unsigned long currentMillis = millis();

  
  if (currentMillis - previousMillisMessen>interval){
  previousMillisMessen = currentMillis;

[...]

  //Spannung messen
    Serial.print(" W");
  Serial.println();

  }

// das Folgende geht eleganter, aber so ist's einfacher
// zu verstehen

switch(statePWM) {
   when 0:
       if (currentMillis - previousMillisPWM>6000){
          previousMillisPWM =currentMillis;
          analogWrite(Ipin,100);
          analogWrite(Vpin,20);
          statePWM++;
       };
       break;
   when 1:
        if (currentMillis - previousMillisPWM>20000){
           previousMillisPWM =currentMillis;
           analogWrite(Ipin,120);
           analogWrite(Vpin,60);
           statePWM++;
       };
       break;
   default:
       statePWM = 0;   // das koennte man auch oben machen
}

}
Das müsste jetzt nach 6 Sekunden den ersten Satz schalten, dann nach weiteren 20 Sekunden den zweiten Satz, dann wieder nach 6 Sekunden den ersten usw.
Wenn Du mehr als nur ein paar dieser "PWM-Sätze" hast, dann sollte man das mit Arrays machen, die jeweils die Zeiten und die PWM-Werte enthalten. Dann wird das Coding nochmal eleganter und kürzer.

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.07.2015, 12:31
Beitrag #8
RE: AnalogRead aus Loop-Schleife auskoppeln
Zitat:Das müsste jetzt nach 6 Sekunden den ersten Satz schalten, dann nach weiteren 20 Sekunden den zweiten Satz, dann wieder nach 6 Sekunden den ersten usw.

Super ThorstenCool genau so hab ich mir das gedacht.Funktioniert einwandfrei. Danke auch nochmal an alleWink


@Thorsten:Ja, da kommen noch ein paar PWM-Sätze dazu-Es soll am Ende ein Fahrzyklus eines Elektrofahrzeuges simuliert werden. Ich versuch das mal den Arrays umzusetzen, damit ich nicht ganz so viel Schreibarbeit habe.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  [gelöst] wire.h blockiert analogRead Rupert 6 85 08.12.2016 18:03
Letzter Beitrag: hotsystems
  mit if aus do-while oder while Schleife aussteigen Nafetz 6 127 05.12.2016 21:41
Letzter Beitrag: Pit
  while Schleife nach sleep mode interrupt tklaus 13 266 23.11.2016 17:40
Letzter Beitrag: Tommy56
  Do-While-Schleife Abbruchbedinung Majera 14 266 22.11.2016 18:07
Letzter Beitrag: Pit
  Schleife Hannes 3 200 16.11.2016 00:54
Letzter Beitrag: Hannes
Question Webserver, Client, Loop Marc2014 6 369 29.07.2016 21:04
Letzter Beitrag: Marc2014
  Problem: SDFat - Das Ende einer Datei finden und Schleife beenden MartinK 4 490 01.04.2016 05:49
Letzter Beitrag: MartinK
  for - Schleife #elextro19 6 719 27.03.2016 13:21
Letzter Beitrag: #elextro19
  Funktion in Loop einmalig ausführen Haustechno 4 647 09.03.2016 22:43
Letzter Beitrag: Haustechno
  Aus While-Schleife durch Interrupt aussteigen Zill3 10 1.195 08.02.2016 16:28
Letzter Beitrag: ardu_arne

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste