Go Down

Topic: ADXL335 Was vibriert denn da? Signalverarbeitung mit Arduino Nano (Read 337 times) previous topic - next topic

Ardukus

Liebe Arduinofreunde, Liebe Mitleser,

Die Phrase "ich bin Anfänger mit Arduino und co" möchte ich überspringen und gleich zur technischen Fragestellung übergehen.

Seit ein paar Tagen beschäftigt mich der Aufbau eines Schwingungsmessgerät anhand Arduino nano und ADXL335. Im speziellen lässt mich die Signalverarbeitung des Sensors derzeit nicht schlafen ;) Naja nicht ganz, aber meine Ideen zum vorantreiben des Projekts versiegen langsam. Zum Verständniss der Herausforderung folgt eine kurze Projektbeschreibung die aktuelle Herausforderung und anschließend die Dokumentation der aktuellen Situation.

Projektziel:
Es soll anahnd des Beschleunigungssensors ein Schwingungsmessgerät programmiert werden, das eine mechanische Schwingung auf ihre Frequenz untersucht. Die Schwingung bewegt sich im Bereich von 5-15Hz.

Lösungsansatz:
Eine Messdauer von ca. 10 Sekunden soll Rüchschluss auf die Anzahl der Auslenkungen pro Minute erlauben. Anhand der Amplitudenmessung (Zählen der positiven Ausschläge) lässt sich durch Division mit der Messdauer und Multiplikation mit 60 Sekunden eine Aussage über die Ausschläge pro Minute erzielen.


"Schwingungszahl" = (Anzahl der positiven Amplituden / Messdauer) * 60 Sekunden.

Jedoch beginnt hier die aktuelle Herausforderung in der Signalverarbeitung.
Alternative Ansätze wie fft (fast fourier transformation) wurden bereits in Erwägung gezogen, jedoch nicht erfolgreich umgesetzt bzw. muss es doch einfachere Lösungen geben? (Da Anforderungen nicht so hoch sind wie im hochfrequenzbereich)

Herausforderung:
Wie lassen sich einzelne Auslenkungen des Sensors zählen? Beziehungsweise wie lassen sich die Werte im Analogen Eingang zu einer Frequenzinformation der Schwingung umrechnen?


aktuelle Situation:
An den Arduino wurde ein oled display und ein button angeschlossen. Der Button steuert über ein Interrrupt den Start der Messung. Nach betätigen des Tasters beginnt ein Timer zu laufen bis die Messdauer erreicht wurde. Wärend der Messung werden die analog Werte des Beschleunigungssensor ausgelesen. Anschließend wird die berechnete Schwingungszahl angezeigt in [Ausschläge pro minute].
Jedoch klappt die Flankenerkennung der Schwingung nicht. Durch das Betrachten des Signal des Sensor im Serial Plotter ist mir auch klar warum, jedoch weiss ich keine bessere Möglichkeit.



Hier mal die Codelei:

Code: [Select]


#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET     4 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

//-----------------------------------ADXL 335--------------------------------
const int zpin = A0;

//------------Bedienung----------------
const int buttonPin = 2;     // the number of the pushbutton pin
const int ledPinMessung =  12;      // the number of the LED pin

//------------------------ variablen fuer entprellen----------------
volatile unsigned long alteZeit=0, entprellZeit=40;
volatile int buttonCounter = 0;

// variablen fuer zeitnehmung
unsigned long startMillis;  
unsigned long currentMillis;

float period = 10.0;
int f = 0;

int Acounter = 0;
int newAcounter = 0;
int S = 0;


double t = 0;
double a = millis();
double c ;

int go = 0;


void setup()
{
 Serial.begin(230400);
 analogReference(EXTERNAL);
 pinMode(zpin, INPUT);

 pinMode(buttonPin, INPUT);
 digitalWrite(buttonPin, HIGH);
 attachInterrupt(0, start_ISR, RISING);

 pinMode(ledPinMessung, OUTPUT);
 digitalWrite(ledPinMessung, LOW);
 
 // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
 display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Address 0x3D for 128x64
 display.clearDisplay();  

 homeScreen();
 int z = analogRead(zpin);
 Serial.print(z);
}

void homeScreen ()
{
 display.clearDisplay();
 //item
 display.setCursor(0,0);
 display.setTextSize(2);
 display.setTextColor(WHITE);
 display.print("Ergebnis");
 //periode  
 display.fillRect(97,0,60,15,WHITE);
 display.setCursor(97,4);
 display.setTextSize(1);
 display.setTextColor(BLACK);
 display.print(period);
 display.drawLine(0, 15 , 127,15 , WHITE);
 //Schwingungszahl auf Schläge pro Minute
 display.setCursor(0,25);
 display.setTextSize(2);
 display.setTextColor(WHITE);
 display.print("S:");
 display.setCursor(20,17);
 display.setTextSize(4);
 display.setTextColor(WHITE);
 display.print(S);
 display.setCursor(97,22);
 display.setTextSize(1);
 display.setTextColor(WHITE);
 display.print("Amp.");
 display.drawLine(92, 32 , 120 , 32 , WHITE);
 display.setCursor(97,35);
 display.setTextSize(1);
 display.setTextColor(WHITE);
 display.print("min");
 //Schwingungszahl bezogen auf ADXL335
 display.setCursor(0,48);
 display.setTextSize(2);
 display.setTextColor(WHITE);
 display.print("x:");
 display.print(newAcounter);
 
 
 display.display();
}

void meassuring()
{
 display.clearDisplay();
 //item
 display.setTextSize(2);
 display.setTextColor(WHITE);
 display.setCursor(0,0);
 display.print("Messung");
 //periode  
 display.fillRect(97,0,60,15,WHITE);
 display.setCursor(97,4);
 display.setTextSize(1);
 display.setTextColor(BLACK);
 display.print(period);
 display.drawLine(0, 15 , 127,15 , WHITE);
 //Schwingungszahl bezogen auf ADXL335
 display.setCursor(0,25);
 display.setTextSize(2);
 display.setTextColor(WHITE);
 display.print("x:");
 display.setCursor(20,17);
 display.setTextSize(4);
 display.setTextColor(WHITE);
 display.print(Acounter);
 display.setCursor(97,22);
 display.setTextSize(1);
 display.setTextColor(WHITE);
 display.print("Amp.");
 display.drawLine(92, 32 , 120 , 32 , WHITE);
 display.setCursor(97,35);
 display.setTextSize(1);
 display.setTextColor(WHITE);
 display.print("per.");
 //---------------------------------
 display.display();
 
 while(t <= period)
 {
   c = millis();    
   t = (c - a) / 1000;
   display.fillRect(0,55,127,14,WHITE);
   display.setTextSize(1);
   display.setTextColor(BLACK);
   display.setCursor(39,56);
   display.print("t:");
   display.print(t);
   display.print("sec");  
   display.display();

   int sensorReading = analogRead(zpin);
   Serial.println(sensorReading);
   
   display.setCursor(17,17);
   display.fillRect(17,17,75,33,BLACK);
   display.setCursor(20,17);
   display.setTextSize(4);
   display.setTextColor(WHITE);
   display.print(Acounter);
 }
 newAcounter = Acounter;
 S = (newAcounter / period) * 60;
 Acounter = 0;
 go = go -1;
 t = 0.000;

 
 
}

void loop()
{
 if (go == 0 )
 {
 homeScreen();
 }
 if(go == 1 )
 {
 meassuring();
 }

 Serial.println(S);
}

void start_ISR()
{
 if((millis() - alteZeit) > entprellZeit)
 {
   // innerhalb der entprellZeit nichts machen
   
   go++;
   
   alteZeit = millis(); // letzte Schaltzeit merken
   a = millis();
  }        
 
}



Das Angehängte Bild zeigt zwei Messreihen mit 10 Dauer und den analogen Rohwerten des ADXL335.

Vielen Dank für Ratschläge auch allgemeiner Art möchte ich mich jetzt schon bedanken. Sollte ich wichtige Informationen zu den Spezifikationen vergessen haben (was ws der Fall ist) werde ich diese nachtragen.

Gruß
Ardukus

Tommy56

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [*code] davor und [*/code] dahinter ohne *).

Dann ist er für alle gut lesbar.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)


Klaus_ww

Quote
Schwingungszahl" = (Anzahl der positiven Amplituden / Messdauer) * 60 Sekunden
Falscher Ansatz bei den kleinen Frequenzen: wenn die konstant periodisch kommen dann die Periodendauer messen, sonst geht das in die Hose.

Quote
Wie lassen sich einzelne Auslenkungen des Sensors zählen?
Würde ich digital angehen mit vorgeschaltetem Komparator. Viel einfacher in der Auswertung, siehe meine Einleitung.

Quote
Der Button steuert über ein Interrrupt den Start der Messung
Schon wieder ein Interrupt-Fetischist  :smiley-twist:
Braucht kein Mensch für eine Buttonabfrage, aber ist auch nicht verboten.

Quote
Nach betätigen des Tasters beginnt ein Timer zu laufen bis die Messdauer erreicht wurde. Wärend der Messung werden die analog Werte des Beschleunigungssensor ausgelesen
Wie gesagt, falscher Ansatz. Starte die Messung bei der ersten Flanke und zähle die Zeit für n-Flanken.

Viele Wege führen nach Rom, ich würde diesen wählen. Alternativen sind aber wie ein Interrupt für eine Tasterabfrage nicht verboten.
Freizeit-Programmierer mit moderatem Ehrgeiz besseren Code zu schreiben.

Ardukus

Hallo Klaus,

Quote
Falscher Ansatz bei den kleinen Frequenzen: wenn die konstant periodisch kommen dann die Periodendauer messen, sonst geht das in die Hose.
Das war eindeutig zu beobachten ja^^ Danke für den Anstoß Lösungen in einer anderen Ecke zu suchen!
Bezüglich Komparator muss ich mich erst einlesen, deswegen werde ich mich in den nächsten Tagen damit beschäftigen, und mich wieder melden.

Quote
Schon wieder ein Interrupt-Fetischist  :smiley-twist:
Braucht kein Mensch für eine Buttonabfrage, aber ist auch nicht verboten.
:smiley-yell: eigentlich hätte ich für die Abfrage der funktionen im loop() teil Scherze erwartet. Aber ich hatte Probleme mit if Abfragen von Buttons in der Vergangenheit..deswegen das Interrupt.
Aber gut dass es noch mehr Möglichkeiten zu entdecken gibt.

Danke
Gruß Ardukus

DrDiettrich

Zählen von Spitzen kann sehr ungenau werden, wenn man die Oberwellen nicht schon vor der Digitalisierung rausgefiltert hat. Ansonsten hilft fast nur noch FFT zur Ermittlung der Grundfrequenz.

Ardukus

Schönen Sonntag zusammen.

Bezüglich des Pojekts wollte ich mich zurückmelden und ein kleines Update wiedergeben:


Nach dem sehr nützlichen Hinweis von Klaus_ww konnte ich wieder einen Fortschritt machen.
@Klaus_ww wenn du mir deine Adresse per pw schickst und du gerne bier trinkst lass ich dir gerne ein six pack zukommen ;)


Nach der recherche von Komparatorschaltungen bin ich kurzerhand über die analogComp.h  Library gestoßen, welche die steuerung des internen Komparator an pin D6 & D7 des Arduino Nanos erlaubt.

Nach kurzem umschreiben funzt die Flankensteuerung eigentlich sehr gut, jedoch stehen die Test nächste Woche noch an.

Hiermal der code


Code: [Select]
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "analogComp.h"

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET     4 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

//-----------------------------------ADXL 335--------------------------------
const int zpin = A0;
volatile boolean enableLed = false; //used to check if the interrupt has raised

//------------Bedienung----------------
const int buttonPin = 2;     // the number of the pushbutton pin
const int ledPinMessung =  12;      // the number of the LED pin

//------------------------ variablen fuer entprellen----------------
volatile unsigned long alteZeit=0, entprellZeit=40;
volatile int buttonCounter = 0;

// variablen fuer zeitnehmung
unsigned long startMillis;  
unsigned long currentMillis;

float period = 10.0;
int f = 0;

int Acounter = 0;
int newAcounter = 0;
int S = 0;


double t = 0;
double a = millis();
double c ;

int go = 0;

 
void setup()
{
  Serial.begin(230400);
  analogComparator.setOn(AIN0, AIN1); //we instruct the lib to use voltages on the pins
  analogComparator.enableInterrupt(changeStatus, RISING); //we set the interrupt and when it has to be raised
  
  pinMode(zpin, INPUT);
  pinMode(buttonPin, INPUT);
  digitalWrite(buttonPin, HIGH);
  attachInterrupt(0, start_ISR, RISING);

  pinMode(ledPinMessung, OUTPUT);
  digitalWrite(ledPinMessung, LOW);
  
  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Address 0x3D for 128x64
  display.clearDisplay();  

  homeScreen();
  int z = analogRead(zpin);
  Serial.print(z);
}

void homeScreen ()
{
  display.clearDisplay();
  //item
  display.setCursor(0,0);
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.print("Ergebnis");
  //periode  
  display.fillRect(97,0,60,15,WHITE);
  display.setCursor(97,4);
  display.setTextSize(1);
  display.setTextColor(BLACK);
  display.print(period);
  display.drawLine(0, 15 , 127,15 , WHITE);
  //Schwingungszahl auf Schläge pro Minute
  display.setCursor(0,25);
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.print("S:");
  display.setCursor(20,17);
  display.setTextSize(4);
  display.setTextColor(WHITE);
  display.print(S);
  display.setCursor(97,22);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.print("Amp.");
  display.drawLine(92, 32 , 120 , 32 , WHITE);
  display.setCursor(97,35);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.print("min");
  //Schwingungszahl bezogen auf ADXL335
  display.setCursor(0,48);
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.print("x:");
  display.print(newAcounter);
  
  
  display.display();
}

void meassuring()
{
  display.clearDisplay();
  //item
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.print("Messung");
  //periode  
  display.fillRect(97,0,60,15,WHITE);
  display.setCursor(97,4);
  display.setTextSize(1);
  display.setTextColor(BLACK);
  display.print(period);
  display.drawLine(0, 15 , 127,15 , WHITE);
  //Schwingungszahl bezogen auf ADXL335
  display.setCursor(0,25);
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.print("x:");
  display.setCursor(20,17);
  display.setTextSize(4);
  display.setTextColor(WHITE);
  display.print(Acounter);
  display.setCursor(97,22);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.print("Amp.");
  display.drawLine(92, 32 , 120 , 32 , WHITE);
  display.setCursor(97,35);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.print("per.");
  //---------------------------------
  display.display();
  //analogComparator.enableInterrupt();
  
  while(t <= period)
  {
    c = millis();    
    t = (c - a) / 1000;
    display.fillRect(0,55,127,14,WHITE);
    display.setTextSize(1);
    display.setTextColor(BLACK);
    display.setCursor(39,56);
    display.print("t:");
    display.print(t);
    display.print("sec");  
    display.display();

    if(enableLed)
    {
      Acounter++;
      enableLed = false;
      delay(10);
    }

    
    
    display.setCursor(17,17);
    display.fillRect(17,17,75,33,BLACK);
    display.setCursor(20,17);
    display.setTextSize(4);
    display.setTextColor(WHITE);
    display.print(Acounter);
  }
  newAcounter = Acounter /  2;
  S = (newAcounter / period) * 60;
  Acounter = 0;
  go = go -1;
  t = 0.000;

  
  
}

void loop()
{
  //analogComparator.disableInterrupt();
  
  if (go == 0 )
  {
  homeScreen();
  }
  if(go == 1 )
  {
  meassuring();
  }

  Serial.println(S);
}

void start_ISR()
{
  if((millis() - alteZeit) > entprellZeit)
  {
    // innerhalb der entprellZeit nichts machen
    
    go++;
    
    alteZeit = millis(); // letzte Schaltzeit merken
    a = millis();
   }        
  
}

void changeStatus() {
    enableLed = true; //let's inform the main loop that the condition has been reached by the analog comparator
}



Jedoch gib ich mich noch nicht zufrieden, ich möchte den Ansatz der Periodentauer messung noch umsetzen bzw beide Verfahren: Frequenzmessung und Amplitudenmessung vereinen.

Das Problem, das sich beim Ändern des Ansatzes ergibt ist folgendes:
Laut meinem Verständiss bräuchte mann zwei Schwellspannungen die überwacht werden. Mein Ansatz war es zwei interrupts gleichzeitig über den Komparator laufen zu lassen, einen für RISING einen für FALLING. Leider spricht der Interrupt nicht an und meine Vermutung ist, dass immer nur ein interrupt möglich ist.



Vl hat noch jemand eine Idee oder Anmerkung wie sich ein Abwarten der negativen Halbwelle möglich ist.

Gruß
Markus

Ardukus


Für Leute die ebenso die Anleitung für die Ansteuerung des internen Komparators suchen hier gehts zur Library:


http://forum.arduino.cc/index.php?topic=158657.0





Hier noch der code für eine Messung der Periodentauer:

Code: [Select]
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "analogComp.h"

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET     4 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

//-----------------------------------ADXL 335--------------------------------
const int zpin = A0;
volatile boolean positivState = false; //used to check if the interrupt has raised
volatile boolean negativState = false; //used to check if the interrupt has raised

//------------Bedienung----------------
const int buttonPin = 2;     // the number of the pushbutton pin
const int ledPinpositiv =  8;      // the number of the LED pin
const int ledPinnegativ =  12;      // the number of the LED pin

//------------------------ variablen fuer entprellen----------------
volatile unsigned long alteZeit=0, entprellZeit=40;
volatile int buttonCounter = 0;

// variablen fuer zeitnehmung
unsigned long startMillis;  
unsigned long currentMillis;

int AMP = 10;
int f = 0;

int Acounter = 0;
int newAcounter = 0;
int S = 0;
int x = 0;


double t = 0;
double a = millis();
double c ;

int go = 0;

 
void setup()
{
  Serial.begin(230400);
  analogComparator.setOn(AIN0, AIN1); //we instruct the lib to use voltages on the pins
  analogComparator.enableInterrupt(positivWave, RISING); //we set the interrupt and when it has to be raised
  analogComparator.enableInterrupt(negativWave, FALLING);

  
  pinMode(zpin, INPUT);
  pinMode(buttonPin, INPUT);
  digitalWrite(buttonPin, HIGH);
  attachInterrupt(0, start_ISR, RISING);

  pinMode(ledPinpositiv, OUTPUT);
  digitalWrite(ledPinpositiv, LOW);
  pinMode(ledPinnegativ, OUTPUT);
  digitalWrite(ledPinnegativ, LOW);
  
  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Address 0x3D for 128x64
  display.clearDisplay();  

  homeScreen();
  int z = analogRead(zpin);
  Serial.print(z);
}

void homeScreen ()
{
  display.clearDisplay();
  //item
  display.setCursor(0,0);
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.print("Ergebnis");
  //periode  
  display.fillRect(97,0,60,15,WHITE);
  display.setCursor(97,4);
  display.setTextSize(1);
  display.setTextColor(BLACK);
  display.print(AMP);
  display.drawLine(0, 15 , 127,15 , WHITE);
  //Schwingungszahl auf Schläge pro Minute
  display.setCursor(0,25);
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.print("t:");
  display.setCursor(20,17);
  display.setTextSize(4);
  display.setTextColor(WHITE);
  display.print(t);
  display.setCursor(97,22);
  /*display.setTextSize(1);
  display.setTextColor(WHITE);
  display.print("Amp.");
  display.drawLine(92, 32 , 120 , 32 , WHITE);
  display.setCursor(97,35);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.print("min");
  */
  //Schwingungszahl bezogen auf ADXL335
  display.setCursor(0,48);
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.print("x:");
  display.print(newAcounter);
  
  
  display.display();
}

void meassuring()
{
  display.clearDisplay();
  //item
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.print("Messung");
  //periode  
  display.fillRect(97,0,60,15,WHITE);
  display.setCursor(97,4);
  display.setTextSize(1);
  display.setTextColor(BLACK);
  display.print(AMP);
  display.drawLine(0, 15 , 127,15 , WHITE);
  //Schwingungszahl bezogen auf ADXL335
  display.setCursor(0,25);
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.print("x:");
  display.setCursor(20,17);
  display.setTextSize(4);
  display.setTextColor(WHITE);
  display.print(x);
  display.setCursor(97,22);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.print("Amp.");
  display.drawLine(92, 32 , 120 , 32 , WHITE);
  display.setCursor(97,35);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.print("per.");
  //---------------------------------
  display.display();
  //analogComparator.enableInterrupt();

  analogComparator.waitComp(1000);
  while ( Acounter <= AMP)
  {
    c = millis();    
    t = (c - a) / 1000;
    display.fillRect(0,55,127,14,WHITE);
    display.setTextSize(1);
    display.setTextColor(BLACK);
    display.setCursor(39,56);
    display.print("t:");
    display.print(t);
    display.print("sec");  
    display.display();

     if (positivState)
     {
      Acounter++;
      digitalWrite(ledPinpositiv,HIGH);
      positivState = false;      
     }
     if (negativState)
     {
      //Acounter--;
      digitalWrite(ledPinnegativ,HIGH);
      negativState = false;      
     }

    
      Serial.println(x);
      //Serial.println(enableLed);
      digitalWrite(ledPinpositiv,LOW);
      digitalWrite(ledPinnegativ,LOW);
      
      display.setCursor(17,17);
      display.fillRect(17,17,75,33,BLACK);
      display.setCursor(20,17);
      display.setTextSize(4);
      display.setTextColor(WHITE);
      display.print(Acounter);
      }
  
  
    
  
  newAcounter = Acounter /  2;
  S = (newAcounter / AMP) * 60;
  Acounter = 0;
  go = go -1;
  //t = 0.000;
  x = 0;
  
  
}

void loop()
{
  //analogComparator.disableInterrupt();
  
  if (go == 0 )
  {
  homeScreen();
  }
  if(go == 1 )
  {
  meassuring();
  }

  //Serial.println(S);
}

void start_ISR()
{
  if((millis() - alteZeit) > entprellZeit)
  {
    // innerhalb der entprellZeit nichts machen
    
    go++;
    
    alteZeit = millis(); // letzte Schaltzeit merken
    a = millis();
   }        
  
}

void positivWave()
{
    positivState = true;
    digitalWrite(ledPinpositiv,HIGH);    
}

void negativWave()
{
    negativState = true;
    digitalWrite(ledPinnegativ,HIGH);    
}





Als Referenzspannung wurden ca. 1,6 Volt mittels Poti eingestellt, der Beschleunigungssensor liefert ca. 1,5 Volt in Ruhe Lage.

Klaus_ww

Quote
@Klaus_ww wenn du mir deine Adresse per pw schickst und du gerne bier trinkst lass ich dir gerne ein six pack zukommen ;)
Hey, sehr nett - aber ich trink mal gern ein Gläschen auf Deinen Erfolg wenn das Teil so läuft wie Du es möchtest  :D

Quote
Laut meinem Verständiss bräuchte mann zwei Schwellspannungen die überwacht werden
Richtig: eine Schwelle ab der ein HIGH erkannt wird, und eine mit Abstand darunter die als LOW erkannt wird. Den Abstand nennt man Hysterese.
Ich kenne die Komparatorfunktion beim arduino nicht (nur, dass es sie gibt) und ich baue meine Komparatoren einfach per Hardware auf. Zehngangpoti für die Einstellung und man muss nicht mehr am Code rumfummeln.
Aber wie sagte ich schon mal: viele Wege führen nach Rom.
Freizeit-Programmierer mit moderatem Ehrgeiz besseren Code zu schreiben.

Ardukus

Quote
Hey, sehr nett - aber ich trink mal gern ein Gläschen auf Deinen Erfolg wenn das Teil so läuft wie Du es möchtest  :D
Auch Gut :)

Quote
Richtig: eine Schwelle ab der ein HIGH erkannt wird, und eine mit Abstand darunter die als LOW erkannt wird. Den Abstand nennt man Hysterese.
Ich kenne die Komparatorfunktion beim arduino nicht (nur, dass es sie gibt) und ich baue meine Komparatoren einfach per Hardware auf. Zehngangpoti für die Einstellung und man muss nicht mehr am Code rumfummeln.
Aber wie sagte ich schon mal: viele Wege führen nach Rom.
Da ich keine Möglichkeit zur Hysteresen Verwendung im integrierten Komp. finde möchte ich auch eine Hardwarelösung probieren. Zu welcher Komponente würdest du greifen?

74LM595 Schmitt Trigger
http://www.ti.com/lit/ds/symlink/sn74hc14.pdf


oder
LM714 operational Amp
http://www.ti.com/lit/ds/symlink/lm741.pdf

Danke
Gruß
Ardukus



Klaus_ww

Ich nehm immer dem LM393, DIP8 ist klein und gross genug für entspanntes arbeiten.
Freizeit-Programmierer mit moderatem Ehrgeiz besseren Code zu schreiben.

Rentner

Hallo,

der 741 ist eigendlich für +-15 Volt gebaut. man kann Ihn aber auch mit einer Spannung betreiben. Allerdings geht der Ausgang bis 1,5 V unterhalb der Versorgungsspannung.

wenn Du den also mit 5V betreiben willst geht der Ausgang von 1,5-3,5V etwa , also nicht so optimal. Es gibt allerdings OP die sind dafür besser geeignet. Kenn ich aber nicht, es gibt aber Leute hier die wissen das.  


Heinz

Klaus_ww

Freizeit-Programmierer mit moderatem Ehrgeiz besseren Code zu schreiben.

Rentner

Hallo,

jetzt weiss ich es auch, stimmt das Ding wurde vor einiger Zeit schon mal hier erwähnt, In Verbindung mit einer Lamda Sonde richtig ?

Heinz

Ardukus

Quote
der 741 ist eigendlich für +-15 Volt gebaut. man kann Ihn aber auch mit einer Spannung betreiben. Allerdings geht der Ausgang bis 1,5 V unterhalb der Versorgungsspannung.
Da die Komponenten auch irgendwann "stanalone" laufen sollten, ist er ws ungeeignet da hast du recht

LM393 klingt ja wirklich gut :)
Anbei die Pin Belegung.
Folgende Annahme:

1 Out = digitales High wenn 1IN+ größer 1IN-
2 1 IN - = positiver Schwellwert
3 1 IN+ = Vergleichsspannung
4 GND


8 Vcc = 3V
7 Out2 = digitales High wenn 2IN+ kleiner 2IN-
6 2IN- = neagativer Schwellwert
5 2IN + = Vergleichsspannung





Go Up