come da titolo, è un po che mi frulla in mente questa idea! ma mi servirebbe condividere la mia idea con voi per avere un parere!
vedrò di semplificare la cosa e spiegarvela bene.
il volano del motore eroga 12V continui, 300V per la bobina e un segnale di qualche V ad ogni rivoluzione di esso.
la bobina originale, carica un condensatore con i 300v e non appena arriva il segnale di pick-up, trigghera un scr che scarica il condensatore e crea la scintilla alla candela! (molto semplificato, ma funziona così!)
quello che vorrei fare è: attendere l'arrivo del primo segnale pick-up, far scattare un timer così da avere gli RPM al secondo segnale che ricevo. una volta fatto ciò, c'è da ritardare secondo una tabela specifica i seguenti impulsi!
mi spiego meglio: supponete di conoscere già gli rpm, per esempio 5000, che sarebbero 83hz, 12millisecondi e 33,5 uSecondi ad ogni grado di rotazione! (spero di non aver errato i calcoli!)
arriva un impulso, l'arduino lo elabora e ne tira fuori un'altro 3° (o 100uS) dopo. e così via seguengo una tabella di ritardo e i giri del motore!
a parere vostro, è una cosa fattibile con Arduino, ma soprattutto col C?
Non ho capito che vuoi fare....una centralina programmabile? Se si, il 328, o anche solo un attiny minimo, ce la fanno senza problemi!
....300volts alla bobina? Ho avuto oltre 20 moto, sia 2t che 4t, ma alla bobina arrivano sempre e solo dei 12 o dei 24v! E dal generatore esce solo tensione alternata!
bene Astro, allora, inizio a buttare giù due righe, che già ho qualche idea!
per la questione ritardo in gradi, pensavo di sfruttare una cosa che usavo sui pic, cioè miscelare l'assembler al C e più nello specifico il "nop".
stando al playground, un singolo "nop" crea un ritardo di 62,5nS a 16mhz. pertanto se ne concateno 4 ottengo 250nS. un'ottimo sottomultiplo se inserito in un ciclo for.
sempre se non sbaglio i calcoli, 135 cicli si avvicinano ai 33 uS dell'esempio di prima!
cose ovvie per voi, ma non sempre per me!
ivan64, dipende di quale sistema parli. tutte le CDI carcano un grosso condensatore a 250-300V per funzionare, le TCI invece struttano la 12V stessa, sfruttando l'induttanza interna della bobina di accenzione. infatti, le due bobine non sono intercambiabili, perche una ha impedenza maggiore dell'altra!
z3us:
per la questione ritardo in gradi, pensavo di sfruttare una cosa che usavo sui pic, cioè miscelare l'assembler al C e più nello specifico il "nop".
I timer servono proprio per generare temporizzazioni
Carichi su un timer il numero di cicli, 62.5 ns ciascuno se non usi il prescaler, per ottenere il tempo desiderato e attivi il relativo interrupt, alla fine del conteggio si attiva la ISR e fai quello che serve, nel frattempo che si esaurisce il conteggio il micro può fare altre cose.
In realtà sul timer devi caricare un valore pari al conteggio massimo, 256 se otto bit o 655536 se 16 bit, meno il numero di cicli richiesti, questo perché i timer del 328p contano solo avanti e l'interrupt si attiva al passaggio per lo zero.
Grazie Astro per la dritta! in effetti si risparmia il For e si ha un delay molto più preciso!
ho cercato un po però, credo di non riuscire a trvare nulla sui timer in C. mi sa che devo mettermi Datasheet alla mano e attivarlo e caricarlo così! spero si faccia in un modo simile ai pic.
z3us:
ho cercato un po però, credo di non riuscire a trvare nulla sui timer in C. mi sa che devo mettermi Datasheet alla mano e attivarlo e caricarlo così! spero si faccia in un modo simile ai pic.
Se non ricordo male Leo aveva postato una specie di miniguida ai timer del 328, prova a fare una ricerca, se non trovi nulla più tardi ti posto io del codice di esempio per ottenere una temporizzazione generica precisa.
z3us:
bene Astro, allora, inizio a buttare giù due righe, che già ho qualche idea!
per la questione ritardo in gradi, pensavo di sfruttare una cosa che usavo sui pic, cioè miscelare l'assembler al C e più nello specifico il "nop".
stando al playground, un singolo "nop" crea un ritardo di 62,5nS a 16mhz. pertanto se ne concateno 4 ottengo 250nS. un'ottimo sottomultiplo se inserito in un ciclo for.
sempre se non sbaglio i calcoli, 135 cicli si avvicinano ai 33 uS dell'esempio di prima!
Ma non credi che il ciclo for consumi un po di cicli macchina? e alla fine sarai moooooooooolto sopra quello da te calcolato.
Per verificarlo basta stampare prima e dopo il micros (fallo prima senza il for per verificare il tempo per la stampa e poi inserendo il for e per il risultato sottraendo il valore della stampa a vuoto).
Ciao Uwe
secondo le indicazioni di Asto, sono arrivato a queste conclusioni preliminari.
il programma dovrebbe avere questa struttura (credo)!
Loop() {
tabella valori di ritardo ......
if(Flag=1) {
calcola RPM;
Prendi valore dalla tabella;
Carica il timer1 e fallo partire;
Flag=0;
}
}
Int Timer1() {
Attiva pinx
attendi...;
disattiva pinx;
}
Int pin esterno() {
salva il valore del timer1;
azzera il timer/ reset;
Flag=1;
}
Ho volutamente tralasciato la forma e le corrette dichiarazioni, è solo uno schizzo preliminare!
ancora non ho pensato a come creare i dati per la tabella, ci penserò poi! magari un foglio exel!
puoi dare un'occhiata al progetto 2JZduino che una persona ha sviluppato per il motore 6 cilindri Toyota 2JZ-GE 3.0L di cui controlla l'anticipo dell'accensione e l'iniezione di carburante.
Il codice si trova invece qui.
Se ti occorrono invece informazioni sui sensori, protocollo e modalita' d'interfacciamento ai sensori che trovi sui motori puoi vedere i manuali di MegaSquirt. http://www.megasquirt.info/
ma è troppo avanzato per quello che devo fare io! il mio è un semplicissimo progetto di un modulo da poter inserire dentro la bobina originale che faccia da Delayer!
la megasquirt la conosco bene, posseggo la MS1. c'è in fase di sviluppo un motore 2 tempi che giri con lei! dobbiamo ultimare il sensore di fase e i settaggi e proviamo a mettere in moto!
comunque, mi sono scaricato e stampato la parte del datasheet dedicata ai timer. 150pagine!!!! e intero è più di 600! ala faccia!
spesso mi annodo il cervello leggendolo, ma è parecchio chiaro il discorso! cerco però di tralasciare la roba che non mi serve o che non so cosa sia, sennò mi perdo!
quel blog che ho trovato, unito ad una discussione in un forum che non ricordo, e al listato di Leo72, credo mi abbiano instradato bene!
adesso ci provo......correggetemi se sbaglio:
TIMSK1 &= ~(1<<TOIE1);
TIMSK1 &= ~((1<<OCIE1A) | (1<<OCIE1B)); Queste due dovrebbero disattivare gli interrupt in fase di setting dei timer.
TCCR1B |= (1 << WGM12); questo dovrebbe impostare il Timer1 come CTC
OCR1A = Valore; qui indrei ad inserire il valore da far contare al timer prima dell'interrupt provocato.
TIMSK1 &= ~(1 << OCIE1A); questo riattiva l'interrupt che mi serve
TCCR1B |= (1 << CS10) ; e in fine, questo setta il prescaler (0 in questo esempio) e avvia il conteggio