Čitanje podataka sa hall sensora preko PC-a

Forum o svemu i svačemu, ALI vezanim za elektroniku.

Moderators: pedja089, stojke369, [eDo], trax, LAF

Maki
Odlično uznapredovao
Odlično uznapredovao
Posts: 766
Joined: 02-07-2012, 12:54

Re: Čitanje podataka sa hall sensora preko PC-a

Post by Maki »

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.
User avatar
Black
Odlično uznapredovao
Odlično uznapredovao
Posts: 981
Joined: 17-12-2008, 15:44

Re: Čitanje podataka sa hall sensora preko PC-a

Post by Black »

aaa kužim te ima to logike, s dvi varijable bi trebalo šljakat, probam večeras pa ti javim
User avatar
Black
Odlično uznapredovao
Odlično uznapredovao
Posts: 981
Joined: 17-12-2008, 15:44

Re: Čitanje podataka sa hall sensora preko PC-a

Post by Black »

evo ga

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 :wink: 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
User avatar
Black
Odlično uznapredovao
Odlično uznapredovao
Posts: 981
Joined: 17-12-2008, 15:44

Re: Čitanje podataka sa hall sensora preko PC-a

Post by Black »

evo ga i prvi test :D :D
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.
Post Reply