Sari la conținut
ELFORUM - Forumul electronistilor

Problema conversie A/D multipla cu PIC16F690


Vizitator Bogdan3l89

Postări Recomandate

Vizitator Bogdan3l89

Salut !!! Vreau sa comand 4 servomotoare cu ajutorul unui microcontroller PIC16F690. Semnalele de comanda pentru cele 4 servomotoare sunt independente unele fata de altele si provin de la 4 potentiometre (de fapt sunt doua joystick-uri de la un playstation2, fiecare avand cate doua potentiometre montate unul pe verticala si unul pe orizontala). Conversia analog-numerica se realizeaza succesiv pe 4 canale (selectare canal1 A/D, pornire conversie, obtinere rezultat, memorare rezultat , selectare canal2 A/D s.a.). Daca folosesc un singur canal A/D pentru comanda unui singur servomotor, totul pare sa fie in regula...daca vreau sa fac conversie succesiva pe toate cele 4 canale, canalele par sa se interfereze intre ele (viteza de rotatie a servomotoarelor incepe sa fie sacadata iar frecventa cu care se esantioneaza semnalul analogic pare sa scada). Am incercat sa citesc date legate de convertorul A/D din foaia de catalog a PIC-ului si am vazut ca dupa fiecare selectie a unui canal A/D trebuie introdusa o temporizare , care sa permita condesatorului corespunzator semnalului extern convertit sa se incarce. Am facut si chestia asta (am facut temporizari de pana la 2 ms)...degeaba. Nu pot sa-mi dau seama ce poate sa aiba. Voi atasa topicului si fisierul cu, codul programului. Orice sugestie este mai mult decat binevenita. Va multumesc !

cod.txt

Link spre comentariu
  • Răspunsuri 8
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • 10vid

    2

  • lama

    2

  • Liviu M

    1

Top autori în acest subiect

eu citesc 2 adc intrun proiect.nu vad la tine pornirea cinvertoruluiADON=1; // turn on the A2D conversion moduleapoi cind sa fac a doua citire eu opresc ADON, schimb canalul si fac citireasi merge(vezi mai jos)//setez pe AN3 ca sa citesc amperiiADON=0;__delay_ms(1);ADCON0=0b10001100; // select right justify result. ADC port channel AN3ADFM = 1; // right justify resultVCFG = 0; // VDD reference voltageADON=1;

Link spre comentariu
Vizitator Bogdan3l89

@lama Pornirea convertorului A/D o fac odata cu initializarea registrului ADCON0. Adica pun bitul 0 al registrului pe 1 (bitul 0 adica bitul cel mai putin semnificativ, este bitul de pornire a conversiei ADON). Totusi ideea ta nu e rea...dar am incercat-o si tot degeaba. Am incercat sa introduc si temporizari...fara nici un rezultat. Servomotoarele merg; insa se misca foarte sacadat.Alte sugestii ?

Link spre comentariu

Poate ca atat poate PIC-ul tau. Spre deosebire de 1 motor, cand le controlezi pe toate 4 ti se multiplica de 4 ori timpii de asteptare in diverse if-uri. Plus ca, din cate-mi iese mie, semnalul PWM are factorul de umplere destul de mic - 1 ms on/80 off.

Link spre comentariu

@lama Pornirea convertorului A/D o fac odata cu initializarea registrului ADCON0. Adica pun bitul 0 al registrului pe 1 (bitul 0 adica bitul cel mai putin semnificativ, este bitul de pornire a conversiei ADON). Totusi ideea ta nu e rea...dar am incercat-o si tot degeaba. Am incercat sa introduc si temporizari...fara nici un rezultat. Servomotoarele merg; insa se misca foarte sacadat.Alte sugestii ?

Eu prefer sa nu il initializez odata cu ADCON. setez totul si cand am nevoie ii dau enable.
Link spre comentariu

Ai pus toate motoarele intr-o bucla si astfel toate delay-urile se adauga, rezultand un factor de umplere foarte mic per motor, asa cum a spus Liviu. De exemplu, daca primul motor are PWM 50%, al doilea 0% etc.:1) 50/502) 0/1003) 20/804) 60/40se vede ca pana sa-i vina din nou randul motorului 1, se asteapta si prin delay-urile de la celelalte motoare.Astfel, rezulta un PWM la motorul 1 de 50on/350off, adica 12.5%. Similar se altereaza PWM-ul si la celelalte motoare.Trebuie suprapusi timpii.Un ciclu PWM sa arate asa:Initial toate cele 4 iesiri = 0.Se face un ciclu FOR i de la 1 la 255.In el se baga un delay de 70us.Tot in acel FOR se baga 4 IF-uri care compara cele 4 citiri ADC cu i, daca i

Link spre comentariu
Vizitator Bogdan3l89

@10vid Ce rol are temporizarea de 70us din interiorul buclei FOR ??? Cele 4 IF-uri din interiorul buclei FOR nu vor altera si ele semnalul PWM ???

Link spre comentariu

IF-urile nu dureaza decat vreoi 5us, in cel mai bun caz 2us. Fara IF-uri nu se pot lua decizii, si va trebui sa ai hardware dedicat pentru cele 4 canale PWM.

 

Delay-ul de 70us e unitatea de masura a umplerii (si a perioadei) PWM. In realitate, o incrementare de i dureaza vreo 90us, daca adaugam si cele 4 IF-uri.

 

Posted Image

 

De exemplu, pentru o umplere de 50%, cand i ajunge la 128 (128 x 90us = 11.5ms), IF-ul respectiv inchide pinul.

Iar frecventa PWM va fi in jur de 44Hz.

Link spre comentariu

Când ai de implementat multe canale DAC cu PWM, cel mai bine e să renunţi la PWM şi să foloseşti conversia Sigma-Delta.

 

Uite un exemplu care înlocuieşte nu 4, ci 10 canale PWM: viewtopic.php?f=39&t=118106&p=1040709

Partea care face conversia este foarte simplă,

// Sigma delta modulation algorithm using "synthetic division"      sum[n] += req[n];      // Update integrator value      if (sum[n] < max[n])         outBits++;         // LSB = 1      else         sum[n] -= max[n];   // LSB = 0 (untouched) and adjust integrator   }
restul codului (din link-ul dat) fiind doar pentru a face jocuri de culori.
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