Hulp nodig testbank programma

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 1
Geregistreerd: 29 Nov 2012, 15:34

Hulp nodig testbank programma

Berichtdoor Jordy Laan » 29 Nov 2012, 17:01

Beste heren, (eventueel dames,)

Ik ben bezig om mijn eigen vermogensbank te maken om het vermogen van motoren te meten
Nu heb ik alle hardware op orde, ik kom er alleen niet helemaal uit met de software.
Ik hoop dat jullie me hier een stukje verder mee kunnen helpen.

Als eerste even een paar plaatjes wat ik reeds gemaakt heb.

http://img163.imageshack.us/img163/8646/09042012109.jpg
http://img442.imageshack.us/img442/3986/img181cy.jpg
http://img213.imageshack.us/img213/8867/02052012035.jpg
http://img248.imageshack.us/img248/2459/img037nv.jpg

De encoderschijf die op de elektromotor zit is puur om te testen. Deze schijf zit op ook op de rol van de testbank.
Het arduino board krijgt 2 signalen te verwerken, namelijk het rpm van de rol en het rpm van het blok.
De pulsen die de arduino krijgt zijn goed.
Nu heb ik de code gebruikt die op de arduino site stond van de tachometer
http://arduino.cc/playground/Learning/Tachometer
Deze heb ik enigszins aangepast dat hij de 2 signalen serial print.
Ook heb ik software van parallax gedownload. Deze leest de signalen uit arduino en geeft dan de waardes van de serial print in Excel.
Dit werkt allemaal prima

Afbeelding

Nu alleen de volgende problemen met de arduino code:

De encoderschijf heeft 100 inkepingen. Dit betekend 100 pulsjes in 1 rpm. De omtrek van de rol is 1 meter, Als ik dit dus allemaal bereken maakt de rol bij 100 km/h dus 1667 rpm. Dit zijn 166700 pulsen per minuut, en dus 2778 pulsen per sec.
Dit moet voor de arduino geen probleem zijn. Het werkt ook prima als ik alleen dat rolsignaal door arduino laat printen in excel, maar als ik het programma erin zet dat hij ook het blok rpm meeneemt kom ik niet boven ongeveer 900 rpm. Ik weet dat het in de code zit, maar hoe ik het nu op moet lossen met de bestaande code die ik gebruik?

Dan het volgende probleempje. De arduino stuurt 20 x per seconde een rpm update naar excel. Dit is voor het rpm van de rol geen probleem omdat hij toch genoeg pulsen ontvangt, maar deze snelheid is voor het rpm van het blok veel te hoog. Stel het blok draaid 1500 rpm. Dat zijn 25 pulsen per seconde. Maar als hij 20 keer per seconde een update maakt krijgt hij maar 1,25 pulsen, dus 1 puls per 0,05 sec. Dit levert een mega onnauwkeurige meting op.

Hoe kan ik mijn code zo aanpassen dat ik de nauwkeurige meting van 20 x per seconde voor de rol behoud, maar dat het rpm van het blok maar bijv 2 x per seconde update ?

Code: Alles selecteren
int val;
int valblok;
long last=0;
long lastblok=0;
int stat=LOW;
int statblok=LOW;
int stat2;
int stat2blok;
int contar=0;
int contarblok=0;

int sens=1000;  // 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=100; // the number of blades of the propeller
int nPalasblok=1;

int milisegundos=50; // the time it takes each reading
void setup()
{
  Serial.begin(128000);
  pinMode(50,OUTPUT);
  pinMode(51,OUTPUT);
  Serial.println("CLEARDATA");
  Serial.println("LABEL,Time,rpmrol,rpmblok");
}

void loop()
{
  val=analogRead(3);
  if(val<sens)
    stat=LOW;
   else
    stat=HIGH;
   digitalWrite(50,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;
   }
  valblok=analogRead(2);
  if(valblok<sens)
    statblok=LOW;
   else
    statblok=HIGH;
   digitalWrite(51,statblok); //as iR light is invisible for us, the led on pin 13
                          //indicate the state of the circuit.

   if(stat2blok!=statblok){  //counts when the state change, thats from (dark to light) or
                     //from (light to dark), remmember that IR light is invisible for us.
     contarblok++;
     stat2blok=statblok;
   }
   
   if(millis()-last>=milisegundos){
     double rpmrol=((double)contar/nPalas)/2.0*60000.0/(milisegundos);
     double rpmblok=((double)contarblok/nPalasblok)/2.0*60000.0/(milisegundos);
     Serial.print("DATA,TIME,"); Serial.print(rpmrol); Serial.print(","); Serial.println(rpmblok);
     contar=0;
     contarblok=0;
     last=millis();
   }
}


Ik hoop dat jullie mij enigszins verder kunnen helpen :)

Met vriendelijke groet,

Jordy Laan

Advertisement

Berichten: 68
Geregistreerd: 28 Aug 2012, 15:14

Re: Hulp nodig testbank programma

Berichtdoor Nald » 09 Dec 2012, 14:57

Hallo,

Wat een mooi project, ik ben zelf een beginner. Maar als je louter pulsen telt dan kan je (wat mij is verteld) beter een interrupt laten lopen. omdat die altijd loopt en in de arduino (loop) omgeving kan wel eens een vertraging zijn waardoor deze pulsen mist.

Op een arduino forum heb ik deze code gekregen.

Code: Alles selecteren
//
//    FILE: RPM DEMO.pde
//  AUTHOR: Rob Tillaart
//    DATE: 2012-NOV-04
//
// PUPROSE: demonstrate the use of interrupts to build an RPM measure tool
//

// initialize vars while declaring
volatile unsigned long rpmHV = 0;
volatile unsigned long flowHV = 0;

unsigned long lastRPM = 0;
unsigned long lastFLOW = 0;

unsigned long lastTime = 0;

#define INTERVAL 500UL  // unsigned long as all timing math is done in UL.

void setup()
{
  attachInterrupt(1, rpm_fun, RISING);
  attachInterrupt(0, flow_fun, RISING);

  Serial.begin(9600);
  Serial.println("start...");
}

void loop()
{
  unsigned long now = millis();  // to prevent that the next read of millis jumps a few millisecs
  if (now - lastTime >= INTERVAL)   // every 500 milliseconds
  {
    lastTime = now;  // remember last time we displayed something

    // how many pulses since last display action
    unsigned long deltaRPM = rpmHV - lastRPM;
    unsigned long deltaFLOW = flowHV - lastFLOW;

    // display the current values
    Serial.print("time: ");
    Serial.println(now);
    Serial.print("rpmcount: ");
    Serial.println((deltaRPM * 60000UL) /INTERVAL); 
    Serial.print("flowcount: ");
    Serial.println(deltaFLOW );   // needs probably some math to

    // adjust the last values
    lastRPM += deltaRPM;
    lastFLOW += deltaFLOW;
  }
}

void rpm_fun()
{
  rpmHV++;
}

void flow_fun()
{
  flowHV++;
}


Bij arduino uno zijn de interrupt pinnen 2 en 3, bij de jouwe liggen ze anders (google weet alles)

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 9 gasten