Čitanje podataka sa hall sensora preko PC-a
Moderators: pedja089, stojke369, [eDo], trax, LAF
Re: Čitanje podataka sa hall sensora preko PC-a
Naprvu djeluje ok, ali mi je malo zbunjujuće ovo što si prepravljao sa poljem frekv u prekidnoj petlji. Naime, ti taj -i povečavaš u glavnoj petlji i u prekidnoj. Svaki put kad dođe do prekida (ulazni signal promjeni stanje) varijabla i se uveća za 1. Ta ista varijabla zajednička je i sa glavnom petljom, ono što se događa je da se ona for petlja ne izvršava kako bi trebala, preskače. Probaj definirat novu varijablu i1 kojom ćeš vrtiti onu for petlju u glavnom programu.
Re: Čitanje podataka sa hall sensora preko PC-a
aaa kužim te ima to logike, s dvi varijable bi trebalo šljakat, probam večeras pa ti javim
Re: Čitanje podataka sa hall sensora preko PC-a
evo ga
Kao sat još jednom hvala.
Softverski nisam mogao riješit da program zbroji baš svaki signal koji naiđe, prevelika je to zadaća za arduino pa sam uzeo prosjek od 10 mjerenja koje pomnožim sa real time brojem signala. Greška će biti minimalna, a kad sve složi mislim da će biti zanemariva
Code: Select all
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(11, 12, 7, 6, 5, 4);
volatile unsigned long Prosli, Prosli2 ,Period, Period_us,Period2, Period2_us,duty_low[200],prosjecno_vrijeme_otvorenosti_injektora,ukupno_vrijeme_otvorenosti_injektora=0;
const byte ulaz1 = 2, ulaz2 = 3;
volatile byte br1 = 0, br2=0;
int i=0,j=0,brojac=0;
unsigned long vrijeme_zadnjeg_racunanja=0,vrijeme_racunanja,potrosnja_uS;
float potrosnja_cc,potrosnja_cc_S;
void resetiraj_timer1(){
TCCR1A = 0;
TCCR1B = 0;
TCCR1C = 0;
TIMSK1 = 0;
TCNT1 = 0;
}
void postavi_timer1(){
TCCR1B |= 0x02;
TIMSK1|= 1;
}
void setup(){
resetiraj_timer1();
postavi_timer1();
lcd.begin(16, 2);
Serial.begin(9600);
pinMode(ulaz1, INPUT_PULLUP); //interruptPin = 2, na pin 2 spajas signal.
pinMode(ulaz2, INPUT_PULLUP); // na pin 3 ide drugi signal
attachInterrupt(digitalPinToInterrupt(ulaz1), prekid1, CHANGE);
//attachInterrupt(digitalPinToInterrupt(ulaz2), prekid2, FALLING);
sei();
}
void loop(){
//Tu radiš kaj oćeš, u varijablama Period i Period2 su ti periodi, ali da ih skaliraš na us, moraš podjeli s 2
/* Period_us = Period/2; //Timer broji svakih 500ns pa to treba p odjelit sa 2 da bi doil us, skaliranje
Period2_us = Period/2;
/*Serial.print("Periodi 1 i 2:");
Serial.print(Period_us);
Serial.print("\t");
Serial.println(Period2_us);
*/
if(i>10)
{
for(j=0;j<10;j++)
{
if(duty_low[j]<7000) //low signal je u vedćini sluačjeva manji od high pa na ovaj način ga odvajam
{
ukupno_vrijeme_otvorenosti_injektora=ukupno_vrijeme_otvorenosti_injektora+duty_low[j]; //zbraja sveukupno vrijeme koliko je injektora otvoren
duty_low[j]=0; //prazni petlju da nebi opet iste signale računao
brojac++;
}
}
prosjecno_vrijeme_otvorenosti_injektora=ukupno_vrijeme_otvorenosti_injektora/brojac; //prosjecno vrijeme od mjerenja
ukupno_vrijeme_otvorenosti_injektora=0; //reset sume
brojac=0;
potrosnja_uS=prosjecno_vrijeme_otvorenosti_injektora*(i/2); //sveukupno vrijeme otvorenosti injektora od zadnjeg racunjanja
i=-1; //reset "i" da ne pobjegne sljedeći signal
/*Serial.print("potrosnja Us =");
Serial.print(potrosnja_uS);
*/
potrosnja_cc=((float)potrosnja_uS/1000)*0.004; //vrijeme otvorenosti injektora pretvara u mS i množim na 0.004 cc/mS da dobijem količinu ubrizganog goriva u cc
/*Serial.print(" potrosnja cc = ");
Serial.print(potrosnja_cc);
*/
vrijeme_racunanja=millis()-vrijeme_zadnjeg_racunanja;
potrosnja_cc_S = (potrosnja_cc*1000)/(float)vrijeme_racunanja; //količina ubrzganog goriva podjeljeno sa vremenom dobijem cc/mS
/*Serial.print(" kolicina ubrziganog = ");
Serial.print(potrosnja_cc_S);
*/
vrijeme_zadnjeg_racunanja = millis();
Serial.print(" vrijeme == ");
lcd.setCursor(0, 0);
lcd.print(" t mS = ");
lcd.print(prosjecno_vrijeme_otvorenosti_injektora);
Serial.print(prosjecno_vrijeme_otvorenosti_injektora);
Serial.print(" potrosnja cc/min = ");
lcd.setCursor(0, 1);
lcd.print("cc/min = ");
lcd.print(potrosnja_cc_S*60); //pomnožim cc/S sa 60 da dobijem cc/min
Serial.println(potrosnja_cc_S*60);
delay(500);
}
}
ISR(TIMER1_OVF_vect){//}
br1++;
br2++;
if(br1>30){
br1=0;
//Tu staviš frekvencija1 = 0 za periode dulje od sek
//Tu budi što kraći tak da ne uzimaš puno vremena
}
if(br2>30){
br2=0;
//Tu staviš frekecenija2 = 0 za periode dulje od sek
//Tu budi što kraći tak da ne uzimaš puno vremena
}
}
void prekid1(){
unsigned int trenutno = TCNT1;
if(br1){ //Ako je došlo do prelejva
Period = ((unsigned long)br1*65535-Prosli) + trenutno;
br1=0;
}
else{
Period = trenutno - Prosli;
}
i++;
duty_low[i] = Period;
Prosli = trenutno;
}
Kao sat još jednom hvala.
Softverski nisam mogao riješit da program zbroji baš svaki signal koji naiđe, prevelika je to zadaća za arduino pa sam uzeo prosjek od 10 mjerenja koje pomnožim sa real time brojem signala. Greška će biti minimalna, a kad sve složi mislim da će biti zanemariva
Re: Čitanje podataka sa hall sensora preko PC-a
evo ga i prvi test
https://www.youtube.com/watch?v=9oXKbyi ... e=youtu.be
BC laže oko 15%, što je i bilo za očekivat jer ja mjerim kao da se injektori zatvaraju idealno, ali oni imaju svoj delay.
https://www.youtube.com/watch?v=9oXKbyi ... e=youtu.be
BC laže oko 15%, što je i bilo za očekivat jer ja mjerim kao da se injektori zatvaraju idealno, ali oni imaju svoj delay.