Vizitator gabosssss Postat Iunie 26, 2011 Partajează Postat Iunie 26, 2011 Buna seara. Am realizat o placuta pentru a misca un robot. Am reusit sa il misc atunci cand trimit de la tastatura pe seriala "W"-inainte, "A"-stanga, "S"-inapoi, "D"-dreapta, "X"-stop. Folosesc PWM-urile pentru miscarea servomotoarelor. Apoi am ajuns in punctul in care trebuie sa configurez ADC-ul pentru 3 senzori infrarosii (senzorii sunt TCRT5000). Am pus senzorii pe placute diferite, am reusit sa configurez ADC-ul pentru canalul CH0 pe AN0/RB0 ca atunci cand detecteaza un obstacol, robotul sa se opreasca, dar am probleme in a configura 3 canale. Programul meu functioneaza ceva de genul: initializez seriala, initializez pwm-ul, apelez initializarea ADC-ului pentru CH0, citesc apoi printr-o functie read, aplic un carry cu 2 biti la dreapta si trimit pe seriala (am nevoie de cei mai semnificativi 8 biti din cei 10 pe care ii da ADC-ul). Dupa acestea, pornesc ambele servomotoare si cu ajutorul unui if le opresc atunci cand senzorul trimite un semnal mare (in cazul meu am bagat i>200). Ma poate ajuta cineva cu o implementare pentru 3 canale? Nu ma deranjeaza prea mult daca sampling-ul s-ar face pe rand pentru fiecare senzor, robotul nu are viteza prea mare si cred ca o sa detecteze in timp obstacolele. Am incercat sa fac 3 initializari diferite, sa setez pentru celelalte canale alte intrari analogice (facandu-le in prealabil analogice), le-am facut functiile de read separate, le-am pus registrii de buffer separati (ADCBUF0-ADCBUF2), insa nu am avut rezultatele dorite.Va multumesc pentru rabdare in cazul in care ati citit toata povestea mea si va multumesc anticipat si pentru ajutor!In cazul in care doriti mai multe informatii, vi le ofer in cel mai scurt timp posibil!O seara buna! Link spre comentariu
Vizitator gabosssss Postat Iunie 26, 2011 Partajează Postat Iunie 26, 2011 Am reusit sa rezolv o mica parte din problema. Conectati pe rand, cei 3 senzori imi functioneaza. Am observat ca se foloseste un singur buffer (ADCBUF0), ceea ce cred ca e normal, din moment ce folosesc cei 3 senzori pe rand numai pe CH0. Intrebarea e:cum pot folosi fiecare senzor pe cate un canal diferit? Sa zicem pe AN0, AN1 si AN2. Va multumesc anticipat! Folosesc urmatorul cod: initserial(9600); Init_PWM(); // Initialize PWM module adc0initialise(); //adc1initialise(); //adc2initialise(); PDC1 = 2000; // PDC2 = 1000; // Pornesc ambele servomotoare pe directia inainte while(1) // Loop forever { i=adc0read(); // Citesc senzorul i = i >> 2; // Carry pentru a obtine cei mai semnificativi 8 biti DelayNmSec(100); // Delay U1TXREG=i; // Trimit inapoi pe seriala ce receptionez pe senzor if(i>200) { PDC1 = 1520; // Daca valoarea receptionata e mai mare decat 200, opresc servomotoarele PDC2 = 1515; // (s-a detectat un obstacol) } else { PDC1 = 2000; // Altfel continua drumul PDC2 = 1000; // }// Functii:// initialise ADC1 to read datavoid adc0initialise(){ TRISBbits.TRISB0=1; ADPCFG = 0xFFFE; // all PORTB = Digital; RB0 = analog ADCON1 = 0x0004; // SAMP bit = 0 ends sampling ... // and starts converting ADCHS = 0x0000; // Connect RB0/AN0 as CH0 input .. ADCSSL = 0; ADCON3 = 0x0002; // Manual Sample, Tad = internal 2 Tcy ADCON2 = 0x0000; ADCON1bits.ADON = 1; // turn ADC ON} // initialise ADC1 to read datavoid adc1initialise(){ TRISBbits.TRISB0=1; ADPCFG = 0xFFFD; // all PORTB = Digital; RB1 = analog ADCON1 = 0x0004; // SAMP bit = 0 ends sampling ... // and starts converting ADCHS = 0x0001; // Connect RB1/AN1 as CH0 input .. ADCSSL = 0; ADCON3 = 0x0002; // Manual Sample, Tad = internal 2 Tcy ADCON2 = 0x0000; ADCON1bits.ADON = 1; // turn ADC ON} // initialise ADC2 to read datavoid adc2initialise(){ TRISBbits.TRISB0=1; ADPCFG = 0xFFFB; // all PORTB = Digital; RB2 = analog ADCON1 = 0x0004; // SAMP bit = 0 ends sampling ... // and starts converting ADCHS = 0x0002; // Connect RB2/AN2 as CH0 input .. ADCSSL = 0; ADCON3 = 0x0002; // Manual Sample, Tad = internal 2 Tcy ADCON2 = 0x0000; ADCON1bits.ADON = 1; // turn ADC ON} // read adata from ADC0int adc0read(){ ADCON1bits.SAMP = 1; // start sampling ... DelayNmSec(1); // delay ADCON1bits.SAMP = 0; // start Converting while (!ADCON1bits.DONE); // conversion done? return ADCBUF0; // yes then get ADC value} Link spre comentariu
cirip Postat Iunie 27, 2011 Partajează Postat Iunie 27, 2011 Salut,Eu as incerca sa modific ADCSSL, care determina includerea canalelor in secventa de conversie. Nu cred ca este potrivit sa fie 0.M-am jucat si eu cu dsPIC si stiu ca m-am chinuit ceva pana sa ma prind cum sa configurez ADCul.Bafta! Link spre comentariu
Vizitator gabosssss Postat Iunie 27, 2011 Partajează Postat Iunie 27, 2011 Salut,Eu as incerca sa modific ADCSSL, care determina includerea canalelor in secventa de conversie. Nu cred ca este potrivit sa fie 0.M-am jucat si eu cu dsPIC si stiu ca m-am chinuit ceva pana sa ma prind cum sa configurez ADCul.Bafta!Multumesc pentru idee! O sa incerc azi in laboratorul de la facultate. Cred ca mai pierd cel putin o zi si mai am foarte putin timp.EDIT: Am observat ca in family reference manual toate exemplele contin acest ADCSSL egal cu 0.. 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