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;
}
}