Go Down

Topic: Arduino Zeit zwischen Aufgaben messen (Read 4357 times) previous topic - next topic

makertom

Ich messe mit einem Arduino Uno die Aufladespannung eines Kondensators. Wenn die Spannung von 0,01V überschritten ist, soll der Arduino mit der millis() Funkton anfangen zu zählen. Wenn dann 3,16V erreicht ist soll die Zeit die der Kondensator brauchte um bis 3,16V zu laden in Millisekunden auf einem Display angezeigt werden.

Könnt ihr mir helfen wie ich die Zeit ausmessen kann?
Ich bin für jede Hilfe dankbar.

Serenifly

Hast du vor das mit dem ADC zu messen? Das wird etwas kritisch bei 10mV mit 4,88mV Auflösung. Ein Komparator wäre da genauer. Den kann man an einem normalen digitalen Eingang abfragen, oder auch per Interrupt.

makertom

@ Serenifly
Danke für deine Antwort.
ich denke der ADC sollte zum Messen ausreichen.

michael_x

Quote
ich denke der ADC sollte zum Messen ausreichen.
Wenn ganze millis, ca. +-5mV als Auflösung und Vcc als Vref für nom. 5V  reichen, dann ja.

analogRead(), millis() und eine passende LCD library für dein Display, fertig.
Das Problem wird eher sein, wann und wie eine neue Messung gestartet wird...
 

DrDiettrich

Warum nicht einfach den Code für einen kapazitiven Sensor nehmen, und digital abfragen? Da kann man zwar die Schaltschwelle nicht einstellen, aber 3,16V erscheinen mir ja auch ziemlich willkürlich.

makertom

Mein größtes Problem ist gerade, dass der Timer zwar bei 0,1V anfängt zu zählen; dann bei 3,16V aber weiterläuft und nicht anhält um mir den Wert anzuzeigen. Ich möchte sehen wie lange der Kondensator braucht bis 3,16V zu laden.

Danke für eure Hilfe.

@DrDiettrich
3,16V ist 1 Tau des Kondensators wenn man ihn mit 5V auflädt.

ardubu


makertom

#7
Aug 27, 2015, 10:04 am Last Edit: Aug 27, 2015, 10:05 am by makertom
Hier ist der Code. Sorry ich bin noch Anfänger.

/*
Pinbelegung:
Arduino 1 auf 14 Display
       3 auf 13
       4 auf 12
       5 auf 11
       11 auf 6
       12 auf 4
       */
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,2);

int analogInput = 0;
float vout = 0.0;
float vin = 0.0;
float R1 = 100000.0; // Wiederstand R1 (100K)
float R2 = 10000.0; // Wiederstand R2 (10K)     
int value = 0;
void setup()
         {
  pinMode(analogInput, INPUT);
  lcd.begin(16, 4);
 }
void loop()
         {
         
delay(100); //Hier wird die 2,5 sek. lange pause gemacht.
         
         
       

  // read the value at analog input

          value = analogRead(4);
  vout = (value * 5.0) / 1024.0 + 0.00; // see text
  vin = vout ;//((R1+R2)/R2)*8.75/8.54;
  //if (vin<0.09) {vin=0.0;} //statement to quash undesired reading !

          lcd.setCursor(0,1);
          if (vin>3.16) {lcd.print("1 Tau");}
          if (vin<3.16) {lcd.write(25);}
          if (vin<3.16) {lcd.write(25);}
          if (vin<3.16) {lcd.write(25);}
          if (vin<3.16) {lcd.write(25);}
          if (vin<3.16) {lcd.write(25);}
          if (vin<3.16) {lcd.write(25);}
          if (vin<3.16) {lcd.write(25);}
         
          lcd.setCursor(9,1);
          if (vin>4.965) {lcd.print("5 Tau");}
          if (vin<4.965) {lcd.write(25);}
          if (vin<4.965) {lcd.write(25);}
          if (vin<4.965) {lcd.write(25);}
          if (vin<4.965) {lcd.write(25);}
          if (vin<4.965) {lcd.write(25);}
          if (vin<4.965) {lcd.write(25);}
          if (vin<4.965) {lcd.write(25);}
         
          lcd.setCursor(0,2);
          if (vin>0.1) {lcd.print(millis());}
          if (vin>3.16) {} // an dieser stelle komme ich nicht weiter. ich weis nicht wie ich den Zähler anhalten soll und die Zeit, die der Kondensator brauchte um bis hier zu laden anzuzeigen.
         
             
          lcd.setCursor(0,0);
  lcd.print("Kondensatorkurve");

  lcd.setCursor(0, 3);
  lcd.print("C1"); 
          if (vin>0.5) {lcd.write(255);} //Hier wird der Abstand der Balken eingestellt.
          if (vin<0.5) {lcd.write(25);}
          if (vin>1.0) {lcd.write(255);}
          if (vin<1.0) {lcd.write(25);}
          if (vin>1.5) {lcd.write(255);}
          if (vin<1.5) {lcd.write(25);}
          if (vin>2.0) {lcd.write(255);}
          if (vin<2.0) {lcd.write(25);}
          if (vin>2.5) {lcd.write(255);}
          if (vin<2.5) {lcd.write(25);}
          if (vin>3.0) {lcd.write(255);}
          if (vin<3.0) {lcd.write(25);}
          if (vin>3.5) {lcd.write(255);}
          if (vin<3.5) {lcd.write(25);}
          if (vin>4.0) {lcd.write(255);}
          if (vin<4.0) {lcd.write(25);}
          if (vin>4.5) {lcd.write(255);}
          if (vin<4.5) {lcd.write(25);}
          if (vin>5.0) {lcd.write(255);}
          if (vin<5.0) {lcd.write(25);}


          lcd.setCursor(11, 3);
          lcd.print(vin); lcd.print("V");
         

       
 }

combie

Dieses könnte dir als Ansatz dienen, eine brauchbare Kondensatormessung aufzubauen:
https://www.mikrocontroller.net/articles/AVR_Transistortester
Denn dieser Ansatz funktioniert sehr gut.
Ein schwarzes Schaf, zur rechten Zeit, erspart den Streit, bringt Einigkeit.

makertom

Was ich vorhabe ist eigendlich das :
1. Startzeit merken
2. Kondensator aufladen und ständig analog read machen.
3. Wenn ich 3,16V erreicht habe dann möchte ich die Endzeit - Startzeit rechnen.

Könntet ihr mir sagen wie ich das im Code machen sollte?

combie

Quote
Was ich vorhabe ist eigendlich das :
Du beschreibst einen Weg, nicht das Ziel. Oder?

Möchtest du die Kapazität ermitteln?
Ein schwarzes Schaf, zur rechten Zeit, erspart den Streit, bringt Einigkeit.

makertom

#11
Aug 27, 2015, 01:34 pm Last Edit: Aug 27, 2015, 01:42 pm by makertom
Ich möchte die Spannung messen die der Kondensator gerade hat.

Wenn 3,16V erreicht sind will ich einfach den Zähler (millis) stoppen. Ich weis aber nicht wie ich das anstellen soll. Ich müsste einfach nur den Zähler pausieren.

michael_x

Quote
Möchtest du die Kapazität ermitteln?
Eher die Zeitkonstante eines RC-Glieds bestimmen ...

Nehmen wir mal an, die schwierigen Aufgaben hättest du geschafft: Den Kondensator entladen und einen Start-Trigger erkannt und du weisst wie du was auf das Display ausgibst...
Code: [Select]

#define MINIMUM 3  // StartKriterum > 0.002*Vcc (ca. 0.01V )
#define MAXIMUM 614 // Ende bei >  0.6*Vcc         ( ca. 3.00V )


void setup() { Serial.begin(9600); } // statt LCD-Anzeige
void loop() {
  static bool running;
  static unsigned long startzeit;  
  static bool starttrigger = true; // mit Reset geht's los, danach ist unklar

  int wert = analogRead(A0);

  if (running == false && wert == 0  && starttrigger) {
    running = true;
    starttrigger = false;
  }
  
  if (running && startzeit == 0 && wert >= MINIMUM)  
       startzeit = millis();

  if (running && wert >= MAXIMUM) {
     running = false;
     unsigned long dauer = millis() - startzeit;
     Serial.print(dauer); Serial.println (" msec");
     Serial.println("Entladen und Reset fuer neue Messung");
  }

}

makertom

#13
Aug 27, 2015, 01:59 pm Last Edit: Aug 27, 2015, 02:01 pm by makertom
Danke für die Antwort.

Als ich Teile des Programms in meinen Code implementiert habe kommen allerdins diese Fehlermeldungen:

sketch_aug26a.ino: In function 'void loop()':
sketch_aug26a:68: error: 'running' was not declared in this scope
sketch_aug26a:68: error: 'wert' was not declared in this scope
sketch_aug26a:68: error: 'starttrigger' was not declared in this scope
sketch_aug26a:73: error: 'running' was not declared in this scope
sketch_aug26a:73: error: 'startzeit' was not declared in this scope
sketch_aug26a:73: error: 'wert' was not declared in this scope
sketch_aug26a:76: error: 'running' was not declared in this scope
sketch_aug26a:76: error: 'wert' was not declared in this scope
sketch_aug26a:78: error: 'startzeit' was not declared in this scope
'running' was not declared in this scope


makertom

Der Code sieht jetzt so aus:



/*
Pinbelegung:
Arduino 1 auf 14 Display
        3 auf 13
        4 auf 12
        5 auf 11
        11 auf 6
        12 auf 4
        */

#include <LiquidCrystal.h>

   LiquidCrystal lcd(12,11,5,4,3,2);

   int analogInput = 0;
   float vout = 0.0;
   float vin = 0.0;
   float R1 = 100000.0; // Wiederstand R1 (100K)
   float R2 = 10000.0; // Wiederstand R2 (10K)     
   int value = 0;
        #define MINIMUM 3  // StartKriterum > 0.002*Vcc (ca. 0.01V )
        #define MAXIMUM 614 // Ende bei >  0.6*Vcc         ( ca. 3.00V )
   void setup()
          {
      pinMode(analogInput, INPUT);
      lcd.begin(16, 4);
     }
   void loop()
          {
           
delay(100); //Hier wird die 2,5 sek. lange pause gemacht.
           
           
         

      // read the value at analog input

           value = analogRead(4);
      vout = (value * 5.0) / 1024.0 + 0.00; // see text
      vin = vout ;//((R1+R2)/R2)*8.75/8.54;
      //if (vin<0.09) {vin=0.0;} //statement to quash undesired reading !

           lcd.setCursor(0,1);
           if (vin>3.16) {lcd.print("1 Tau");}
           if (vin<3.16) {lcd.write(25);}
           if (vin<3.16) {lcd.write(25);}
           if (vin<3.16) {lcd.write(25);}
           if (vin<3.16) {lcd.write(25);}
           if (vin<3.16) {lcd.write(25);}
           if (vin<3.16) {lcd.write(25);}
           if (vin<3.16) {lcd.write(25);}
           
           lcd.setCursor(9,1);
           if (vin>4.965) {lcd.print("5 Tau");}
           if (vin<4.965) {lcd.write(25);}
           if (vin<4.965) {lcd.write(25);}
           if (vin<4.965) {lcd.write(25);}
           if (vin<4.965) {lcd.write(25);}
           if (vin<4.965) {lcd.write(25);}
           if (vin<4.965) {lcd.write(25);}
           if (vin<4.965) {lcd.write(25);}
           
         /*  lcd.setCursor(0,2);
           if (vin>0.1) {lcd.print(millis());}
           if (vin>3.16) {} */ // an dieser stelle komme ich nicht weiter. ich weis nicht wie ich den Zähler anhalten soll und die Zeit, die der Kondensator brauchte um bis hier zu laden anzuzeigen.
             
if (running == false && wert == 0  && starttrigger) {
    running = true;
    starttrigger = false;
  }
 
  if (running && startzeit == 0 && wert >= MINIMUM)   
       startzeit = millis();

  if (running && wert >= MAXIMUM) {
     running = false;
     unsigned long dauer = millis() - startzeit;
     Serial.print(dauer); Serial.println (" msec");
     Serial.println("Entladen und Reset fuer neue Messung");
  }
             
             
           lcd.setCursor(0,0);
      lcd.print("Kondensatorkurve");
   
      lcd.setCursor(0, 3);
      lcd.print("C1"); 
           if (vin>0.5) {lcd.write(255);} //Hier wird der Abstand der Balken eingestellt.
           if (vin<0.5) {lcd.write(25);}
           if (vin>1.0) {lcd.write(255);}
           if (vin<1.0) {lcd.write(25);}
           if (vin>1.5) {lcd.write(255);}
           if (vin<1.5) {lcd.write(25);}
           if (vin>2.0) {lcd.write(255);}
           if (vin<2.0) {lcd.write(25);}
           if (vin>2.5) {lcd.write(255);}
           if (vin<2.5) {lcd.write(25);}
           if (vin>3.0) {lcd.write(255);}
           if (vin<3.0) {lcd.write(25);}
           if (vin>3.5) {lcd.write(255);}
           if (vin<3.5) {lcd.write(25);}
           if (vin>4.0) {lcd.write(255);}
           if (vin<4.0) {lcd.write(25);}
           if (vin>4.5) {lcd.write(255);}
           if (vin<4.5) {lcd.write(25);}
           if (vin>5.0) {lcd.write(255);}
           if (vin<5.0) {lcd.write(25);}


           lcd.setCursor(11, 3);
           lcd.print(vin); lcd.print("V");
           

       
     }

Go Up