penna_85, il 28 May 2013 - 09:40, ha scritto:
Io ho capito (ma forse ho letto male) che lui parta già da una mappa base...
Lavorando "di fino" su una mappa già fatta e andandola a correggere non ci vuole tutto questo tempo
Vero, ma se io devo fare una cosa, o la faccio bene (per poterla anche dare ad altri...) oppure non mi ci metto nemmeno.
Sull'utilità in una moto stock siam pienamente d'accordo.
Oh certo!!
Per carità, sforzo ammirevole!!
Come già detto, io ambirei a "qualcosa in più"...forse perchè son testardo io evidentemente, ma una volta che faccio/provo qualcosa voglio sempre arrivare a migliorarlo; a maggior ragione se lo faccio per passione.
So come lavorano i moduli aggiuntivi in commercio: ne voglio fare uno migliore...
Parto dalla "base", poi via via voglio svilupparlo e renderlo migliore...non certo per avere quei 2cv in più
Il tuo discorso andrebbe bene se io stessi usando delle apparecchiature adatte, ma mi sto arrangiando con un controllore programmato in un linguaggio molto vicino a quello macchina (molto più di tanti di altissimo livello), e chiunque programmi sa quanto è difficile scrivere programmi complessi in C, tanto più quando il compilatore non ti "aiuta" quasi per nulla...
Comunque, diamo il benvenuto al programma versione 1.0 !!
#include <SPI.h>
const int slaveSelectPin = 10;
const int tpsLett=A0; //la lettura analogica del tps
const int rpmLett=6; //la lettura analogica dei rpm
int tps=0; //la variabile che accoglierà il tps
int rpm=0; //la variabile che accoglierà gli rpm
int level=0; //il dato da inviare al potenziometro
//la mappa caricata
int TPS5[13] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int TPS10[13] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int TPS20[13] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int TPS30[13] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int TPS50[13] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int TPS70[13] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int TPS100[13] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
void setup()
{
pinMode (slaveSelectPin, OUTPUT);
SPI.begin();
digitalPotWrite(level);
}
void loop()
{
tps=mapTps(analogRead(tpsLett)); //fase 1: leggo i valori e li mappo
rpm=mapRpm(pulseIn(rpmLett,HIGH,2000));
//quantizzo i valori rpm
if (rpm<=2000) {rpm=0;}
else {
if ((rpm>2000)&&(rpm<=3000)) {rpm=1;}
else {
if ((rpm>3000)&&(rpm<=4000)) {rpm=2;}
else {
if ((rpm>4000)&&(rpm<=5000)) {rpm=3;}
else {
if ((rpm>5000)&&(rpm<=6000)) {rpm=4;}
else {
if ((rpm>6000)&&(rpm<=7000)) {rpm=5;}
else {
if ((rpm>7000)&&(rpm<=8000)) {rpm=6;}
else {
if ((rpm>8000)&&(rpm<=9000)) {rpm=7;}
else {
if ((rpm>9000)&&(rpm<=10000)) {rpm=8;}
else {
if ((rpm>10000)&&(rpm<=11000)) {rpm=9;}
else {
if ((rpm>11000)&&(rpm<=12000)) {rpm=10;}
else {
if ((rpm>12000)&&(rpm<=13000)) {rpm=11;}
else {
if (rpm>13000) {rpm=12;}
}
}
}
}
}
}
}
}
}
}
}
}
//quantizzo i valori tps
if (tps<=5) {tps=5;}
else {
if ((tps>5)&&(tps<=10)) {tps=10;}
else {
if ((tps>10)&&(tps<=20)) {tps=20;}
else {
if ((tps>20)&&(tps<=30)) {tps=30;}
else {
if ((tps>30)&&(tps<=50)) {tps=50;}
else {
if ((tps>50)&&(tps<=70)) {tps=70;}
else {
if (tps>70) {tps=100;}
}
}
}
}
}
}
//adesso mando i valori della mappa al potenziometro
switch (tps) {
case 5:
tps5(rpm, &TPS5[0]);
break;
case 10:
tps10(rpm, &TPS10[0]);
break;
case 20:
tps20(rpm, &TPS20[0]);
break;
case 30:
tps30(rpm, &TPS30[0]);
break;
case 50:
tps50(rpm, &TPS50[0]);
break;
case 70:
tps70(rpm, &TPS70[0]);
break;
case 100:
tps100(rpm, &TPS100[0]);
break;
}
} //fine del ciclo loop
void digitalPotWrite(int value) //funzione che si occupa di mandare un valore al potenziometro compreso tra 0 e 255
{
digitalWrite(slaveSelectPin, LOW);
SPI.transfer(0x11);
SPI.transfer(value);
digitalWrite(slaveSelectPin, HIGH);
}
int mapTps(int value) //funzione che mappa il valore tps da 0 a 100
{
map(value,0,255,0,100);
return value;
}
int mapRpm(float value) //funzione che trasforma il periodo in rpm
{
value = 15/(value*1000000);
return value;
}
//qui le funzioni che scelgono il vettore mappa in funzione dell'apertura tps
void tps5 (int value, int *ptr5)
{
ptr5 = ptr5 + value;
digitalPotWrite(*ptr5);
}
void tps10 (int value, int *ptr10)
{
ptr10 = ptr10 + value;
digitalPotWrite(*ptr10);
}
void tps20 (int value, int *ptr20)
{
ptr20 = ptr20 + value;
digitalPotWrite(*ptr20);
}
void tps30 (int value, int *ptr30)
{
ptr30 = ptr30 + value;
digitalPotWrite(*ptr30);
}
void tps50 (int value, int *ptr50)
{
ptr50 = ptr50 + value;
digitalPotWrite(*ptr50);
}
void tps70 (int value, int *ptr70)
{
ptr70 = ptr70 + value;
digitalPotWrite(*ptr70);
}
void tps100 (int value, int *ptr100)
{
ptr100 = ptr100 + value;
digitalPotWrite(*ptr100);
}
mi sono dovuto studiare nuovamente i puntatori per riuscire a usarli a dovere, ma nonostante questo, dovrebbe girare bene
Adesso mi tocca scrivere un altro programma per memorizzare dei dati in ingresso su microSD, ma sarà abbastanza semplice questa volta
PS questo servirà per leggere una sonda lambda wideband e memorizzare i valori con tps e rpm. Usando excel poi farò una tabella con i valori medi per poter fare la mappa dedicata 3D
mi servono soltanto 135 euri per comprarla