Cilibiu Postat Noiembrie 11, 2012 Autor Partajează Postat Noiembrie 11, 2012 Daca inmultesc cu 100 in loc de 3000RPM o sa imi apara 500RPM.Am incercat cu "const A= 0.00167" si nici un rezultat.Am incercat sa inmulesc cu 10 si dupa sa impart la 0.017, la fel nici un rezultat.Am incercat sa inmultesc cu 10000 si dupa sa impart la 167, aici rezultatul este diferit, ultimele 2 cifre din rezultat raman 94 de la 2994, daca valoarea se modifica valoarea 4 ramane iar in loc de 9 apare ba 5 ba 9.Tot stau si ma gandesc cum sa ii dau de cap dar deocamdata nu am absolut nici o idee.Ce observ eu STRINGUL nu se afiseaza chiar asa usor. Link spre comentariu
stefan_k Postat Noiembrie 11, 2012 Partajează Postat Noiembrie 11, 2012 Incerc sa fiu coerent, sunt cam obosit. While Ovf0 < 6 '100ms @ 16 MHz nop Wend Ti-ai luat ca baza de timp 100ms, deci e normal sa trebuiasca sa inmultesti cu 600 pentru un minut intreg (si deci, obtii valori intregi din 600 in 600. Mareste baza de timp la 600ms (adica, "while 0vf0 < 36"); iar apoi inmulteste cu 100 pentru valori in rpm. Link spre comentariu
Liviu M Postat Noiembrie 12, 2012 Partajează Postat Noiembrie 12, 2012 A, bineinteles ca trebuie modificata si baza de timp, credeam ca e clar. Daca chiar vrei sa-ti iasa ceva cand inmultesti cu numere "cu virgula", trebuie sa definesti turatie ca double, nu long.Long inseamna "fara virgula", asa ca dupa ce face inmultirea/impartirea compilatorul "arunca" ce e dupa virgula si pastreaza doar intregii.Numai ca daca controllerul tau n-are multiplicator hard, inmultirea/impartirea cu double sunt operatii destul de costisitoare (spatiu si timp), asa ca varianta cu asteptarea mai lunga si inmultirea cu 100 par mai "economice". Link spre comentariu
Cilibiu Postat Noiembrie 12, 2012 Autor Partajează Postat Noiembrie 12, 2012 Incerc sa fiu coerent, sunt cam obosit. While Ovf0 < 6 '100ms @ 16 MHz nop WendTi-ai luat ca baza de timp 100ms, deci e normal sa trebuiasca sa inmultesti cu 600 pentru un minut intreg (si deci, obtii valori intregi din 600 in 600.Mareste baza de timp la 600ms (adica, "while 0vf0 < 36"); iar apoi inmulteste cu 100 pentru valori in rpm.Nu vreau sa modific bazade timp. Vreau sa ramana 100ms chiar daca se poate si 50ms, dar este cam instabil la 50ms.@liviu M o sa incerc cu double sa vad ce iese. Link spre comentariu
Liviu M Postat Noiembrie 12, 2012 Partajează Postat Noiembrie 12, 2012 Pai daca modifici valoarea afisata printr-o simpla operatie aritmetica fara sa modifici baza de timp, o sa obtii acelasi lucru ca in cazul in care inmultesti cu 100 in loc de 600 - valoare afisata va fi incorecta. Dupa parerea mea, afisarea in "trepte" de 600 iti apare pe de o parte din cauza din cauza ca lucrezi numai cu intregi (intregi inmultiti cu 600) si pe de alta parte din "eroarea de numarare". Facand un calcul simplu "in sens invers", daca motorul se invarte cu 1000 de rpm, in cele 100 ms cat e baza ta de timp mie imi ies, cu regula de trei simpla, 1000 rotatii * 100 ms / 60000 ms = 1.66 rotatii. Din punctul de vedere al programului tau, asta e 1 rotatie => 600 rpm. Asa ca in primul rand trebuie sa-ti imbunatatesti putin metoda de "achizitie": ori faci cum ti-a sugerat Stefan maresti perioada de detectie => micsorezi eroare de masurare (una e sa pierzi jumatate de tura la 2 ture si alta e s-o pierzi la 10 ture), ori modifici metoda de numarare a rotatiilor - masori timpul in care face 1/2/10 rotatii complete si calculezi numarul corespunzator de rotatii intr-un minut. Oricum ai decide, spor la bricolat si succes. PS Daca am inteles gresit metoda in care masori si nimic din ce am zis mai sus nu se potriveste, ignora-mi te rog postul. Link spre comentariu
Cilibiu Postat Noiembrie 12, 2012 Autor Partajează Postat Noiembrie 12, 2012 NU am de ce sa ingnor postul tau, in contra il iau in considerare si incerc sa analizez cam tot.Am incercat cu double si imi apare INFINITT2 sau numere eronate fara a avea semnal la intrare, cu semnal este la fel.O sa incerc sa gasesc o modalitate, daca nu voi fi nevoit sa umblu la baza de timp.Motivul pentru care nu vreau sa umblu la baza de timp este acea FIDELITATE afisata, exact cum teai uita la un fil HD pe un pentium 1 (vezi doar poze) si alta pe un P4 cu porc I5 4g ram 1g video, cum se vede video? Link spre comentariu
stefan_k Postat Noiembrie 12, 2012 Partajează Postat Noiembrie 12, 2012 N-am prea inteles de ce nu poti umbla la baza de timp. Daca o mai folosesti si la altceva, atunci da, e o problema.Dar altfel nu ai cum sa masori corect turatia.La 100ms, cand convertesti in rpm nu ai cum obtine altceva decat multiplii de 600 (rpm = 1 minut = 100ms * 600). Asta indiferent ce conversii la double faci (total inutile).E relativ simplu: - daca vrei sa afli turatia exacta (de genul 2341 rpm), trebuie sa o numeri timp de (minim) 1 minut (60 secunde) - daca ti-e suficient turatia din 100 in 100 rpm, atunci trebuie sa o numeri timp de 60secunde/100 = 600milisecundeDaca mai alte sincronizari pe timer-ul acela (lucru care nu prea reiese din cod), atunci trebuie sa te multumesti cu afisare din 600 in 600 rpm.Dar eu "miros" ca ai alte probleme de sincronizare/afisare acolo, nu timer-ul acela iti creaza tie necazuri (cel mult ti le ascunde pe cele existente). Link spre comentariu
Cilibiu Postat Noiembrie 12, 2012 Autor Partajează Postat Noiembrie 12, 2012 Acest timer este folosit si la citirea vitezei, acolo nu am probleme. codul tot ce cuprinde timerul . Enable Timer2Enable Timer1Enable Timer3'vitezaTimer2 = 0 'Reset counts Counter1 = 0 'viteza Counter3 = 0 'turometru Ovf0 = 0 'Reset overflows Ovf1 = 0 While Ovf0 < 6 '100ms @ 16 MHz nop Wend Disable Timer1 'Stop Timers Disable Timer3 Disable Timer2 Tempa = Ovf1 * 65536 'Calc frequency Viteza = Tempa + Counter1 Turatie = Tempa + Counter3 Viteza = Viteza * 10 Viteza = Viteza / 814.4 'calcul encoder Turatie = Turatie * 600Kmh = Str(viteza)Kmh = Format(kmh , " 0")Lcdtext Kmh , 41 , 50 , 3 , 0 , 0Rpm = Str(turatie)Rpm = Format(rpm , " 0")Lcdtext Rpm , 50 , 11 , 1 , 0 , 0 Link spre comentariu
stefan_k Postat Noiembrie 12, 2012 Partajează Postat Noiembrie 12, 2012 Am reanalizat un pic codul de pe pagina precedenta, plus acesta de acum.Am inteles ca ai o problema de afisare, si anume nu pare "cursiv" ci "sacadat" (daca maresti baza de timp).Daca este asa, atunci acest lucru se intampla deoarece afisezi turatia doar dupa ce o masori, si, probabil, alte parti ale aplicatiei iti sterg ecranul intre timp.Daca deduc corect, atunci: - in acest timer doar calculeaza-ti/masoara-ti turatia si viteza, fara sa o afisezi - afiseaza valorile de turatie/viteza in alta parte (oriunde altundeva unde faci o afisare).Practic, daca am inteles corect, problema apare deoarece afisezi ecranul pe bucati, din mai multe locuri ale aplicatiei.Cel mai corect ar fi sa ai o singura bucla de afisare, care sa iti deseneze toate valorile masurate de diversi senzori / timere / etc. Afisare "dintr-un foc", fara alte suprascrieri, si in acest mod nu ti-ar sacada nimic pe ecran.Asta, repet, daca am inteles bine ce probleme ai.Proiectul e fain, dar cred ca te-ai saturat deja de felicitari Link spre comentariu
Liviu M Postat Noiembrie 12, 2012 Partajează Postat Noiembrie 12, 2012 Acest timer este folosit si la citirea vitezei, acolo nu am probleme.Cum ai verificat ca e in ordine si ca viteza masurata e viteza reala? Ai mers cu motorul cu bordul original si cu bordul asta si ti-au aratat la fel? Link spre comentariu
Cilibiu Postat Noiembrie 12, 2012 Autor Partajează Postat Noiembrie 12, 2012 Mersi de aprecieri.Tot codul este intr-un singur loop, grafica este afisata o data dupa care intra in LOOP-ul acesta care afiseaza valorile , TURATIE,VITEZA,TEMPERATURI,KILOMETRI PARCURSI.Dar ca sa afiseze restul trebuie sa treaca de aceasta citire-afisare a turatiei si a vitezei.Ma refer la intarzierea afisari fata de sunet, de ex: cand turezi motorul, tu il auzi ca a urcat in ture si tie pe ecran apare dintro data de la 1200RPM la 6500RPM, daca afisarea se face repede atunci nu vezi exact cum ar sari ci o vezi urcand treptat.Acum experimentez cu loop la 600ms. Acest timer este folosit si la citirea vitezei, acolo nu am probleme.Cum ai verificat ca e in ordine si ca viteza masurata e viteza reala? Ai mers cu motorul cu bordul original si cu bordul asta si ti-au aratat la fel?Calcule matematice.Cate rotati am la multimplicator de la roata= distanta parcursa/rotati. O rotatie la encoder =2048 inpulsuri, si de aici calculul matematic si este ok, nu am circulat cu ea, dar dupa cum am simulat cu generatorul de frecvene exact impulsurile pentru o anumita viteza, asa imi indica si pe ecran. Ramane de vazut in realitate daca viteza corespunde cu cea reala, asta mergand in paralel cu o masina la diferite viteze, dar nu cred ca voi avea probleme, deoarece masuratorile si calculeloe matematice leam facut de mai multe ori, si simulat de n ori ca sa fiu sigur ca am facut cea ce trebuie. Link spre comentariu
DarkAngel_Bv Postat Noiembrie 12, 2012 Partajează Postat Noiembrie 12, 2012 Poti incerca cu un GPS sa-ti calibrezi vitezometrul. E mult mai safe :dUnde anume stai in Brasov? si eu vreau sa fac cea de genul, dar pentru Consum, viteza, rpm, boost pressure, air temp si alti parametrii ai unui motor turbo :DMomentan sunt cam impotmolit la partea de consum. Nu stiu cum sa fac sa-l calculez cat mai precis Link spre comentariu
Cilibiu Postat Noiembrie 12, 2012 Autor Partajează Postat Noiembrie 12, 2012 Mersi de idee! Link spre comentariu
stefan_k Postat Noiembrie 12, 2012 Partajează Postat Noiembrie 12, 2012 Tot codul este intr-un singur loop, grafica este afisata o data dupa care intra in LOOP-ul acesta careMa deruteaza un pic basic-ul asta, recunosc, dar acum ca ai facut aceasta precizare e mult mai clar.Sugestie: muta operatiile de numarare/calcul a turatiilor in intreruperea de timer, acolo unde ii e locul, si in felul acesta in bucla principala nu vei mai sta dupa ele (le vei avea gata numarate, numa' bune de afisat). Am incercat sa incropesc un cod, dar mi-am dat seama ca partea de Timer3 lipseste din ce ai dat tu. Link spre comentariu
Cilibiu Postat Noiembrie 12, 2012 Autor Partajează Postat Noiembrie 12, 2012 Timer3 nu este necesar ca ma folosesc de acelasi timer, adica TIMER2.Nu stiu cum sa fac ca rulez un loop de afisari si altul pentru timeri. Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum