Jump to content
ELFORUM - Forumul electronistilor

Problema conversie A/D multipla cu PIC16F690


Guest Bogdan3l89

Recommended Posts

Guest 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 to comment
  • Replies 8
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

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 to comment
Guest 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 to comment

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 to comment

@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 to comment

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 to comment
Guest 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 to comment

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 to comment

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 to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines