Pages: 1 [2] 3 4   Go Down
Author Topic: Brauche schnelle Hilfe ... Weiß nicht weiter! ( RPM auslesen)  (Read 3118 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

So da mein Projekt auch vorerst dem Ende zugeht, müsste ich noch eimal um Hilfe bitten.
Undzwar kann ich bisher den Motor ansteuern.
Ich kann auch einen Lichtschrankensensor (Sensorik einer Alten Maus  smiley-roll ) auslesen jedoch bekomme ich nur Qutasch heraus.
Mein Ziel soll es sein das ich den Motor ansteuern kann und die Drehzahl auslesen kann.
( Komplett-Ziel wäre dann die Motordrehzahl auch unter einer Belastung konstant zuhalten (regeln).)
Bin wie immer für jede Hilfe dankbar.

Code:
#define MotorPin 10
#define SenosorPin 0


double MotorSpeed =0;
int thisTime =0;
int delayTime = 500;
void setup ()
{
  Serial.begin(9600);
  pinMode (MotorPin,OUTPUT);
  analogWrite (MotorPin,100); /Mittellast
 
 
}
Logged

Weinsberg, Germany
Offline Offline
God Member
*****
Karma: 2
Posts: 770
A Coder's Tale
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Wie liest Du den Sensor aus? Wie ist er verdrahtet? Was kommt bei Dir an? Wie sieht das komplette Programm dazu aus?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset





Bzw. des Codes bin noch ein Anfänger und naja habe mit Test-Codes rumgefummelt wo Quatsch rauskam.
Den es kammen immer andere Werte raus, totz Speerzustand...

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Kann auch gerne ein Testprogramm drüber laufen lassen ( bzw der Werte) sofern du mit sagst welches =)
Logged

Weinsberg, Germany
Offline Offline
God Member
*****
Karma: 2
Posts: 770
A Coder's Tale
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Wo hast Du den Sensor angeschlossen? Welcher Pin? Analog oder digital? Interrupt?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Analog 0

Bei diesem Programm (wurde mich gerade geschickt) bekomme ich folgende Werte was auch eine änderung zeigt ( smiley-sweat)

Code:
int val;
long last=0;
int stat=LOW;
int stat2;
int contar=0;

int sens=75;  // this value indicates the limit reading between dark and light,
              // it has to be tested as it may change acording on the
              // distance the leds are placed.
int nPalas=2; // the number of blades of the propeller

int milisegundos=1; // the time it takes each reading
void setup()
{
  Serial.begin(9600);
  pinMode(13,OUTPUT);
}

void loop()
{
  val=analogRead(0);
  if(val<sens)
    stat=LOW;
   else
    stat=HIGH;
   digitalWrite(13,stat); //as iR light is invisible for us, the led on pin 13
                          //indicate the state of the circuit.

   if(stat2!=stat){  //counts when the state change, thats from (dark to light) or
                     //from (light to dark), remmember that IR light is invisible for us.
     contar++;
     stat2=stat;
   }
   if(millis()-last>=milisegundos){
     double rps=((double)contar/nPalas)/2.0*1000.0/milisegundos;
     double rpm=((double)contar/nPalas)/2.0*60000.0/(milisegundos);
     Serial.print((contar/2.0));Serial.print("  RPS ");Serial.print(rps);
     Serial.print(" RPM");Serial.print(rpm);Serial.print("  VAL ");Serial.println(val);
     contar=0;
     last=millis();
   }
}


0.00  RPS 0.00 RPM0.00  VAL 445  // bei nicht Durchlass
 
0.00  RPS 0.00 RPM0.00  VAL 468 // bei Durchlass


Nur wie bekomme ich damit eine "Vernüntige" Drehzahl hin bzw. kann mit dieser regeln ?
(Entschuldigung wenn ich mich dumm anstelle)


Logged

Weinsberg, Germany
Offline Offline
God Member
*****
Karma: 2
Posts: 770
A Coder's Tale
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Stell mal "sens" von 75 auf 457...
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

0.50  RPS 250.00 RPM15000.00  VAL 455
Bei Änderung
Logged

Weinsberg, Germany
Offline Offline
God Member
*****
Karma: 2
Posts: 770
A Coder's Tale
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Jetzt noch "nPalas" auf die Zahl der Unterbrechungen des Sensors pro Umdrehung einstellen, dann sollte das mal erledigt sein.

Anschließend musst Du eigentlich nur die Motorleistung erhöhen wenn die RPM unter das von Dir gewünschte Maß fällt und verringern im umgekehrten Fall. Das kann man dann noch beliebig verfeinern, aber funktionieren sollte es so dann schon mal.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

.... Bin gerade wieder mal Doof ....

Kannste mit das eben schicken machen?

Wäre echt super!
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

#define MotorPin 10
int val;
long last=0;
int stat=LOW;
int stat2;
int contar=0;
double MotorSpeed =0;
int thisTime =0;
int delayTime = 500;
int sens=457;  // this value indicates the limit reading between dark and light,
              // it has to be tested as it may change acording on the
              // distance the leds are placed.
int nPalas=2; // the number of blades of the propeller

int milisegundos=1; // the time it takes each reading
void setup()
{
  Serial.begin(9600);
  pinMode(13,OUTPUT);
   pinMode (MotorPin,OUTPUT);
  analogWrite (MotorPin,100);
}

void loop()
{
  val=analogRead(0);
  if(val<sens)
    stat=LOW;
   else
    stat=HIGH;
   digitalWrite(13,stat); //as iR light is invisible for us, the led on pin 13
                          //indicate the state of the circuit.

   if(stat2!=stat){  //counts when the state change, thats from (dark to light) or
                     //from (light to dark), remmember that IR light is invisible for us.
     contar++;
     stat2=stat;
   }
   if(millis()-last>=milisegundos){
     double rps=((double)contar/nPalas)/2.0*1000.0/milisegundos;
     double rpm=((double)contar/nPalas)/2.0*60000.0/(milisegundos);
     Serial.print((contar/2.0));Serial.print("  RPS ");Serial.print(rps);
     Serial.print(" RPM");Serial.print(rpm);Serial.print("  VAL ");Serial.println(val);
     contar=0;
     last=millis();
   }
}
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wie ermittel ich die Umdrehungen denn?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich habe einen Schlitz ....
bekomme dies ausgeben...

0.00  RPS 0.00 RPM0.00  VAL 449
0.00  RPS 0.00 RPM0.00  VAL 449
0.00  RPS 0.00 RPM0.00  VAL 449
0.00  RPS 0.00 RPM0.00  VAL 449
0.50  RPS 500.00 RPM30000.00  VAL 470
0.50  RPS 500.00 RPM30000.00  VAL 450
0.00  RPS 0.00 RPM0.00  VAL 449
0.00  RPS 0.00 RPM0.00  VAL 449
0.00  RPS 0.00 RPM0.00  VAL 449
0.00  RPS 0.00 RPM0.00  VAL 449
0.00  RPS 0.00 RPM0.00  VAL 449
0.00  RPS 0.00 RPM0.00  VAL 449

somit lassen auch 2 oder?
Logged

Weinsberg, Germany
Offline Offline
God Member
*****
Karma: 2
Posts: 770
A Coder's Tale
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Ich bekomme zb 2 mal
0.50  RPS 500.00 RPM30000.00  VAL 471
dann 10 mal
0.00  RPS 0.00 RPM0.00  VAL 448
danach 2 mal
0.50  RPS 500.00 RPM30000.00  VAL 471
dann 3 mal
0.00  RPS 0.00 RPM0.00  VAL 448
danach 2 mal
0.50  RPS 500.00 RPM30000.00  VAL 471
dann 3 mal
0.00  RPS 0.00 RPM0.00  VAL 448
dann wieder
0.50  RPS 500.00 RPM30000.00  VAL 471
Würde sagen Deine Abtastrate ist zu hoch.

Stell mal milisegundos=1 um auf milisegundos=100
Logged

Weinsberg, Germany
Offline Offline
God Member
*****
Karma: 2
Posts: 770
A Coder's Tale
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Mein Ansatz wäre sowas:

Code:
#define LED 13
#define MOTOR 10
#define SENSOR 0

byte motorValue = 100;        // Sollwert fuer den Motor
double sensorAverage;         // Schwellwert fuer den Sensor
int counter;                  // Zaehlervariable
long stateCount;              // Durchgaenge, in denen der aktuelle Status gleich war
boolean actState, lastState;  // Aktueller und letzter Stand
int targetRpm;                // Solldrehzahl
long lastPrintOutTime = millis();

void setup() {
  pinMode(LED, OUTPUT);
  pinMode(MOTOR, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int value = analogRead(SENSOR);
  sensorAverage = sensorAverage * .999 + value * .001; // Schrittweise Annaeherung an den Mittelwert. Spart ein Array.

  actState = value > sensorAverage; // Liegt der Sensorwert ueber oder unter der Schwelle, zeigt der Sensor HIGH oder LOW?

  if (lastState == actState) {
    stateCount++; // Hochzaehlen wie lange der aktuelle Stand gegolten hat
  } else {
    stateCount = 0; // Falls sich was geaendert hat auf 0 setzen.
    lastState = actState; // Stand speichern
  }

  if (stateCount==10) { // Pro Standwechsel nur ein Mal machen!
    counter++;
  }

  analogWrite(MOTOR, motorValue);

  if (millis()-lastPrintOutTime>300) {
    if (targetRpm>0) {
      if (counter<targetRpm-1 && motorValue<251)
        motorValue += 5;
      if (counter>targetRpm+1 && motorValue>4)
        motorValue -= 5;
    } else {
      if (millis()>10000) {
        targetRpm = counter;
        Serial.print("Target-RPM-Counter: ");
        Serial.println(targetRpm);
      }
    }

    Serial.print(motorValue);
    Serial.print("  ");
    Serial.println(counter);

    lastPrintOutTime = millis();
    counter=0;
  }
}

Einschalten, zehn Sekunden warten bis er sich kalibriert hat, fertig. smiley
Logged

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