Pages: 1 2 3 [4]   Go Down
Author Topic: Schnelle Impulse mit Analogread erfassen  (Read 1459 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 5
Posts: 37
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Super, hab eine neue 9V Batterie angeschlossen und es hat nun funktioniert. Also war die alte ziemlich schnell leer. Das heisst eine seperate Batterie für den Servo =)

Das mit der Anzeige des Strombereichs hat auch super funktioniert. Hier ist aber das problem, das man halt schnell schauen muss da die LED nur leuchtet solange der Impuls da ist und dieser ist ja ziemlich kurz.

Zu meiner Idee (Ich weiss nicht ob das machtbar ist)

ich habe bei jedem Strombereich diverse Messungen gemacht und da den Mittelwert genommen. Folgendes ist das Ergebniss:

10mA   112
20mA   224   
30mA   337
40mA   448
50mA   560
60mA   670
70mA   780
80mA   900

ist es nun möglich das man z.b wenn man 40mA einstellt abwartet bis er die 4 Impulse abgegeben hat (Werte sind dann so zwischen 445-450) und misst diese und erst am schluss wird die LED aufleuchten für sagen wir z.B 5 sekunden und erlischt dann wider um eine neue messung durchzuführen?

So währe es später für eine Messung einfacher das Resultat abzulesen. Zudem hat ab und zu bei einem Impuls einen fehler und misst dann z.B 20 stand 448 (bei 40mA) und da leuchtet halt in der jetztige Variante die Falsche LED


Gruss
Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 172
Posts: 3249
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Anbei dann eine Version mit länger geschalteten LEDs.
Die LEDs sollten beim Programmstart einmal alle für ca. eine Sekunde angehen (Funktionstest), und wenn Impulse eintreffen, bleiben die LEDs bis fünf Sekunden nach dem letzten erkannten Impuls an.

Code:

#include <Servo.h>
Servo myservo; 

byte ledpins[]={0,1,2,3,4,5,6,7}; // Pins für LEDs
#define ANZAHLLEDS sizeof(ledpins)
int  ledlimit[ANZAHLLEDS];

void setFastADC()
{
  // Define various ADC prescaler
  const unsigned char PS_16 = (1 << ADPS2);
  const unsigned char PS_32 = (1 << ADPS2) | (1 << ADPS0);
  const unsigned char PS_64 = (1 << ADPS2) | (1 << ADPS1);
  const unsigned char PS_128 = (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
  // set up faster ADC
  ADCSRA &= ~PS_128;  // remove bits set by Arduino library
  // you can choose a prescaler from above constants,
  ADCSRA |= PS_16;    // set our own prescaler to 16
}


void setup() {
//  Serial.begin(9600);
  setFastADC();  // superschnelle ADC-Messungen ermöglichen
  myservo.attach(9);  // Servo an Pin-9
  // Einschaltgrenzen für die LEDs ermitteln
  // Annahme 5V = 1023 analogRead = entsprechend 100 mA Stromstärke
  // die LEDs sollen je 10 mA Stromstärke repräsentieren
  // d.h. die 10 mA LED leuchtet ab >5 mA, die 20 mA LED ab >15 mA, die 30 mA LED ab >25 mA etc.
  for (int i=0;i<ANZAHLLEDS;i++)
  {
    ledlimit[i]=(5+10*i)/80.0*900.0; // 80 mA = 900 ADC
//    Serial.println(ledlimit[i]);  // zum Debugging
    pinMode(ledpins[i],OUTPUT); // LED-Pin auf OUTPUT setzen
    digitalWrite(ledpins[i],HIGH); // Zum Funktionstest alle LEDs kurz einschalten
  }
//  Serial.println("---");
  delay(1000);
  for (int i=0;i<ANZAHLLEDS;i++) digitalWrite(ledpins[i],LOW); // alle wieder ausschalten
}


unsigned long impulsStartzeit;
boolean impulsAktiv=false;
boolean ledAktiv=false;
int lastVoltage=0;
#define ZEROVOLTAGE 25     // alles unterhalb wird als Nullspannung betrachtet
#define ZUCKDAUER 200000L  // Servo-Zuckzeit in Mikrosekunden
#define LEDDAUER 5000000L  // 5 Mio. µs = 5 Sekunden

void loop() {
  int thisVoltage=analogRead(A0);
  if (thisVoltage>ZEROVOLTAGE && lastVoltage<=ZEROVOLTAGE)
  {
    impulsStartzeit=micros();
    impulsAktiv=true;
    ledAktiv=true;
    myservo.write(45);
    for (int i=0;i<ANZAHLLEDS;i++)
    {
      if (thisVoltage>ledlimit[i]) digitalWrite(ledpins[i],HIGH); // LED an
    }
//    Serial.println(thisVoltage);
  }
  lastVoltage=thisVoltage;
  if (impulsAktiv && micros()-impulsStartzeit>ZUCKDAUER)
  {
    impulsAktiv=false;
    myservo.write(90);
  }
  else if (ledAktiv && micros()-impulsStartzeit>LEDDAUER)
  {
    ledAktiv=false;
    for (int i=0;i<ANZAHLLEDS;i++) digitalWrite(ledpins[i],LOW); // LEDs aus
  }
}

Da Du die "Serial" Schnittstelle durch die Wahl der Pins 0/1 unbrauchbar gemacht hast, ist das Programm natürlich extrem schlecht wartbar geworden: Man kann sich überhaupt keine Parameter oder Zustände zum Debuggen mehr mal kurz auf Serial ausgeben lassen. Alle Zugriffe auf "Serial" habe ich daher auskommentiert, diese auskommentierten Zeilen können komplett entfernt werden.
« Last Edit: September 17, 2014, 03:48:39 am by jurs » Logged

Offline Offline
Newbie
*
Karma: 5
Posts: 37
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hey Jurs, danke viel mal.

das funktioniert super so.
ich habe jetzt den print bisschen umgebaut so das ich den digitalen pin 0 und 1 nicht gebrauchen muss.
daher passt das so optimal.

echt vielen dank nocheinmal. das ganze funktioniert nun genau so wie ich es möchte.
Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 172
Posts: 3249
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

echt vielen dank nocheinmal. das ganze funktioniert nun genau so wie ich es möchte.

Na bravo!

Aber wenn das Gerät für irgendwas anderes als zu Vorführ- und Demonstrationszwecken eines Prototypen verwendet werden soll, würde ich nochmal über das Konzept der Stromversorgung nachdenken, das nun wohl bei Dir zwei verschiedenen Batterietypen vorsieht, die auch nicht lange durchhalten.

Das zu prüfende Gerät läuft doch wohl mit Netzstrom aus der Steckdose? Dann würde ich für das Arduino-Prüfgerät auch ein Netzteil statt Batteriebetrieb vorsehen: Für das Prüfgerät ein ausreichend stark dimensioniertes 5V-Netzteil vorsehen, z.B. 5V/2500mA. Und dieses ausreichend dimensionierte Netzteil versorgt dann sowohl das Arduino-Board am 5V Pin als auch den Servo an seinem VCC-Pin. Das spart dann auf jeden Fall schon mal häufige Batteriewechsel.
Logged

Offline Offline
Newbie
*
Karma: 5
Posts: 37
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Es gibt verschieden Fabrikate. Die einen Relaxometer laufen über ein Monitoring system, welche über eine feste 230V Netzspannung versorgt werden. Jedoch gibt es auch zig kleinere Geräte die nur über Batterien betrieben werden. Daher wäre es Sinnvoll das auch das Testgerät Batteriebetrieben wird, da es halt zudem auch mobil sein soll.

Aber das mit der Spannungsversorgung werde ich mir noch überdenken. Irgendwas schlaues fällt mir dabei schon ein. =)

Grüsse
Logged

Pages: 1 2 3 [4]   Go Up
Jump to: