Sari la conținut
ELFORUM - Forumul electronistilor

Fast PWM cu timer de 16bit -un sfat va rog


spinach

Postări Recomandate

  salutam,

 

Deci , 
-chipul este mega48PA , cu cristal de 20Mhz
-utilizat timer1 ,16 biti ,in regim Fast PWM , cu esire OC1A pe normal si esire OC1B pe invers 
-reglaj TOP cu OCR1A
-reglaj df cu OCR1B
 
timerul merge cam asa 
-porneste , din exterior ; utilizam o intrare pe INT0 , intrerupere-> activare timer pwm
-dupa pornire se numara un numar cicli n , un contor in program
-dupa n cicli , se opreste 
 
Cerinta ar fi :
-ca in mersul timerului , sa nu fie deranjat de program
-timpi de pornit / oprit sa fie cit mai mici
 
problema 1 - cum numarar cicli de timer pwm
 
var 1.utilizind intrerupere
          coment-intreruperea cred va deranja programul
2.utilizind flagul OCF1A
   coment-dupa utilizare , flagul trebuie sters , deci o operatie in plus
3.utilizind informatia despre starea unei esiri OC
  dar nu stiu daca se poate ca in program sa se utilizeze starea unei esiri OCR
  ;nu stiu nici cam in ce timp este disponibil in program starea de pe OC
4.Citind contorul pentru valoare de TOP
 
Problema 2 - cum oprim timerul pwm
 
var1-resetam permanent contor ; contorul fiind pe 16 biti , nu imi dau seama in cit timp se poate reseta
var2-oprim/pornim  din clock select ; se pare ca dureaza intre 1-N cicluri , N=prescalarea
var3-utilizam TSM activat [fara utilizare timer0] si scriem/stergem PSRSYNC ; aici am inteles ca se 
pastreaza starea prescalarii dar imi este neclar ce se intimpla cu contorul .
Link spre comentariu
  • Răspunsuri 36
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • nico_2010

    14

  • spinach

    13

  • ratza

    7

  • one

    3

Top autori în acest subiect

nico_2010

Prezinta aplicatia pe care vrei sa o realizezi si vei primi sfaturi.Altfel sunt doar generalitati pe care ti le poti lamuri citind DS a microcontroller-ului.

Link spre comentariu

Cel mai simplu e să foloseşti întreruperea de output compare din fast PWM şi top setat pe OCR1A (WGM1[3:0] setat pe 1111). Timerul se resetează automat imediat cum ajunge la top, adică exact cînd îţi generează întreruperea.

Link spre comentariu

Aplicatia am mentionat ; furnizeaza la exterior un semnal pwm , pe doua esiri , una pe normal , cealalta pe invers.

Mcu are folosite 5 intrari care definesc frecventa si df de la pwm .

Se numara cicli care sint facuti de timer ; dupa 10 cicli , timerul se opreste ; pornire times se face din exterior , folosind o intrerupere externa .

Link spre comentariu
nico_2010

Ca sa traduc in limba romana si pentru altii: ai definita o frecventa minima (sau maxima, nu este clar) F si un interval dF de baleiere.Doresti ca dupa 10 cicluri de baleiere timer-ul sa se opreasca, iar repornirea sa se faca dupa aplicarea unui impuls pe INT0/1. Este corecta traducerea?Daca da, unde te-ai impotmolit? Tu vrei sa primesti solutia software de-a gata, sau ai muncit ceva si intampini probleme?L.E.: Sau poate dF este o variabila care defineste factorul de umplere!?

Link spre comentariu

da ; df este prescurtare de factor umplere setat cu OCR1B .  OCR1A , va da frecventa de lucru . 

 

Eu nu vreau soft scris. 

Am nevoie de idei ; momentan inca fac proiectul .

De exemplu eu nu am folosit niciodata bitul  PSRSYNC pentru on/off timer , asta in ideia ca nu folosec timerul 0 ; ar fi mai rapid decit sa sterg permant TCNT1 ?

Link spre comentariu
nico_2010

Ca sa primesti raspunsuri trebuie sa faci experimente si acolo unde nu te descurci iti putem da sfaturi. Altfel ...Ca idee, nu am folosit niciodata bitul PSRSYNC pentru orpirea/pornirea timerelor, pentru asta folosesc combinatia de biti CSx2...0 (x=0,1 sau 2) si nu am gandit vreo aplicatie care sa ceara pornirea/oprirea simultana a Timer0 si Timer1.

Link spre comentariu

OK; am inteles . In ds scrie ca operatia de on/off cu PSRSYNC , este mult mai rapida decit cu CSuri , cind avem N >1 , deoarece la pornire timer la inceput face un numar de cicli  egal cu N

Dar daca il opresc prin stergere contor ? Adica fac TCNT1=0 , cit imi trebuie ; ce se va intimpla ?

Link spre comentariu
nico_2010

Una este sa opresti timerul (si pentru asta ai la dispozitie fie bitul PSRSYNC in registrul GTCCR, fie bitii CSx2...0 in TCCRxB), alta este sa stergi(resetezi) continutul registrilor TCNT1H/TCNT1L.Insa ceva tot nu inteleg: ce aplicatie asa pretentioasa vrei? Nu ma intereseaza decat cel mult cu titlu informativ pentru a-ti da, eu sau ceilalti colegi de forum, indicatii cat mai adecvate.Altfel, te invit frumos sa faci experimente si sa tragi concluzii singur si sa apari din nou cand ai probleme reale de implementare nu teorii izvorate din comoditatea de a nu experimenta

Link spre comentariu

Pilot pentru o baza de timp .

Ori ca il opresc , ori ca il fac tot timpul zero contorul ,dupa mintea mea , cred ca ar fi cam la fel.

 

Cind genereaza un timp de 0.2s , 2 , 3 cili nu conteaza ; dar cind genereaza un timp de 0.1us , 3 cicli=cam 33%

Editat de hspinache
Link spre comentariu

Hmmm, 100ns ... si cam ce frecventa ar trebui sa aiba quartzul? Ca daca pui 20MHz, un impuls de ceas este de 50ns (la care adaugi deriva termica a quartzului - tipic +/-20ppm) ar trebui sa contorizezi 2 impulsuri de ceas si la asta adaugi cei 12 cicli de ceas ceruti de tratarea intreruperii (cum zicea ratza) si proiectul tau - pentru un timp asa de scurt - s-a dus ...

Pentru timpi asa de scurti cauta alta solutie, nu asta.

Link spre comentariu

Nu pot folosi cristal de 20mhz; nu mai iese socoteala pentru valori mari de timp ; folosec 12 Mhz . Din calcul acopera 0.1us-0.5s

Inca nu inteleg de ce sa nu mearga pe 0.1us ; din ce am citit , am inteles ca timerul odata pornit , ruleaza , indifernt de ce se intimpla in program ; intreruperile afecteaza programul in principal .

Da , in mod sigur operatiile de pornit/oprit vor fi afectate de modalitatea de lucru ; din acesta cauza , o sa sincronizez la 10 cicluri

 

Deci , parerea vostra privind oprirea timerului : opresc prin utilizare PSRSYNC sau scriu permanent TCNT1=0  ?

Link spre comentariu

Ai inceput cu un quartz de 20MHz si acum spui ca vei folosi unul de 12MHz. E mai rau decat prima varianta si asta pt ca impulsul de ceas este de 83 ns. Timerul cu prescaler 1 va numara la fiecare 83 ns, care nu se potriveste de niciun fel cu 100ns. Si asta fara sa iei in calcul timpii pentru salt la intrerupere, tratarea continutului ei si revenirea in programul principal. Succes si sa ne arati si noua minunea

Link spre comentariu
Vizitator
Acest subiect este acum închis pentru alte răspunsuri.



×
×
  • 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