![]() |
Allarmi vari temperature e pressioni - Versione stampabile +- Mx5Italia (https://www.mx5italia.com/forum) +-- Forum: Tecnica (https://www.mx5italia.com/forum/forum-5.html) +--- Forum: Elettronica (https://www.mx5italia.com/forum/forum-25.html) +--- Discussione: Allarmi vari temperature e pressioni (/thread-20853.html) |
Allarmi vari temperature e pressioni - .SharK - 18-01-2013 Quello del connettore è il vero segnale rpm. Non so cosa sia "sin+" sinceramente. Leggendo anchr "cos+mi da l'idea di essere una sinusoide Inviato dal mio GT-I9100 con Tapatalk 2 Allarmi vari temperature e pressioni - DNA54 - 19-01-2013 scusa se mi intrometto nella discussione senza aver letto proprio tutto io sto usando l'arduino sulla mia zx6r, e sia il segnale giri che quello velocità li leggo con pulseIn(), settato su HIGH o LOW non cambia nulla, semplicemente su HIGH ti "dice" il duty cycle dell'acceso (e diminuisce con l'aumentare dei giri), mentre su LOW quello della parte spenta dell'onda (e aumenta con l'aumentare dei giri). Puoi provare così, anche perché l'impulso rpm dovrebbe essere una onda quadra, non una sinusoide. Attento a mettere un resistore da 12k se no il pin si "ciuccia" troppa corrente e rischi che lo strumento non legga più come prima Allarmi vari temperature e pressioni - fracrist - 19-01-2013 DNA, se il segnale rpm mx-5 fosse a duty cycle variabile avrebbe senso, ma qui il duty cycle è fisso (38%) e varia la frequenza. Perciò non posso fare altro che "contare" i micros() che passano da un RISING/FALLING al successivo. Allarmi vari temperature e pressioni - fracrist - 19-01-2013 e non ti preoccupare che non ti "intrometti", mi stai aiutando! ![]() ![]() Allarmi vari temperature e pressioni - fracrist - 19-01-2013 .SharK Ha scritto:Quello del connettore è il vero segnale rpm. Non so cosa sia "sin+" sinceramente. Leggendo anchr "cos+mi da l'idea di essere una sinusoide Ok. In effetti dietro ai due strumenti (km/h e rpm) ci sono 4 viti (sin+ , sin- , cos+ , cos-) e mi veniva più comodo prendere il segnale da lì che dal connettore. Ma credo che rimarrò con la soluzione del connettore. Allarmi vari temperature e pressioni - DNA54 - 19-01-2013 fracrist Ha scritto:DNA, se il segnale rpm mx-5 fosse a duty cycle variabile avrebbe senso, ma qui il duty cycle è fisso (38%) e varia la frequenza. Perciò non posso fare altro che "contare" i micros() che passano da un RISING/FALLING al successivo. mmmh.. ho letto qualche giorno fa di una funzione standard che aspetta l'HIGH, fa partire un timer e lo ferma all'HIGH successivo. Restituiva il periodo (e tanto basta), il problema è che non trovo più quella funzione.. ma di sicuro è nel sito ufficiale Altrimenti puoi prendere una libreria già sviluppata da altri con funzioni belle che pronte per calcolare una frequenza variabile con duty fisso (50%) http://arduino.cc/forum/index.php?action=printpage;topic=80239.0 qui ci sono tutte le funzioni che include la libreria Allarmi vari temperature e pressioni - fracrist - 20-01-2013 Grazie per i link. ![]() Rimango però restio ad utilizzare librerie esterne per fare cose semplici che posso implementare io (ammesso che non sbagli a scrivere il codice), ma ci guardo e vedo che ne posso tirare fuori. Allarmi vari temperature e pressioni - DNA54 - 21-01-2013 trovato! e dire che l'avevo anche usato.. http://arduino.cc/en/Reference/pulseIn a bassi giri avrai un valore abbastanza alto che decresce all'aumentare dei giri, basta usare il tipo di variabile int per avere una buona definizione Allarmi vari temperature e pressioni - fracrist - 21-01-2013 ... Allarmi vari temperature e pressioni - fracrist - 21-01-2013 Grazie di nuovo :chessygrin:. Ho dato un'occhiata a come usarla, ma credo che non faccia al caso mio perché non riesco a inserirla "a interrupt". Mi spiego meglio: la rilevazione dei giri deve essere asincrona rispetto al resto del programma, perchè il task principale è quello di "accendere luci" e non posso bloccare in attesa di input. Ecco qualche estratto (setup, loop e funzione interrupt). [CODE]void setup() { //Setup Seriale : per leggere via USB cosa succede Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only } //Imposto ingressi e uscite pinMode(H2O_IN, INPUT); pinMode(OIL_IN, INPUT); pinMode(RPM_IN, INPUT); pinMode(FAULT, OUTPUT); pinMode(OIL_G, OUTPUT); pinMode(OIL_R, OUTPUT); pinMode(RPM_Y, OUTPUT); pinMode(RPM_R, OUTPUT); pinMode(H2O_G, OUTPUT); pinMode(H2O_R, OUTPUT); //Mi assicuro che non ci sia pullup sugli ingressi analogici digitalWrite(H2O_IN,LOW); digitalWrite(OIL_IN,LOW); // Attach interrupt attachInterrupt(1, rpm_count, RISING); } void loop() { resetLed(); // Tutti a LOW H2O_TEMP = analogRead(H2O_IN); //Leggo sensore temperatura acqua delay(50); //Per evitare Jitter sul pin di fianco OIL_PRES = analogRead(OIL_IN); //Leggo sensore pressione olio updateRPM(); //Aggiorno la media delle ultime 5 letture //Accendo e spengo i led di output updatedisplay(); delay(50); } void updateRPM() { noInterrupts(); //precauzionale: così time non cambia valore durante il calcolo di RPM if(time > 0) { //Medio 5 letture per normalizzare la lettura rpm_array[0] = rpm_array[1]; rpm_array[1] = rpm_array[2]; rpm_array[2] = rpm_array[3]; rpm_array[3] = rpm_array[4]; rpm_array[4] = 60*(1000000/time); //time è il periodo in micros(): qui lo converto in frequenza e in minuti //Media delle ultime 5 letture RPM = (rpm_array[0] + rpm_array[1] + rpm_array[2] + rpm_array[3] + rpm_array[4]) / 5; } interrupts(); } //RPM interrupt function void rpm_count() { time = (micros() - time_last); time_last = micros(); } [/CODE] ![]() |