Sari la conținut
ELFORUM - Forumul electronistilor

Convertor analog-numeric dsPIC30F4011


Vizitator gabosssss

Postări Recomandate

Vizitator gabosssss

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
  • Răspunsuri 3
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • cirip

    1

Top autori în acest subiect

Vizitator gabosssss

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

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

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

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări