Vizitator Bogdan3l89 Postat August 2, 2012 Partajează Postat August 2, 2012 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
lama Postat August 3, 2012 Partajează Postat August 3, 2012 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 Postat August 3, 2012 Partajează Postat August 3, 2012 @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
Liviu M Postat August 3, 2012 Partajează Postat August 3, 2012 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 Postat August 4, 2012 Partajează Postat August 4, 2012 @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
10vid Postat August 4, 2012 Partajează Postat August 4, 2012 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 Postat August 5, 2012 Partajează Postat August 5, 2012 @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
10vid Postat August 5, 2012 Partajează Postat August 5, 2012 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. 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
Vizitator Postat August 5, 2012 Partajează Postat August 5, 2012 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
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