Vizitator utopic Postat Aprilie 9, 2010 Partajează Postat Aprilie 9, 2010 Buna tuturor. Din nou intampin o problema....am nevoie de mai multe canale pwm, cred ca intre 4 si 8 (pic-ul meu are 2, si oricum is ocupate...nu mai vreau sa refac schema). Cum pot genera prin software aceste canale. Pentru inceput o sa le testez pe leduri urmand sa fie folosite pt niste motoare. Eu lucrez in CCS in C evident.Daca cineva dintre d-voastra a mai facut asa ceva sau are idei, astept eventualele sugestii, sau rutine. Va multumesc anticipat. Link spre comentariu
puiu Postat Aprilie 9, 2010 Partajează Postat Aprilie 9, 2010 1. Sa faci canale PWM in soft nu este o problema, problema este ca vrei sa faci 4 sau 8 canale si nu dai amanunte daca sunt sau nu canalele idependente si daca PWM are o frecventa relativ mica, pentru ca iti trebuie timp ca sa calculezi cele 8 canale si sa ti minte unde esti. Pentru o frecventa mica s-ar putea sa mearga, depinde la ce vrei sa folosesti canalele PWM.2. Din pacate eu lucrez in ASM si nu te pot ajuta numai cu sfaturi, dar se poate sa te ajute unul care stie C bine. Link spre comentariu
Vizitator utopic Postat Aprilie 9, 2010 Partajează Postat Aprilie 9, 2010 Da, canalele vor fi identice. In rest nu prea stiu alte detalii. Pwm-urile le voi folosii la motoare de putere destul de mare , dar cu certitudine cele 4/8 canale vor fi identice. Link spre comentariu
puiu Postat Aprilie 9, 2010 Partajează Postat Aprilie 9, 2010 1. Nu in sensul ca sunt identice ca realizare, ci ma refeream daca comenzile date pe acele canale vor fi identice in acelasi timp, adica daca pentru fiecare canal trebuie sa calculezi momentul in care se afla canalul respectiv sau poti sa faci un singur calcul pentru mai multe canale de iesire. 2. Cu cat frecventa e mai joasa se complica hardul pentru transformarea PWM in tensiune continua.3. Cred ca fara schema va fi greu sa faci softul respectiv. Link spre comentariu
Vizitator utopic Postat Aprilie 9, 2010 Partajează Postat Aprilie 9, 2010 hmmm....nush daca vor fi identice in acelasi timp....presupun ca nu.Frecventa .... de asemenea nu stiu exact daca o sa fie foarte mica :)Schema o am sa zicem....adica e un soft complex, si o mica parte e comandarea motoarelor...pt. astea am 8 pini liberi....la ei am legate 8 leduri momentan.In prima faza vreau doar sa fac LED Dimming utilizand PWM, modificat duty cycle-ul si cam atat. Pt. ca nici eu nu stiu inca mai multe.Eu n-am facut niciodata PWM software si de aceea vreau sa vad mai intai ceva ce credeam ca e simplu...LED Dimming.De aceea momentan vreau o secventa cat mai simpla in C (ma rog ...pseudocod sau ceva inteligibil, si eu eram fan asm, dar acum mi-e foarte greu sa inteleg dupa ce lucrez de atata timp in C). Oricum in lipsa de nimic merge si asm....poate poate reusesc sa-l traduc.O secventa din care sa inteleg. Voi folosii timer 0 pt. a-mi da intreruperile necesare. Oricum sunt destul de in ceata... Link spre comentariu
Vizitator yo9hnh Postat Aprilie 10, 2010 Partajează Postat Aprilie 10, 2010 portb=255delay_ms(5)portb=0delay_ms(5)T total este de 10msFrecventa F=1/0.01 => 100HzD(duty cycle)=Ton/Total => D=5/10 => D=0.5Vout(tensiunea de iesire) = D x Vin(tensiunea de intrare sau de alimentare a picului) => Vout = 0.5 x 5 = 2.5 VSper ca te ajuta intr-un fel Link spre comentariu
puiu Postat Aprilie 10, 2010 Partajează Postat Aprilie 10, 2010 1. De fapt frecventa este mult mai mare deoarece trebuie sa calculezi duty cycle pentru fiecare iesire, adica 16. Ca sa lucrezi cu 100 Hz pe fiecare trebuie sa lucrezi cu 16x100 Hz la care trebuie sa stabilesti si rezolutia cu care vrei sa faci duty cycle. Deci vei fi foarte ingramadit ca soft.2. Considera ca eu sunt Gigi contra, dar trebuie sa elucidezi toate aspectele inante de a te apuca de soft. Deci timpul pentru calculare este mai mic decat 16x100xrezolutia duty cycle.Pentru o rezolutie de 256 rezulta 16x100x256 Hz durata pentru calcul si pentru simplificare se poate considera ca toate cele 16 PWM isi incep ciclu in acelasi timp. Trebuie tinut cont de acest lucru pentru ca intrarile care comanda aceste PWM nu sunt sincrone cu procesorul nostru. Link spre comentariu
Liviu M Postat Aprilie 10, 2010 Partajează Postat Aprilie 10, 2010 Cred ca cel mai bine dai mai multe date despre aplicatie (motoarele pe care vrei sa le comanzi). Pentru ca daca sunt cate de cat "sincron" si "in faza", lucrurile pot fi mai simple; daca sunt complet independente, sunt sanse sa fie mai complicat. De exemplu, daca vrei sa comazi punti H (fiecare tranzistor al puntii cu comanda lui), atunci in afara de factorul de umplere si frecventa semnalelor de comanda, trebuie sa mai ai grija si de succesiunea lor, a.i. sa nu conduca ambii tranzistori de pe o ramura in acelasi timp, ca ii arzi (asta mai mult referitor la exemplul lui yo9hnh, care comanda toate iesirile in acelasi timp). Asa ca, repet, da mai multe detalii despre aplicatie. Link spre comentariu
Vizitator utopic Postat Aprilie 10, 2010 Partajează Postat Aprilie 10, 2010 Incerc sa dau mai multe detalii....deocamdata nu stiu nici eu prea multe. Da, motoarele or sa fie in punte H. Viteza lor se doreste a fi comandata prin modificarea duty cycleului. Eu sunt mai mult programator, cu partea de electronica nu stau extraordinar de bine. Nush prea multe inca despre motoare, ci doar ca or sa fie in punte H si or sa fie cam 4 (poate chiar mai multe pana la maxim 8). Eu o sa am o intrerupere de la timer0. Bun....am construit codul de mai jos acum, asa din ce am inteles dar nu prea cred ca e ok... Il postez totusi pt. a avea ceva pe ce sa discutam. unsigned int8 tmrTmr=0;unsigned int8 dutycycle0=64;unsigned int8 dutycycle1=128;#int_timer0 void clock_isr(){ tmrTmr++; if (tmrTmr >= 256) tmrTmr=0; if(tmrTmr<dutycyle0) output_high(PIN_A0); if(tmrTmr<dutycycle1) output_high(PIN_A1);}void main (void){ setup_timer_0(RTCC_INTERNAL | RTCC_DIV_128 | RTCC_8_BIT); set_timer0(0); enable_interrupts(GLOBAL); enable_interrupts(INT_TIMER0); output_low(PIN_A0); output_low(PIN_A1);} Link spre comentariu
puiu Postat Aprilie 10, 2010 Partajează Postat Aprilie 10, 2010 1. Inteleg ca ai maxim 8 motoare care trebuie sa le comanzi in schema H.2. Nu cumva se poate pune o conditie: ca numarul motoarelor care actioneaza simultan, la viteze diferite, sa fie maxim 2? Daca numarul motoarelor care sunt comandate simultan la tensiuni diferite de zero volti este mai mic, este mai usor de facut softul.3. Nu poti ca fiecare motor sa fie supravegheat de un microcontroler si toate sa fie supravegheate de un alt procesor? Stiu ca aceasta schema este mai scumpa, dar in caz de scurtcicuit poate sa anuleze comenzile la tranzistoare, etc., ea fiind o varianta foarte rapida si poate sa controleze in timp real inclusiv curentul absorbit. Ai sa vezi ca pentru acest lucru se foloseste un comparator tocmai pentru a reduce acest timp. In cazul in care mergi pe aceasta schema as recomanda familia PIC18F.... care au sistem CAN de comunicatie si ECCP pentru comanda tranzistoarelor din schema H. Link spre comentariu
Liviu M Postat Aprilie 10, 2010 Partajează Postat Aprilie 10, 2010 Incerc sa dau mai multe detalii....deocamdata nu stiu nici eu prea multe.Nush prea multe inca despre motoare, ci doar ca or sa fie in punte H si or sa fie cam 4 (poate chiar mai multe pana la maxim 8).Atata timp cat nu ai o schema si nu ai idee ce vrei sa faci, o sa fie destul de greu sa-ti raspunda cineva cu altceva in afara de idei generale. am construit codul de mai jos acum, asa din ce am inteles dar nu prea cred ca e ok... unsigned int8 tmrTmr=0;#int_timer0 void clock_isr(){ tmrTmr++; if (tmrTmr >= 256) tmrTmr=0;... Nestiind pana la urma cum vrei sa functioneze circuitul (cine decide factorul de umplere (duty cycle), ce alte cerinte mai ai), referitor la cod eu am o singura observatie.Daca inteleg bine (nu cunosc CCS), int8 e pe 8 biti => unsigned int8 ia valori intre 0 si 255. Asa ca if(tmrTmr >= 256) n-o sa fie niciodata adevarat. Eu as faceunsigned int8 tmrTmr=0;#int_timer0 void clock_isr(){ if (tmrTmr == 255) tmrTmr=0; else tmrTmr++;... Link spre comentariu
Vizitator utopic Postat Aprilie 11, 2010 Partajează Postat Aprilie 11, 2010 @Liviu da, ai dreptate, 255 e pragul.@puiu din pacate pct. 3 cade cel putin acum...ar fi ultima solutie.conditia aia....o sa poata fi pusa in anumite cazuri(aplicatia va rula in diverse situatii....trebuie sa ofere atat de multe canale pt a avea minimul de modificat pt. fiecare situatie in parte ) in unele cazuri se vor comanda 1 sau 2 motoare.Oricum, e ok codul pt. LED Dimming?Pentru motoare stiu ca nu e ok....nici macar n-am incercat sa testez pe ce canal ma aflu de fiecare data....E doar pt. a vedea ca fucntioneaza in principiu. Pentru motoare de marti incep lucrul. Link spre comentariu
puiu Postat Aprilie 11, 2010 Partajează Postat Aprilie 11, 2010 1. Solutia data la punctul 3 este cea mai elestica solutie de adaptare la oricate motoare deoarece nu trebuie refacut softul de comanda al motorului iar transmisia CAN are o serie de afantaje inclusiv ca poate da comanda la toate motoarele odata, indifernt cate sunt in realitate (numarul maxim trebuie sa fie sub 128). 2. Am inteles reticenta fata de acest sistem dar s-ar putea sa ajungi la el cand ai sa vezi toate limitarile care ti le pun mai multe canale pe un singur procesor. Oricum ar trebui mai multe detalii despre ce vrei sa faci. Link spre comentariu
Vizitator utopic Postat Aprilie 16, 2010 Partajează Postat Aprilie 16, 2010 Salut din nou. Dle puiu sa stiti ca pana la urma cred ca voi apela la metoda indicata de d-vastra putin modificata. Adica PIC-ul central va comanda celelalte picuri(1 per motor) prin serial.Acum problema este un pic penibila dar eu nu inteleg ceva:Placuta mea are un oscilator de 20MHz. Dar daca folosesc RTCC_INTERNAL la setarea timerului0 atunci banuiesc ca se va folosii oscilatorul intern. Care nu stiu cat este in cazul pic18f452 )- 4 MHz - 10 MHz osc./clock input with PLL active - din datasheetEste 4MHz banuiesc, nu? (si 10MHz daca PPL-ul este activ?)Bun. Daca este 4Mhz (si daca nu cumva se foloseste totusi 20MHz pt ca am incercat si cu RTCC_EXT_L_TO_H si cu RTCC_EXT_H_TO_L in loc de RTCC_INTERNA si nu merge deloc) atunci frecventa este de 4Mhz/4/128(predizivorul) =>7812,5 Hz?Mentionez ca oscilatorul e pe 8 BIT. Link spre comentariu
Liviu M Postat Aprilie 16, 2010 Partajează Postat Aprilie 16, 2010 Pai daca ai oscilatorul de 20MHz, programezi PIC-ul sa functioneze la acea frecventa (HS, vezi sectiunea corespunzatoare in Data Sheet). Daca ai si PLL activat, frecventa interna e de 4 ori frecventa oscilatorului; cum frecventa interna maxima data in Data Sheet e 40Mhz, => PLL-ul poti sa-l folosesti cu oscilatoare de pana la 10MHz.Frecvanta pare calculata OK. 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