Hello there,
i´m a new member of the Arduino Community. I searched for a simple Contoller to build my electonic Boost Contoller for my Volvo. I found the Arduino 2k9 Board . So i´ve written my first programm an it works good but i´ve to made some fine tuning on this programm: Here is it Rev 1.0:
/*Electronic Boost Controller for classical Turbo Charged endgines (without an active Boost Control)
written for an Volvo B230FK an B230FT engine to raise the Boost for a better performance and increase
horse Power and torque (org 136 HP / 230NM to 190HP and about 290-300NM).
Function:
There must be an specified load about 50% Load
an kncokcounter must have on value under 10 steps till the kock counter is under 10.
then the boost will be increased on the fixed values in boost map
On full Throttle an fixed overboost over 0,1 till 02bar will added to the normal boost.
if there is the knock signal (kockcounter over 10) during the over- and normal-boost the
Solenoid will decrease the boost in 0,15bar steps till the knocks will be away
The boostcontoller will work only over 2000RPM to save the enigne of torque peaks on lovw rpms
wirtten by Daniel Herr (Germany) */
int ledPin=13; // Status LED
int PWMout=10; //PWM signal for Solenoid driver (IRF540N)
int PWMval=0; //Variable for PWM-Value
int loadin=1; //Analog inptut Loadlevel form AMM (Air-Mass-Meter) it´s an signal 1-5.1Volts
int loadlvl; // Variable for Loadlevel
int rpmin=0; //Analog input actual RPM Value
int rpmact; //Variable for actual RPM Value
int PWMval1; //puffer Value 1
int PWMval2; //puffer Value 2
int PWMval3; //puffer Value 3
int knckin=2; //digital input from ECU Knocks are detected
int knck; //variable for kock procedure
int fts=3; //digital input full-throttle switch
int bston=4; //digital input boost controller active
int bstst= LOW; //stata Variable of boost switch
int thrt; //state of Throttl switch
int knocks=0; //Knock Counter
int en=1;
//Map for Base Value wich use for the Solenoid PWM signal (rpm20 means 2000 RPM)
//2000-2900RPM
const int rpm20=100;
const int rpm21=110; // rpm21=2100 an so on ......
const int rpm22=120;
const int rpm23=130;
const int rpm24=140;
const int rpm25=150;
const int rpm26=160;
const int rpm27=170;
const int rpm28=180;
const int rpm29=190;
//3000-3900RPM
const int rpm30=200;
const int rpm31=210;
const int rpm32=220;
const int rpm33=230;
const int rpm34=240;
const int rpm35=250;
const int rpm36=10;
const int rpm37=20;
const int rpm38=30;
const int rpm39=40;
//4000-4900RPM
const int rpm40=50;
const int rpm41=60;
const int rpm42=70;
const int rpm43=80;
const int rpm44=90;
const int rpm45=100;
const int rpm46=110;
const int rpm47=120;
const int rpm48=130;
const int rpm49=140;
//5000-5900RPM
const int rpm50=150;
const int rpm51=160;
const int rpm52=170;
const int rpm53=180;
const int rpm54=190;
const int rpm55=200;
const int rpm56=210;
const int rpm57=220;
const int rpm58=230;
const int rpm59=240;
//6000-65000RPM
const int rpm60=250;
const int rpm61=10;
const int rpm62=20;
const int rpm63=30;
const int rpm64=40; //.......
const int rpm65=50; //value for 6500 RPM
void setup(){
pinMode (ledPin, OUTPUT);
pinMode (PWMout, OUTPUT);
pinMode (loadin, INPUT);
pinMode (rpmin, INPUT);
pinMode (knckin, INPUT);
digitalWrite (knckin, LOW);
pinMode (fts, INPUT);
pinMode (bston, INPUT);
Serial.begin(9600);
}
void loop(){
bstst=digitalRead(bston); //Request Boost Controller switched on?
bstst=HIGH; //Override Swich Contact for testing
knck=digitalRead(knckin); //Is there a Knock Signal ?
thrt=digitalRead(fts); // Throttle Fullspeed switch on?
thrt=0;
if (knck==1){ // If Knock Signal detected counter was increase by 1
knocks=++knocks;
}
else if (knck==0 && knocks >=1){ // If no Knock Signal detected and counter is bigger then 0 increase Counter by 1 unit
knocks=--knocks;
}
//loadlvl=analogRead(loadin); // Read Engine Load Signal
loadlvl=600; // Override Load Signal for testing
rpmact=analogRead(rpmin);
rpmact=map(rpmact, 0 , 1023, 1 ,65);
// if (rpmact <=19) PWMval=0;
// if (thrt==1 && rpmact <=19) PWMval=255;
if (knocks < 20 && en==1 && (loadlvl >=520 || thrt==1)) {
switch (rpmact) {
default:
PWMval=0;
break;
case 20:
PWMval=rpm20;
break;
case 21:
PWMval=rpm21;
break;
case 22:
PWMval=rpm22;
break;
case 23:
PWMval=rpm23;
break;
case 24:
PWMval=rpm24;
break;
case 25:
PWMval=rpm25;
break;
case 26:
PWMval=rpm26;
break;
case 27:
PWMval=rpm27;
break;
case 28:
PWMval=rpm28;
break;
case 29:
PWMval=rpm29;
break;
case 30:
PWMval=rpm30;
break;
case 31:
PWMval=rpm31;
break;
case 32:
PWMval=rpm32;
break;
case 33:
PWMval=rpm33;
break;
case 34:
PWMval=rpm34;
break;
case 35:
PWMval=rpm35;
break;
case 36:
PWMval=rpm36;
break;
case 37:
PWMval=rpm37;
break;
case 38:
PWMval=rpm38;
break;
case 39:
PWMval=rpm39;
break;
case 40:
PWMval=rpm40;
break;
case 41:
PWMval=rpm41;
break;
case 42:
PWMval=rpm42;
break;
case 43:
PWMval=rpm43;
break;
case 44:
PWMval=rpm44;
break;
case 45:
PWMval=rpm45;
break;
case 46:
PWMval=rpm46;
break;
case 47:
PWMval=rpm47;
break;
case 48:
PWMval=rpm48;
break;
case 49:
PWMval=rpm49;
break;
case 50:
PWMval=rpm50;
break;
case 51:
PWMval=rpm51;
break;
case 52:
PWMval=rpm52;
break;
case 53:
PWMval=rpm53;
break;
case 54:
PWMval=rpm54;
break;
case 55:
PWMval=rpm55;
break;
case 56:
PWMval=rpm56;
break;
case 57:
PWMval=rpm57;
break;
case 58:
PWMval=rpm58;
break;
case 59:
PWMval=rpm59;
break;
case 60:
PWMval=rpm60;
break;
case 61:
PWMval=rpm61;
break;
case 62:
PWMval=rpm62;
break;
case 63:
PWMval=rpm63;
break;
case 64:
PWMval=rpm64;
break;
case 65:
PWMval=rpm65;
break;
}
PWMval1=PWMval;
}
else if (knocks >=20 && PWMval1 >=10)
{
PWMval1=PWMval1-=10 ;
en=0;
}
else if (knocks <=20 && PWMval1 < PWMval)
{
PWMval1=PWMval1+=10;
if (PWMval1==PWMval){
en=1;
}
}
analogWrite (PWMout,PWMval1);
Serial.print("Drehzalistwert: ");
Serial.println(rpmact);
Serial.print("Klopfwert: ");
Serial.println(knocks);
Serial.print("PWM Wert: ");
Serial.println(PWMval1);
Serial.print("Klopfeingang: ");
Serial.println(knck);
delay (100);
if (PWMval >= 30){
digitalWrite (ledPin, HIGH);
}
else{
digitalWrite (ledPin, LOW);
}
}