Liviu M Postat Aprilie 27, 2011 Partajează Postat Aprilie 27, 2011 N-am folosit niciodata PWM-ul, asa ca in continuare doar presupun. Din data sheet nu ma prind daca duty cycle e procent din perioada sau valoare absoluta. Daca e ultima varianta, sunt sanse sa ai probleme din cauza ca e mai mare decat perioada. Cel putin mie asa-mi da: - perioada = 0xA*4*Tosc*TMR2 = 40*M - duty_cycle = (0x16<<2 + 0)*Tosc*TMR2 = 88*M, unde M=multiplicator, acelasi pentru ambele=Tosc*TMR2. Sugestie: incearca cu un duty-cycle (mult) mai mic. Mai ai o problema la CCP1CON=0x4C; unde programezi un 1 pentru un bit neutilizat (bitul din 4 e bit6). Link spre comentariu
francezu Postat Aprilie 27, 2011 Partajează Postat Aprilie 27, 2011 E corect ce spune Liviu M , ai setat duty cycle prea mare, in cazul asta pinul CCP1 nu comuta, ramane mereu 1 logic. Din datasheet: 1)PWM Period = [(PR2) + 1] • 4 • TOSC •(TMR2 Prescale Value) 2)PWM Duty Cycle =(CCPR1L:CCP1CON<5:4>) •TOSC • (TMR2 Prescale Value) Egaland perioada cu duty cycle se obtine CCP1L:CCP1CON<5:4> maxim : CCPR1L:CCP1CON<5:4> =(PR2 + 1)*4 = (10+1)*4=44 = b'0000101100' deci: CCPR1L=b'00001011' = 11 CCP1CON<5:4>= b'00' = 0 In alta ordine de idei, ce compilator folosesti ? Nu are librarie pt PWM ? Link spre comentariu
moro Postat Aprilie 27, 2011 Autor Partajează Postat Aprilie 27, 2011 Folosesc mikro C, am incercat si cu ce are prin librariile sale legat de pwm si acelasi rezultat, momentan numa ce am ajuns de la servici. O sa vad maine. Va tin la curent ! Link spre comentariu
moro Postat Aprilie 28, 2011 Autor Partajează Postat Aprilie 28, 2011 Am revenit, din pacate cu aceasi dezamagire, am atasat totusi cateva pagini dintr-o carte unde am gasit un exemplu clar de setare in pwm mode, ba chiar am facut ca la prosti mota`mo, am verificat adresele si registrii daca corespund cu ce microcontroler am eu (in carte era vorba de 18F452). Am incercat sa micsorez dutycycle, o sa iau referinta exemplul acela unde perioada este 44uS, in carte era 22us (50%) dutycycle, am incercat sa pun perioada pentru dutycycle si acelasi rezultat 0. In simulator vad ca starea pinului CCP1 sta tot timpul in 0 logic, am incercat chiar cu un rezistor de pull-up la +5V sa vad ce se intampla, nu e nici high nici low iesirea lui CCP1 void main() { T2CON=0x05; // (00000101) timer 2 ON si prescaler la 4 PR2=0x0A; CCPR1L= 0x0A; // 00001010 TRISC=0; // seteaza portulc iesire digitala PORTC=0xFF; CCP1CON=0x0C; // (00001100) setup CCP1 for pwm mode /*PORTC = 0; TRISC=0; PWM1_Init(5000); PWM1_Start(); PWM1_Set_Duty(192); */ } francezu am incercat si cu ce avea el prin librarie, am gasit ceva acolo care pana la urma l-am lasat in /* */. Tot la fel face, nu reactioneaza deloc, ma gandisem ca o fi ceva de la soft, dar nu. Am scris si microcontrolerul si acelasi rezultat si pe hardware :-? Link spre comentariu
pegas Postat Aprilie 28, 2011 Partajează Postat Aprilie 28, 2011 cateva observatii: 1. de ce ai pus ceva in CCP1PRL? nu ziceai ca lucrezi cu modulul 2? 2. eu lucrez in asm, nu c, si conteaza aici in ce bank sunt. de ex. trisc si portc sunt in bankuri diferite si tu nu le schimbi nicaieri. 3. nu am lucrat cu PWM, ma uit in datasheet. poate trebuie respectata exact ordinea? 8.3.3 SETUP FOR PWM OPERATION The following steps should be taken when configuring the CCP module for PWM operation: 1. Set the PWM period by writing to the PR2 register. 2. Set the PWM duty cycle by writing to the CCPR1L register and CCP1CON<5:4> bits. 3. Make the CCP1 pin an output by clearing the TRISC<2> bit. 4. Set the TMR2 prescale value and enable Timer2 by writing to T2CON. 5. Configure the CCP1 module for PWM operation. Link spre comentariu
Liviu M Postat Aprilie 28, 2011 Partajează Postat Aprilie 28, 2011 Dupa parerea mea, exemplul din carte e cam "defect".Dupa ce obtine cei 10 biti pentru dutycycle (22 zecimal, 0x16 hexa, 10110 binar) CCPR1L:CCP1CON<5:4> = 0000010110, cand ii separa in cei doi registri din care provin ii termina complet si definitiv.Daca luam cei 8 biti MSB pentru CCPR1L => CCPR1L = 00000101, si mai raman pentru CCP1CON<5:4>=10.Cu alte cuvinte:CCPR1L=0x05 siCCP1CON=0x2C. Link spre comentariu
moro Postat Aprilie 28, 2011 Autor Partajează Postat Aprilie 28, 2011 merge lool Am incercat sa iau fiecare bit si sa-l setez separat Am inlocuit T2CON=0x05; cu codul de mai jos T2CON.TMR2ON = 1; // timer 2 enableT2CON.T2CKPS1 =0; // prescale 4T2CON.T2CKPS0 =1;Vad ca acum am pwm pe CCP1, o sa ma uit maine dimineata mai atent sa vad ce se intampla pe acolo, bine macar ca am reusit enable la pwm cu toate ca nu pricep foarte bine de ce prima data nu a mers si cand am luat fiecare bit separat a mers. Multzam fain ! Link spre comentariu
pegas Postat Aprilie 28, 2011 Partajează Postat Aprilie 28, 2011 chiar daca nu prea are logica, incearca si asa: T2CON=0x5 si nu T2CON=0x05 Link spre comentariu
pegas Postat Aprilie 28, 2011 Partajează Postat Aprilie 28, 2011 ignora-mi mesajul anterior, am vazut chiar in datasheet chestii gen "0x06", deci nu e de la asta. Link spre comentariu
puiu Postat Aprilie 28, 2011 Partajează Postat Aprilie 28, 2011 8.3.3 SETUP FOR PWM OPERATIONThe following steps should be taken when configuringthe CCP module for PWM operation:1. Set the PWM period by writing to the PR2 register.2. Set the PWM duty cycle by writing to theCCPR1L register and CCP1CON<5:4> bits.3. Make the CCP1 pin an output by clearing theTRISC<2> bit.4. Set the TMR2 prescale value and enable Timer2by writing to T2CON.5. Configure the CCP1 module for PWM operationAi respectat ordinea si ce scrie aici? Link spre comentariu
moro Postat Aprilie 29, 2011 Autor Partajează Postat Aprilie 29, 2011 1. Set the PWM period by writing to the PR2 register.2. Set the PWM duty cycle by writing to theCCPR1L register and CCP1CON<5:4> bits.3. Make the CCP1 pin an output by clearing theTRISC<2> bit.4. Set the TMR2 prescale value and enable Timer2by writing to T2CON.5. Configure the CCP1 module for PWM operationDaca pun ca in pasii de mai sus nu imi functioneaza pwm-ul, dar daca inversez 4 cu 5 atunci functioneaza :-?Oricum mai trebuie sa experimentez putin cu formulele de calcul pentru frecventa, am observat ca nu pusca niste calcule cu oscilograma de pe iesire, ma refer ca timp/frecventa. O sa revin cu detalii imediat Link spre comentariu
moro Postat Aprilie 29, 2011 Autor Partajează Postat Aprilie 29, 2011 M-am tot jucat cu diferite valori pentru CCPR1L ca sa obtin diferite valori pt dutycycle, am incercat niste valori folosind un calculator de aici http://www.micro-examples.com/public/mi ... lator.html Dar de exemplu la un clock de 4MHZ cu PR2 60 si Timer2 prescale la 16 ca sa obtin un 73% duty cycle imi da acel calculator valoarea decimala 44, simulat cu 44 decimal ( 2C hex) corespund timpii in oscilograma. Eu am incercat sa fac un calculator in excel care sa ma scuteasca de calcule matematice, insa ce nu inteleg eu in datasheet'ul picului CCPR1L:CCP1CON < 5:4 > = PWM duty cycle/(TMR2PS *TOSC) Acea valoare PWM duty cycle din cate am vazut este exprimata in secunde (microsecunde) si nu stiu la care parte din perioada totala se refera? la toff sau ton? De ce intreb asta, la 1024HZ mie T = 1000 us , la un dutycycle de 73% mie imi zice ca din T, ton este 712uS si Toff 264 uS. Eu am incercat sa pun una din valorile toff si ton acolo in formula la PWM duty cycle dar nu imi da deloc valoarea decimala 44 pentru CCPR1L, imi da ori 173 ori 66 decimal. A mai intampinat cineva problema de genul? Link spre comentariu
francezu Postat Aprilie 29, 2011 Partajează Postat Aprilie 29, 2011 Eu am incercat sa fac un calculator in excel care sa ma scuteasca de calcule matematice, insa ce nu inteleg eu in datasheet'ul picului CCPR1L:CCP1CON < 5:4 > = PWM duty cycle/(TMR2PS *TOSC)Formula este corecta. Termenul din partea stanga a ecuatiei este un registru compus, pe 10 biti, care este comparat intern cu TMR2(+ 2 clock-uri) pt a determina momentul cand iesirea trebuie sa comute in 0 logic.Vezi figura 8-3 din datasheet. Registrul este format astfel: primii 8 biti provin din CCPR1L, iar ultimii 2 LSB provin din bitii 5 si 4 ai CCP1CON. Duty cycle register= CCPR1L * 4 + CCP1CON < 5:4 > ; ccpr1L se inmulteste cu 4 pt a muta bitii cu 2 pozitii spre stanga.PWM duty cycle, din partea dreapta a ecuatiei, reprezinta timpul cat iesirea trebuie sa stea in 1 logic (Ton). Link spre comentariu
moro Postat Aprilie 30, 2011 Autor Partajează Postat Aprilie 30, 2011 Daaa, chiar am incercat niste mici jonglerii cu bitii, respectiv cu primii doi biti a lui CCPR1L, am observat ca pentru valoarea decimala cum era la mine cu 173, am scos ultimii 2 biti din ccpr1l si mi-a dat 44, m-am jucat si cu alte valori si e ok. O sa incerc astazi sa implementez o decrementare/incrementare cu niste butoane sa vad ce iasa Link spre comentariu
moro Postat Mai 2, 2011 Autor Partajează Postat Mai 2, 2011 Pana la urma am reusit sa fac sa mearga si cu instructiunile pwm din libraria lui mikroc, mama daca nu m-am chinuit tot weekend-ul sa fac o incrementare/decrementare a factorului de umplere ca sa ajung in final ca avea proteus niste bube si efectiv nu vruia sa-mi execute codul, desi era scris corect. Poate ajuta pe cineva intamplarea mea, cautand pe google am dat peste asta http://www.edaboard.com/thread196923.html Am incercat sa inlocuiesc acel dll cu cel din arhiva si intradevar merge, nu mai am probleme in simulari, am atasat si eu aici acel dll bun 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