Motorshield Velleman VMA409

Arduino shields
Berichten: 14
Geregistreerd: 05 Feb 2018, 15:06

Motorshield Velleman VMA409

Berichtdoor JMolenaar23 » 04 Jun 2018, 10:34

Hallo mede programmers,

Hierbij heb ik een issue bij mijn sketch waar ik zelf even niet uit kan komen.

Code: Alles selecteren
//------------------- Defines Sensor Pin -----------------------
const byte pwmPin = 3;
const byte pwmInterrupt = 1;
//--------------------------------------------------------------
//------------------- Engine Information -----------------------
byte engineCylinders = 1;
byte engineCycles = 4;
//--------------------------------------------------------------
//-------------- Defines Sensor reading speed ------------------
int refreshInterval = 150; //Milliseconds
//--------------------------------------------------------------
//----------------- Defines Limiter Signal ---------------------
int RPMValue1 = 1000; //Limiter engine loose
int RPMValue2 = 2000; //Limiter engine loose
int RPMValue3 = 3000; //Limiter engine loose
int RPMValue4 = 3500; //Limiter engine loose
int RPMIdle1 = 3700;
int RPMIdle2 = 4000;
int RPMValue5 = 4000; //Limiter engine pull
int RPMValue6 = 5000; //Limiter engine pull
int RPMValue7 = 6000; //Limiter engine pull
int RPMValue8 = 7000; //Limiter engine pull
//--------------------------------------------------------------
//--------------- Defines other information --------------------
unsigned long previousMillis = 0;
volatile int RPMpulses = 0;
int rpm = 0;
int ledPin = 13;
//--------------------------------------------------------------

void setup()
{
  //-------------------- Sensor Setup --------------------------
  pinMode(pwmPin, INPUT_PULLUP);
  attachInterrupt(pwmInterrupt, countRPM, FALLING);
  //------------------------------------------------------------
  //-------------------- Serial Setup --------------------------
  //Serial.begin(9600); // Console serial output
  //------------------------------------------------------------
  //-------------------- Engine Setup --------------------------
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  digitalWrite(8,HIGH);
  //------------------------------------------------------------
  pinMode(ledPin, OUTPUT);
}

void loop()
{
  digitalWrite(ledPin, HIGH);
  if(millis() - previousMillis > refreshInterval)
  {
    previousMillis = millis();
    String rpmstring =  String(getRPM());
    //char rpmstring[15];
    //rpmstring =  String(getRPM());
    //Serial.println(rpmstring);
    //Serial.println(rpmstring);
   
    digitalWrite(ledPin, LOW);
  }
 
}

void countRPM()
{
  RPMpulses++; //Counts the Sensor pulses
}

// returns engine speed in RPM
// Resolution: 30000 * engineCycles / refreshInterval / engineCylinders RPM (for default values = 20 RPM)
int getRPM()
{
  int RPM = int(RPMpulses * (600.0 / float(refreshInterval)) * engineCycles / engineCylinders / 2.0 ); // calculate RPM
  RPMpulses = 0; // reset pulse count to 0
  RPM = min(99999, RPM); // don't return value larger than 9999
 
  int curr = RPM;
  int trend;
  int prev;
 
  int limiterSpeedPush = 120;
  if(prev < curr){
    if(curr >= RPMIdle2){
        for(int limiterSpeedPull = 230; limiterSpeedPull >= 30; limiterSpeedPull -= 30){
          digitalWrite(10,HIGH);
          digitalWrite(9,LOW);
          delay(limiterSpeedPull);
          digitalWrite(10,LOW);
          digitalWrite(9,LOW);
          delay(30);
       
        }
    }else if(curr < RPMIdle1){
        for(int limiterSpeedPull = 30; limiterSpeedPull >= 29; limiterSpeedPull += 30){
         
          digitalWrite(9,HIGH);
          digitalWrite(10,LOW);
          delay(limiterSpeedPull);
          digitalWrite(9,LOW);
          digitalWrite(10,LOW);
          delay(30); 
         
        }
    }
     
  }else if(curr < prev){
    if(curr >= RPMIdle2){
     
    }else if(curr < RPMIdle1){
      for(limiterSpeedPush = 120; limiterSpeedPush < 121; limiterSpeedPush -= 20){
         digitalWrite(9,HIGH);
         digitalWrite(10,LOW);
         delay(limiterSpeedPush);
         digitalWrite(9,LOW);
         digitalWrite(10,LOW);
         delay(30);
      }
     
    }
  }


  prev = curr;
  return RPM;
}


bij deze code zal de shield bij een aantal rpm de motor moeten gaan pulseren, helaas is dit niet wat hij doet.
in tegenstelling van dat doet hij nu dus eigenlijk zo goed als niks.

hoop dat jullie me er een beetje in kunnen begeleiden.

m.v.g Dhr Molenaar.

Advertisement

Gebruikers-avatar
Berichten: 1737
Geregistreerd: 06 Aug 2016, 01:03

Re: Motorshield Velleman VMA409

Berichtdoor Koepel » 04 Jun 2018, 18:23

De Arduino loop() wordt steeds weer opnieuw uitgevoerd. Alle lokale variabelen worden steeds weer opnieuw gedeclareerd. Wanneer je zelf een functie maakt, dan worden de lokale variabelen ook bij iedere aanroep opnieuw gedeclareerd.

Je wilt bijvoorbeeld previousMillis onthouden, daarom is die globaal. Die behoudt zijn waarde.
Hetzelfde geldt voor de previous rpm waarde.

Is dit met een 8-bits AVR microcontroller (Arduino Uno, Mega 2560, Leonardo, Nano, en zo) ?
Dan kan er een interrupt komen terwijl de helft van een 16-bits variabele gebruikt wordt. Om het echt goed te doen is het nodig om de interrupts even uit te zetten.

In een 8-bits microcontroller kan een 'int' of 'unsigned int' geen 99999 worden.

Code: Alles selecteren
volatile unsigned int RPMpulses = 0;

...

int getRPM()
{
  noInterrupts();
  unsigned int RPMcopy = RPMpulses;
  RPMpulses = 0;
  interrupts();

  int RPM = int(RPMcopy * (600.0 / float(refreshInterval)) * engineCycles / engineCylinders / 2.0 ); // calculate RPM
  RPM = min(99999, RPM); // don't return value larger than 9999
  ...

Berichten: 2381
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Motorshield Velleman VMA409

Berichtdoor shooter » 06 Jun 2018, 22:01

en haal die delays weg en vervang het door een timer.
paul deelen
shooter@home.nl

Terug naar Shields

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 2 gasten