Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Pracenje linije problem sa kontrolerom

[es] :: Elektronika :: Mikrokontroleri :: Pracenje linije problem sa kontrolerom

[ Pregleda: 2893 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

nikolapirot
Student
Srbija Pirot

Član broj: 235367
Poruke: 239
*.dynamic.isp.telekom.rs.



+1 Profil

icon Pracenje linije problem sa kontrolerom11.08.2014. u 12:34 - pre 117 meseci
Pravim projekat, robota koji prati liniju. Bilo je vise pokusaja, zadnji je pratio liniju ali nisam mogao da ga usporim kad ide pravo. Sada imam jedan drugi problem, od jednom mikrokontroler je poceo sam od sebe da se restartuje. U zip fajlu sam postavio ceo kod pisan u mikroC kao i slike seme. Dakle trenutno, sema radi to sto treba, ali mikrokontroler kao da ne "cita" lepo liniju, tacnije uopste je ne prati, desi mu se nesto "iscima se" kad vidi liniju ali nastavi skroz u drugom pravcu. Da li neko ima ideju kako da resim ovaj problem? Zasto se kontroler restartuje a i ne preti liniju? Proveravao sam fototranzistore i rade lepo.
 
Odgovor na temu

HeYoo

Član broj: 72595
Poruke: 491



+1017 Profil

icon Re: Pracenje linije problem sa kontrolerom11.08.2014. u 14:07 - pre 117 meseci
Jesi li stavio decoupling kondenzator na pic? To moze biti uzrok nasumicnom restartovanju. Jel delis negde slucajno s nulom? izlazis iz opsega niza?

Ako nemas hardverski debugger probaj da izolujes delove koda i proveravas njihovu ispravnost.
Probaj da ubacis neke tvoje vrednosti umesto tih kalibracija.
To izracunavanje kalibracionih vrednosti nije neophodno svakako svaki korak raditi? Dovoljno je na pocetku.
Probaj izbeci float racun gde i kako mozes.


Da li te je otpornik na bazi spasao od pregrevanja tranzistora?
 
Odgovor na temu

nikolapirot
Student
Srbija Pirot

Član broj: 235367
Poruke: 239
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: Pracenje linije problem sa kontrolerom11.08.2014. u 14:29 - pre 117 meseci
Spasao me je otpornik za pregrevanje. Probacu da mu umetnem decupling izmedju pinova, mada restartovanje se tek danas pocelo pojavljivati, ajde kad stavim pa probam javljam sta sam uradio.
Hvala na brzim odgovorima :)
 
Odgovor na temu

nikolapirot
Student
Srbija Pirot

Član broj: 235367
Poruke: 239
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: Pracenje linije problem sa kontrolerom11.08.2014. u 14:43 - pre 117 meseci
E ovako, stavio sam decupling kondenzator malo veci 1uF, smd samo taj sam imao, i vise se ne restartuje. E sad kad sam podigao tockove da vidim koji se vrti, kad u jednu stranu senzora stavim da je linija, tj tamnije mesto onda se vrti taj tocak koji treba, no kada stavim na drugu stranu, vrte se oba! Program sam pregledao mnogo puta, mislio sam da je do seme, pa sam napravio program da upali jedan motor, pa da ga ugasi, upali drugi motor pa da ga ugasi, i sve radi, znaci do programa je ali ne mogu da nadjem "bug".
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.com
Via: [es] mailing liste

Sajt: mysql.rs


+2377 Profil

icon Re: Pracenje linije problem sa kontrolerom11.08.2014. u 16:04 - pre 117 meseci
Citat:
nikolapirot: E ovako, stavio sam decupling kondenzator malo veci 1uF, smd samo taj sam imao


sto pre mozes nalemi preko njega jedan od 100nF. taj od 1uF cesto nema dovoljno nizak ESR da stigne da popije kratkotrajni kratak spoj koji se desi na mcu-u.
ne moras da skidas taj od 1u, samo zalemi direkt na njega 100n



Citat:
nikolapirot:znaci do programa je ali ne mogu da nadjem "bug".


sema ti je skoro necitljiva, a sa iste se ne vidi kako su rasporedjeni senzori u odnosu na follower. da pretpostavimo da se AN3 nalazi u sredini AN1/2 sa jedne i AND4/5 sa druge strane mada to nema ni na semi ni u kodu napisano

kod ti je extra konfuzan, kalibracija je proces koji se radi jednom na pocetku programa ili on-demand, koja je poenta kalibracije koja se radi svaki put u petlji, nije to onda nikakva kalibracija

e sad sta radis, sa adconversion popunis sensor[0-5] (za pocetak, nauci da identujes kod ovo je strasno tesko za citanje), slobodno napises kod ovako, nista ti budzenje one dve for petlje nece skratititi ni ubrzati samo ti otezaju citanje (osim ako ti nije bas nesto do jaja frka za 2-3 bajta sto ces da ustedis)

Code:

void ADConversion(){
    senzor[0] = ADC_Get_Sample(0);Delay_us(20);
    senzor[1] = ADC_Get_Sample(1);Delay_us(20);
    senzor[2] = ADC_Get_Sample(2);Delay_us(20);
    senzor[3] = ADC_Get_Sample(4);Delay_us(20);
    senzor[4] = ADC_Get_Sample(5);Delay_us(20);
}


i onda svaki put
Code:

   for(i=0;i<5;i++){
      pomoc=( 255./((float)senzorcal[i][1]-(float)senzorcal[i][0]))*((float)senzor[i]-(float)senzorcal[i][0]);
      senzor[i]=(int)pomoc;
   }


sta je ovo? ADC si inicijalizovao sa ADC_Init()? sta to radi, to je izgleda interna funkcija mikroC-a isto kao ADC_Get_Sample ... super, adc na ovom picu je 10bitni, ne vidim da igde setujes ADFM? to znaci da ima POR/BOR vrednost koja je nula sto znaci da ti se u ADRESH nalazi bitnijih 8 bita a u ADRESL u gornja 2 bita preostalih manje bitnih 2 bita sto znaci da ako citas samo ADRESH imas osmobitnu vrednost DA konverzije (odbacis dva najmanje bitna bita). Ali ADC_Get_Sample vraca word ti to upisujes u int i tu ti je vrednost shiftovana 6 bita u levo .. dakle ili ako ces da koristi 16bitnu varijablu (tj da citas 10bitni AD) setuje ADFM na 1 ili kada iscitas shiftuj to 6 puta desno (nije bas paemtno ako vec mozes da procitas kako treba).

e sad dalje, ti imas 16bitnu vrednost, poveliku od koje oduzmes nesto pa je pomnozis sa necim i onda 255 podelis sa tim ... i onda uzmes int() od toga .. to ce uglavnom da ti bude nula rezultat za iole neku vrednost procitanu sa adc-a

ne znam cemu ovoliko cimanje uopste, to je ok da imas 20 senzora, sa po 2 senzora sa strane i jednim po sredini tu treba da radis najprostiji max() nikakvo smaranje ...

Code:


void staDaRadim(){  
  unsigned char max;
  //unsigned char min;
  unsigned char i;

  max=0;
  //min=0;
  senzor[0] = ADC_Get_Sample(0);Delay_us(20);
  senzor[1] = ADC_Get_Sample(1);Delay_us(20);
  senzor[2] = ADC_Get_Sample(2);Delay_us(20);
  senzor[3] = ADC_Get_Sample(4);Delay_us(20);
  senzor[4] = ADC_Get_Sample(5);Delay_us(20);

  if(i=1;i<5;i++){
    if (senzor[i] > senzor[max]) max = i;
    //if (senzor[i] < senzor[min]) min = i;
  }

  switch (max){
  case 0:
    //skreni mnogo levo
    break;
  case 1:
    //skreni malo levo
    break;
  case 2:
    //nemoj da radis nista, na dobrom si putu
    break;
  case 3:
    //skreni malo desno
    break;
  case 4:
    //skreni mnogo desno
    break;
  }
}



 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: Pracenje linije problem sa kontrolerom11.08.2014. u 16:21 - pre 117 meseci
ono sto mozes da "unapredis" da ne bi onih 100k na svakom tranzistoru menjao za trimer pa da trimerima podesavas nejednakost tih trandzi mozes da imas u startu kalibracionu funkciju koja ocekuje da je robot postavljen na uniformni deo podloga (dakle ne preko linije) tj da sve trandze treba dobiju isti output i onda imas mali calibration float niz kojim onda mnozis svaki izlaz sa adc-a da bi ga normalizovao .. druga stvar koju mozes da uradis je da promenis kvantifikujes ceo adc trip (kao sto mnogi foloweri rade) i napravis nesto tipa

Code:

  ADFM = 1; //rezultat je poravnat na desno
...
  //kada citamo odbacimo donjih 8 bita i koristimo samo gornja 2 bita
  //da ovo ne pisemo u mikroC radili bi nesto tipa 
  //ADCON0Bits.CHS = kanal; senzor[kanal]=ADRESH; 
  //i ne bi bilo potrebe za shiftovanje, ali posto mikroC nema
  //funkcije za tako nesto onda malo budzenja oko toga

  senzor[0] = ADC_Get_Sample(0) >> 8; Delay_us(20);
  senzor[1] = ADC_Get_Sample(1) >> 8; Delay_us(20);
  senzor[2] = ADC_Get_Sample(2) >> 8; Delay_us(20);
  senzor[3] = ADC_Get_Sample(4) >> 8; Delay_us(20);
  senzor[4] = ADC_Get_Sample(5) >> 8; Delay_us(20);
...


ostalo sve isto, na taj nacin imas "mrak", "onako" i "svetli" kao rezultat ADC-a sto ti je vise nego dovoljno jer nemas ti sareni mat po kome trci robot vec crno belu podlogu tako da ti je 2 bita rezolucija ADC-a vise nego dovoljna, veliki broj folowera cak radi sa 1bitnim adc-om
 
Odgovor na temu

nikolapirot
Student
Srbija Pirot

Član broj: 235367
Poruke: 239
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: Pracenje linije problem sa kontrolerom11.08.2014. u 17:37 - pre 117 meseci
To sto sam krstio kalibracija, je u sustini sledece. Na pocetku programa tako sto ugasim i upalim ledice otprilike odredim minimalni i maksimalni napon koji ce da da senzor i to je senzorcal matrica. E sad ne daju svi senzori isti napon u istim uslovima i tome sluzi kalibracija. Tako da posle svakog citanja senzora on predifinise tu vrednost i odnosu na vrednosti koje daju drugi senzori u istim tim uslovima . U folderu u kome je kod postoji pdf fajl u kome je to detaljno objasnjeno, i postoje dve formule koje sam ja ugradio, prva je kalibracija, a druga je ono za razmak. MikroC-ova funkcija za ADC, kada se napise x=ADC_Get_Sample(0) automatski napuni registar x bas kako treba, to sam ispitao. Inace na slici ne znam dal se vidi ono sto je krsteno 1,2,3,4,5 ide do senzora, i to su kanali AN0,AN1,AN2,AN4,AN5. Srednji je AN2 Za sada sam nasao gresku samo u kodu za nazovi kalibraciju ne treba 255/svasta nego 1024/svasta jer je maksimalna moguca vrednost 1024. Probacu sad da vidim da li cu dobiti nesto bolje ponasanje auta. A inace ukomplikovao sam kod za upravljanje jer je ovo projekat za fakultat pa smo pominjali upravljanje sistemima pa sam hteo da ubacim PID regulaciju u sve to
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: Pracenje linije problem sa kontrolerom11.08.2014. u 21:14 - pre 117 meseci
obzirom da je ispod senzora il belo il crno 3 bita ADC ti je vise nego dovoljan, to ti odma skine sa vrata potrebu za kalibracijom :D
ta formula 1024/.. bi trebala da odradi normalizaciju .. sa 1024/ ce to mzoda i da se desi ali ta funkcija nikako ne moze da se zove kalibracija .. moze da se zove normalizacija na primer a kalibraciju pozivas na pocetku programa samo jednom kada napunis vrednosti te tabele...

kapiram da ja da bi ti voleo pid ali ti ovde imas garbage in, garbage out problem .. imas 5 senzora koji imaju realno 0 i 1 vrednost i to je to .. traka koju pratis je crno bela, nije bela u sredini i polako gradijentom ide do crne nego belo/crno .. binarno ... ako oces pid da ima smisla moras bar da imas 11 senzora ..


dalje ako oces da komplikujes sa kalibracijom ima mnogo bolja fora, sve vreme dok pici robot skupljas za svaki senzor max sta si procitao i min sta si procitao i u odnosu na to racunas threshold (na pola izmedju) za svaki senzor tako da imas real-time adaptaciju na spoljne svetlosne uticaje i menjanje temeprature dioda i trandzi, svako citanje koje radis citas prvo bez upaljenih ledica pa sa upaljenim ledicama (ti sada uvek citas sa upaljenim ledicama), ono sto procitas bez upaljenih ledica stavljas kao ambient noise pa tek kad upalis ledice racunas na ono iznad etc etc .. izlaz iz citanja trandzi treba da ti bude niz nula i jedinica, tj svaki senzor vraca nula ili jedan, ne 0-1024 a onda racunas pid u odnosu na to koliko ti je pobegla linija od centra

dakle "komplikaciju" pravis tako sto poboljsas kako sprava radi, ne tako sto bez razloga komplikujes proste stvari :D, follower se pravi sa 4 diode i 2 komparatora i 2 tranzistora - ti ovde imas mikrokontroler :)

nadam se da sam bio jasan ..
 
Odgovor na temu

nikolapirot
Student
Srbija Pirot

Član broj: 235367
Poruke: 239
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: Pracenje linije problem sa kontrolerom12.08.2014. u 14:11 - pre 117 meseci
Napisao sam progaram kao sto si preporucio. Ali pojavio se sledeci problem. Sada prepoznaje liniju al je bas ne prati lepo. Kada sam stavio robota na liniju u pomerao je po njoj video sam da kad stavim na jednu stranu senzora upali se taj tocak koji treba, ali kad pomeram prema drugoj strani nece da se upali drugi tocak, nego tek kad predjem ceo senzor po sirini linije pa kad krenem da vracam onda se ukljuci taj tocak koji treba. Malo sam konfuzno objasnio pa cu da probam ovako. Senzori su naprimer ovako postavljeni 1 2 3 4 5. Kada dodje linija ispod senzora 1 upali se desni tocak kao sto treba. Kad linija krene da prelazi redom preko senzora do petog i dalje je ukljucen desni. Kad linija nije vise ispod senzora pa krenem da vracam i cim peti senzor vidi liniju tek tad se upali levi tocak. Zbog cega se ovo desava?
Code:
char i;
signed int senzor[5],senzorcal[5][2],tresh[5],senzor1=0,distance1=0,PWM,Pp=3,Ii=5,Dd=5,distancelast=0,distancesum=0;

void Treshold ()    //u svakom ciklusu se trazi da li postoji manja ili veca vresdnost od do sada min i max
                    //i racuna se treshold
{
   senzor1=0;
   for(i=0;i<5;i++)
   {
      if(senzorcal[i][0]>senzor[i])
      {
      senzorcal[i][0]=senzor[i];
      }
      if(senzorcal[i][1]<senzor[i])
      {
      senzorcal[i][1]=senzor[i];
      }
      tresh[i]=((senzorcal[i][1]-senzorcal[i][0])/2)+senzorcal[i][0];
      if(senzor[i]<tresh[i])
      {
      senzor[i]=0;
      }
      else
      {
      senzor[i]=1;
      }
      senzor1=(senzor[i] << i) + senzor1; //postavljanje svih pet senzora u jedan registar
   }
}
void Position()   //odredjivanje pozicije
{
      switch (senzor1)
      {
      case 16: distance1=20;break;
      case 24: distance1=15;break;
      case 8: distance1=10;break;
      case 12:distance1=5;break;
      case 4:distance1=0;break;
      case 6:distance1=-5;break;
      case 2:distance1=-10;break;
      case 3:distance1=-15;break;
      case 1:distance1=-20;break;
      default: distance1=50;break;
      }
}
void Motori()     //paljenje motora
{
    if(distance1!=50)
    {
      if(distance1==0)
      {
         PORTC.RC3=0;
         PORTC.RC2=0 ;
         PWM1_Set_Duty(200);
         distancesum=0;
      }
      if(distance1<0)
      {
         PORTC.RC3=1;
         PORTC.RC2=0;
         distance1= abs(distance1);
      }
      else
      if(distance1>0)
      {
        PORTC.RC3=0;
        PORTC.RC2=1;
      }
      PWM=Pp*distance1+Dd*(distance1-distancelast)+Ii*distancesum;
      if(PWM>255)
      PWM=255;
      if(PWM<0)
      PWM=0;
      distancelast=distance1;
      distancesum=distancesum+distance1;
    }
}
void ADConversion()
{
    for(i=0;i<3;i++)
    {
    senzor[i] = ADC_Get_Sample(i);
    Delay_us(20);
    }
    for(i=4;i<6;i++)
    {
    senzor[i-1] = ADC_Get_Sample(i);
    Delay_us(20);
    }

}

void main() {
             TRISA=0b00000111;
             TRISC=0b00000011;
             ANSEL=0b00110111;
             ADC_Init();
             PORTC.RC5=0;
             PORTC.RC3=0;
             PORTC.RC2=0;
             PORTC.RC4=1;
             Delay_Ms(100);
            ADConversion();
             for(i=0;i<5;i++)
             {
               senzorcal[i][0]=senzor[i];    // postavljanje jedne iste vrednosti kao max i min
               senzorcal[i][1]=senzor[i];    //
             }
             PWM1_Init(1000);
             PWM1_Set_Duty(200);
             PWM1_Start();
             
             while(1)
             {
                ADConversion();
                Treshold();
                Position();
                Motori();
                Delay_Ms(30);
             }

}
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: Pracenje linije problem sa kontrolerom12.08.2014. u 16:56 - pre 117 meseci
ja vidim ovde nekoliko problema (osim toga sto nikako da naucis da indentujes kod) .. Treshold procedura je ok. u setapu imas problem sto ti ledice uvek svetle, trebao si ledice preko nekog feta da mozes (sve zajedno) ledice da ugasis i upalis pa da radis citanje sa ugasenim i upaljenim ledicama no ok preziveces i ovako ... drugi problem je sto ti koristis jedan ccp izlaz za oba motora pa onda radis enable/disable jednog ili oba motora .. zasto? zasto nisi iskoristio 2 ccp izlaza i vozio svaki motor svojim pwm-om? na taj nacin mozes da biras kojom ces brzinom da ides u stranu .. ako vec gubis vreme da pravis pid onda si mogao i oko toga da se iscimas ... position .. sta ako imas 7 kao rezultat adc-a? tj da se vidi i na 1 i na 2 i na 4? debela linija .. sta ako ti je linija debela da pokriva SVE senzore .. dobijes 63? u svakom slucaju problem ti je i Motori() ... to si potpuno ukonfuzio .. evo ti primer kako bih ja odradio position i motori() sa pid-om

Code:

char i;
signed int senzor[5],senzorcal[5][2],tresh[5],senzor1=0,distance1=0,PWM,Pp=3,Ii=5,Dd=5,distancelast=0,distancesum=0;
float temp;

//u svakom ciklusu se trazi da li postoji manja ili veca vresdnost od do sada min i max
//i racuna se treshold
void Treshold (){    
  senzor1 = 0;
  for(i=0; i<5; i++){
    if(senzorcal[i][0] > senzor[i]) senzorcal[i][0] = senzor[i];
    if(senzorcal[i][1] < senzor[i]) senzorcal[i][1] = senzor[i];
    tresh[i] = ((senzorcal[i][1]-senzorcal[i][0])/2)+senzorcal[i][0];
    if(senzor[i] < tresh[i]){
      senzor[i] = 0;
    }  else  {
      senzor[i] = 1;
    }
    senzor1 |= senzor[i] << i; //postavljanje svih pet senzora u jedan registar
  }
}

void Position(){   //odredjivanje pozicije
  distance = 0;
  if ( senzor1 & 0b00000001 ) distance -= 20;
  if ( senzor1 & 0b00000010 ) distance -= 10;
  if ( senzor1 & 0b00001000 ) distance += 10;
  if ( senzor1 & 0b00010000 ) distance += 20;
}

#define pKoeficijent 0.5F
#define iKoeficijent 0.2F
#define dKoeficijent 0.1F
#define minPWM       0
#define maxPWM       255

void Motori(){
  static float iTerm = 0;
  static signed char stariDist=0;

  iTerm += iKoeficijent * distance1; // distance1 == vrednost greske posto nam je target 0
  if (iTerm > maxPWM) iTerm = maxPWM;
  if (iTerm < minPWM) iTerm = minPWM;
  //pTerm = pKoeficijent * (distance - stariDist);
  //dTerm = dKoeficijent * (stariDist - distance1);
  temp = pKoeficijent * (distance - stariDist) + iTerm + dKoeficijent * (stariDist - distance1);
  PWM1_Set_Duty(abs((int)temp));

  stariDist = distance1;  
  if(temp == 0){
     PORTC.RC3=0;
     PORTC.RC2=0;
     PWM1_Set_Duty(maxPWM); // full speed ahead
  } else if(temp < 0){
     PORTC.RC3=1;
     PORTC.RC2=0;
   } else {
     PORTC.RC3=0;
     PORTC.RC2=1;
   }
}

void ADConversion(){
  for(i=0;i<3;i++){
    senzor[i] = ADC_Get_Sample(i);
    Delay_us(20);
  }
  for(i=4;i<6;i++){
    senzor[i-1] = ADC_Get_Sample(i);
    Delay_us(20);
  }
}

void main() {
  TRISA=0b00000111;
  TRISC=0b00000011;
  ANSEL=0b00110111;
  ADC_Init();
  PORTC.RC5=0;
  PORTC.RC3=0;
  PORTC.RC2=0;
  PORTC.RC4=1;
  Delay_Ms(100);
  ADConversion();
  for(i=0;i<5;i++){
    senzorcal[i][0]=senzor[i];    // postavljanje jedne iste vrednosti kao max i min
    senzorcal[i][1]=senzor[i];    //
  }
  PWM1_Init(1000);
  PWM1_Set_Duty(200);
  PWM1_Start();
  while(1){
    ADConversion();
    Treshold();
    Position();
    Motori();
    Delay_Ms(100); // i 100ms je prekratko za bilo kakav PID koji ima smisla
  }
}



 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: Pracenje linije problem sa kontrolerom12.08.2014. u 16:58 - pre 117 meseci
ono sto ti u mom kodu fali je "sta ako nijedan senzor ne vidi liniju" - u tom slucaju treba da iskljucis pid i ukljucis "search pattern", takodje "sta ako svi senzori vide liniju" da li je to normalna ili ne situacija.. etc ..
 
Odgovor na temu

nikolapirot
Student
Srbija Pirot

Član broj: 235367
Poruke: 239
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: Pracenje linije problem sa kontrolerom14.08.2014. u 13:08 - pre 117 meseci
Pokusao sam tako, kao sto si napisao, ali ovaj deo position ne radi najbolje jer kad se pojavi jedinica npr na prvom i trecem, jer je negde papir malo izguzvan on se pogubi skroz, tako da sam vratio na switch case. Ovo za motore sam usvojio tvoje. E sad posto sam vec poceo da ludim sto nece da radi uzeo sam da se igram sa senzorima da vidim kako se ponasa jer na papiru i ne bas najbolje. Pokusavao sam i sa tvojom idejom i sa mojom za position. Primetio sam da u oba slucaja kad senzore okrenem na gore nikako ne mogu da dobijem da robot ide pravo uvek se pali RC3. To radim tako sto prevlacim crni objekat preko fotoranzistora. Kad nastavim da prevlacim prema delu gde treba da radi RC3(tj motor koji ukljucuje RC3), on radi. E sad kad pocnem da prevlacim prema delu gde treba da radi RC2, u pocetku ne radi, i onda sam primetio da kad dodjem do prvog senzora gde treba da radi rc2, i ako drzim tu objekat nekih 1-1,5sec onda tek pocne da radi rc2. Naravno kad simuliram u mikroC sve funkcionise super. Zasto se ovo dogadja?
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: Pracenje linije problem sa kontrolerom14.08.2014. u 14:19 - pre 117 meseci
za position je otpornije ovako kako sam ja napisao, bas zbog toga, kod tebe ako se pojavi na prvom i trecem ti uopste ne znas sta da radi

Citat:

E sad kad pocnem da prevlacim prema delu gde treba da radi RC2, u pocetku ne radi, i onda sam primetio da kad dodjem do prvog senzora gde treba da radi rc2, i ako drzim tu objekat nekih 1-1,5sec onda tek pocne da radi rc2. Naravno kad simuliram u mikroC sve funkcionise super. Zasto se ovo dogadja?


nisam bas skroz siguran da sam razumeo problem ali mislim da imas problem sa citanjem adc-a. to je jedan od razloga sto ja vise ne trosim mikroC nigde jer su im zatvorene biblioteke i ti sad treba da gadjas u pasulj sta tacno rade .. na picu pre nego radis promenu kanala koji citas moras da imas neki delay da se isprazni onaj sample and hold kondenzator inace ti prethodno citanje utice na to sto citas tako da iako ti treba da procitas neku nisku vrednost on ti cita mnogo vecu zato sto je ostao pun kond od prethodnog citanja ..


mozes da probas nesto ovako

Code:

void ADConversion(){
  unsigned int temp;
  unsigned char j;

  for(i=0;i<5;i++){
    temp = i > 3 ? ADC_Get_Sample(i+1) : ADC_Get_Sample(i);
    Delay_ms(10);

    temp=0;
    for(j=0;j<16;j++){
      temp += i > 3 ? ADC_Get_Sample(i+1) : ADC_Get_Sample(i);
      Delay_us(20);
    }
    senzor[i] = temp >> 2;    
  }
}


znaci umesto da citas svaki senzor jednom, procitas ga 16 puta za redom pa uzmes srednju vrednost.
a pre nego krenes uopste da citas senzor procitas ga jednom (rezultat bacis) i sacekas 10ms da sigurno prodje potrebni delay

sad, jbg uzeo si cip sa malo pinova, bilo bi iskusno da imas 5 ledica da mozes da prikazes vrednost koja ti izlazi iz Treshold() funkcije svaki put kad se ista zavrsi ..

 
Odgovor na temu

[es] :: Elektronika :: Mikrokontroleri :: Pracenje linije problem sa kontrolerom

[ Pregleda: 2893 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.