Motorshield Velleman VMA409
3 berichten
• Pagina 1 van 1
- JMolenaar23
- Berichten: 14
- Geregistreerd: 05 Feb 2018, 15:06
Motorshield Velleman VMA409
Hallo mede programmers,
Hierbij heb ik een issue bij mijn sketch waar ik zelf even niet uit kan komen.
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.
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
Re: Motorshield Velleman VMA409
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.
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
...
Re: Motorshield Velleman VMA409
en haal die delays weg en vervang het door een timer.
paul deelen
shooter@home.nl
shooter@home.nl
3 berichten
• Pagina 1 van 1
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 29 gasten