Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Kako da napravim uredjaj koji generise zadatu povorku impulsa?

[es] :: Elektronika :: Mikrokontroleri :: Kako da napravim uredjaj koji generise zadatu povorku impulsa?

[ Pregleda: 3296 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

pedjav
Java Developer
Belgrade

Član broj: 62878
Poruke: 104
212.5.210.*



Profil

icon Kako da napravim uredjaj koji generise zadatu povorku impulsa?24.10.2007. u 08:05 - pre 200 meseci
Cao,

da li neko zna da me uputi kako da napravim uredjaj koji na izlazu daje signal sledeceg oblika:



Postoji ukupno devet kombinacija vremena trajanja impulsa koja treba generisati a koja ce se pojaviti na izlazu
zavisi od vrednosti jednosmernog napona na ulazu. t1 je reda velicine 100ms t2 i t3 reda 10ms a t4 reda 1ms.

Pedja.

 
Odgovor na temu

korak
Nis

Član broj: 125522
Poruke: 622
*.dynamic.sbb.co.yu.



+7 Profil

icon Re: Kako da napravim uredjaj koji generise zadatu povorku impulsa?24.10.2007. u 13:43 - pre 200 meseci
Imao sam potrebu za slicnim stvarima, pa cu pokusati da ti pomognem. Radim sa mikrokontrolerom sa kojim, vidim do sada, niko ne radi, pa cu se truditi da opis bude sto opstiji. Pominjem mikrokontroler, jer je to najlakse uraditi sa njim, a ako je to jedina funkcija, onda te on ne bi kostao vise od 1 EUR.

Dakle, koristis tajmersku jedinicu u modu output compare. Treba da je tajmer 16-to bitni i preskalerom podesi da je klok za tajmersku jedinicu oko 1.5us (1.5us*65536 = 98.304ms) sto treba da zadovolji najduze vreme koje imas, a to je t5 (nadam se da nije duze of 98.304ms).

Podesi funkciju tajmera na clear outout on compare. U tajmerskoj jedinici imas MainCounter koji broji klokove koje si doveo u nju od 0 do 65535. Za tajmerski kanal imas registar TMcounter, u koji upisujes zeljenu vrednost, i kada bude MainCounter = TMcounter onda dolazi do promene signala na pinu koji odgovara tom kanalu (zavisno od zadate funkcije tajmera). Da bi imao definisan pocetak generisanja povorke impulsa, dobro je napraviti TMCounter <- MainCounter, inace ako nije bitno, ovo ne treba. Ocito je da imas 4 razlicite faze u dijagramu: faza1 za vreme t2, faza2 za vreme t3, faza3 za vreme t4 i faza4 za vreme t5. Odvoji varijablu faza koja ce imati vrednosti 1,2,3 i 4 za svaku fazu. Postavi faza <- 1. Ova podesavanja su u inicijalnom delu programa, a sve ostalo se odigrava u interrupt-ima.

U interrupt-u ces imati nesto slicno ovome:
Code:

1. brises fleg koji je generisala tajmerska jedinica;

2. case faza of
     1 : begin
           TMcounter <- TMcounter+t2;
           funkcija tajmera : set output on compare;
           faza <- 2;
         end;

     2 : begin
           TMcounter <- TMcounter+t3;
           funkcija tajmera : clr output on compare;
           faza <- 3;           
         end;

     3 : begin
           TMcounter <- TMcounter+t4;
           funkcija tajmera : set output on compare;
           faza <- 4;           
         end;

     4 : begin
           TMcounter <- TMcounter+t5;
           funkcija tajmera : clr output on compare;
           faza <- 1;           
         end;
   end;

I to je sve. Vrednosti t2..t5 treba da budu izrazene brojem umnozaka sa 1.5us da zadovolji potrebno vreme. Izvini sto sam u objasnjenju koristio neke elemente iz PASCAL-a, znam da svi obozavaju C, ali se nadam da je sve jasno. Ako imas dodatnih nedoumica, rado cu ti ih pojasniti.

Pozdrav.
 
Odgovor na temu

Odin D.
Mlađi referent za automatizaciju
samoupravljanja

Član broj: 37292
Poruke: 2549



+8370 Profil

icon Re: Kako da napravim uredjaj koji generise zadatu povorku impulsa?24.10.2007. u 23:25 - pre 200 meseci
S obzirom da se radi o jednostavnijem uredjaju, i s obzirom kako si postavio pitanje, zakljucujem da mikrokontroleri nisu tvoja uza struka, odnosno da nisi mnogo upoznat sa time.
Ako se ne radi o nekom obaveznom domacem, seminarskom, projektnom ili slicnom zadatku koga bi trebao sam da uradis, ja bih ti savjetovao da se ipak obratis nekom iskusnijem ko bi ti to uradio. S obzirom da je u pitanju jednostavan uredjaj ne bi trebalo narocito da kosta, a mozda bi se nasao neko i da to uradi onako dzaba.
Iako sam mikrokontroler kosta par evra ili cak i manje, jer je u tvom slucaju dovoljan i neki jednostavniji (ako se ne zahtjeva pretjerana tacnost), to nije sve sto ti je potrebno. Ima tu okolo jos nekih komponenti, a treba se pozabaviti i stampom. Na kraju svega ti treba i programator, nesto elektronicarskog alata i znanje kako da to sve da izvedes do kraja. To i dalje ne mora znatno da podigne cijenu svega u novcu, ali ces sigurno platiti u vremenu dok sve to "pohvatas".

U slucaju da se obratis nekom da ti to uradi, onda treba da malo detaljnije izlozis zahtjeve. Npr. nedostaju ti informacije o tacnosti, odnosno preciznosti tih vremenskih intervala. Naveo si kog reda su odredjeni vremenski intervali, ali ne i koliko precizni treba da budu, npr. t4 je reda 1ms, ali ako npr. treba da bude 1.15ms moze li da prodje 1ms ili mora najvise 1.16ms ili nesto trece. To znacajno moze da utice na razne stvari.
Zatim, nejasno je kada i kako se javlja takav odziv na ulazni analogni signal (nakon koliko vremena, da li se ta sekvenca ponavlja ili ne i sl.), kao i kakve su elektricne karakteristike tog signala (naponski nivoi, strujni kapacitet, strmine ivica...). Nije receno nista o tome na sta se "kaci" taj signal. Nije dovoljno samo da se napon na nekom pinu mikrokontrolera mijenja u takvom ritmu, ako je npr. taj pin spojen na neku liniju sa izvjesnim kapacitivnim opterecenjem. Ta kapacitivnost moze da poremeti vremenski oblik signala itd. Onda mora da se razmislja o drajverima i drugim stvarima. Sve u svemu, ako nisi vican elektronici mozes dosta vremena potrositi.

Nadam se da ce ti ovo pomoci da odlucis sta da radis.
Pozdrav.
 
Odgovor na temu

pedjav
Java Developer
Belgrade

Član broj: 62878
Poruke: 104
212.5.210.*



Profil

icon Re: Kako da napravim uredjaj koji generise zadatu povorku impulsa?25.10.2007. u 08:23 - pre 200 meseci
Evo jos malo pojasnjenja i sta sam jos saznao...

Prvo, kao sto je Odin i primetio, nisam vican mikrokontrolerima a nije ni seminarski rad u pitanju.
Gore pomenuti signal koriste Blaupunkt automobilski radio/cd aparati za remote kontrolu. E sad,
ja imam solidan Blaupunkt u autu koji na zalost nije povezan sa komandama na volanu.
Interface za to postoji ali koliko sam ja upoznat kod nas nema da se kupi. Mogao bi da se naruci
iz zapadne evrope ali kosta oko 100e (pretpostavljam da kad bi imao da se kupi kod nas
da bi bio i skuplji) i to mi je stvarno mnogo da platim. S druge strane, postoji fabricki blaupunktov daljinac
RC10 (kog takodje nisam uspeo da nadjem kod nas) i gore pretstavljeni signal jeste snimljen izlaz
iz tog daljinca (neki likovi su hteli da iskoriste taj daljinac u druge svrhe pa su snimali
i analizirali izlaz i objavili to na netu).

Sto se preciznosti tice, likovi koji su radili analizu signala merili su eksperimentalno maximalne i minamalne periode
za sve varijante i to predstavili kao min i max broj do kog je neki brojac odbrojao. Ovo bi mislim odmah bilo
jasno nekom ko se razume. t4 treba da bude konstantan - 0.6ms a izmereno je 0.6-0.643ms. t5 je takodje
konstantan 102ms (znaci >98.304ms ) mada je proglasen za irelevantan jer kako kazu "provides sufficient time
for CAN packet transmissions" sta god to znacilo. Prakticno samo t2 i t3 ostaju promenjivi, priblizno su iste duzine,
manji su od 10ms i razlikuju se na drugu decimalu. Najmanja vrednost je 2.55ms a najveca 8ms.

Na ulaz treba da se dovedu komande na volanu, koje daju razlicitu vrednost napona u zavisnosti koje dugme je pritisnuto.
Koje su to vrednosti tek treba da izmerim. Koliko ja shvatam sekvenca se ponavlja sve dok se ne otpusti dugme. Pomenuto
je da se u tom trenutku salje "terminating pulse train" za koga kazu da je razlicite duzine od svih ostalih intervala ali
ne kazu koliko. Napon je +5V, strmine ivica mozda mogu da se odrede iz dijagrama a sto se struje tice to nemam pojma.

Evo okacio sam pdf ako nekog interesuje detaljnije...

http://www.krusevac.cn/rc10.zip

Elem, bilo bi super ako bi mi korak poslao neki primer koji je on radio sa nekakvim opisom jer me interesuje
kako se ovo radi i hteo bih se malo pozabaviti time cisto iz hobija.


 
Odgovor na temu

korak
Nis

Član broj: 125522
Poruke: 622
*.dynamic.sbb.co.yu.



+7 Profil

icon Re: Kako da napravim uredjaj koji generise zadatu povorku impulsa?26.10.2007. u 17:53 - pre 200 meseci
Evo kompletnog koda bas za tvoj zahtev. Nije bas fleksibilan, ali se to moze lako doraditi, a osim toga jasno oslikava sustinu. Pustio sam program i snimio generisan signal osciloskopom. Pogledaj prikacen fajl.
Code:

program GenSignala(MC9S08GB32);//15:37 Fri 26-Oct-2007

const
  StartPrograma = $f000;    //raspolozivi flash je od $8000 do $ffff
  StartRAMa = 128;          //RAM od 2KB pocinje od adr. 128, a ispred su registri
  EndRAMa = StartRAMA+2047; //Odredjuje zadnju lokaciju RAM-a
  VelicinaSteka = 100;      //Definise se da treba 100 bajta za stek

  Vtpm1ch0 = $fff4;         //adresa na kojoj je interrupt vektor tajmerske 
                            //jedinice 1 (ima ih 2) njenog kanala 0 (ima ih 4)
                            
  t0 = 3252; //u ns za izabrani klok tajmerske jedinice 1
    
code[StartPrograma..$ffff];             //definisanje mem. prostora za kod 
data[StartRAMa..EndRAMA-VelicinaSteka]; //definisanje mem za smestanje varijabli

type
  //skup statusnih i kontrolnih bitova tajmerskog kanala (koristi se x jer je
  //isto za obe tajmerske jedinice, i n jer je isto za sve tajmerske kanale 
  tTPMxCnSC = set of (ncTCSC1,ncTCSC2,ELSA,ELSB,MSA,MSB,CHIE,CHF);
  tTPMxSC = set of (PS0,PS1,PS2,CLKSA,CLKSB,CPWMS,TOIE,TOF);
  
var
  ICGC1 : byte absolute $48;  //ovi registri pripadaju PLL kolu i svojim vrednostima
  ICGC2 : byte absolute $49;  //mnoze frek, kristala (4.9152MHz) sa 4 i to daje
                              //frekvenciju na bus-u od 19.6608MHz
  
  TPM1C0SC : tTPMxCnSC absolute $35; //deklarisanje statusno-kontrolnog registra
                                     //kanala 0 tajmerske jedinice 1 koji je
                                     //na adresi $35 (0x35)
                                     
  TPM1SC : tTPMxSC absolute $30;     //deklarisanje statusno kontrolnog registra
                                     //tajmerske jedinice 1
  
  SRS : byte absolute $1800;         //upisom u ovaj registar resetuje se WDT, i
                                     //nalazi se u grupi visoko adresiranih registra
  
  TPM1C0V : word absolute $36;       //16-to bitni compare registar kanala 0 tajmera 1

  PTD : byte absolute 12;            //port D mikrokontrolera
  
  Faza : (Faza1,Faza2,Faza3,Faza4);  //varijabla koja se automatski smesta u 
                                     //prostor za varijable, i ona je nabrojivog
                                     //tipa, sto znaci da se ujedno stvaraju i
                                     //konstante: Faza1 = 0, Faza2 = 1 i t. d.
                                     
  tn2,tn3,tn4,tn5 : word;            //deklaracija vremenskih intervala koji su
                                     //dvobajtni (word) i automatski se smesta
                                     //u prostoru za varijable
//------------------------- 
macro ClrWDT;   //makro kojim se resetuje WDT, na mestu gde je napisano njegovo
begin           //ime insertuje se kod napisan u makrou (staa [SRS])
  staa [SRS];
end;  
//-------------------------------- 
procedure Signal; interrupt Vtpm1ch0 //interrupt procedura kanala 0 tajmera 1
var dynamic
  dt : word;  //dinamicka varijabla koja se cuva na steku samo dok se izvrsava
begin         //ova procedura (ne zauzima trajno RAM) i sluzi kao pomocna
  pshh;
  
  ldaa [TPM1C0SC];        //kad se postavio CHF aktivirao se interrupt, pa je
  anda not|CHF| and 255;  //potrebno ovim naredbama obrisati ovaj bit
  staa [TPM1C0SC];
  
  ldaa [Faza];       //zavisno od varijable Faza izvrsavaju se pojedini delovi
  case AccA of       //programa ove case strukture 
    Faza1 : begin
              ldhx [tn2];  //u privremenu varijablu dt se smesta tn2 za vreme do
              sthx s[dt];  //sledeceg interrupt-a, varijabli dt se pristupa
                           //adresiranjem preko steka s[dt]
                           
              bset ELSA,[TPM1C0SC]; //setovanjem ovog bita, sledeci interrupt
                                    //ce na pinu postaviti log. jedinicu
                                    
              ldaa Faza2;     //u sledecem interrupt-u ce se izvrsavati kod
              staa [Faza];    //definisan slucajem Faza2
            end;
    Faza2 : begin
              ldhx [tn3];
              sthx s[dt];
              
              bclr ELSA,[TPM1C0SC]; //klirovanjem ovog bita, sledeci interrupt
                                    //ce na pinu postaviti log. nulu
              
              ldaa Faza3;
              staa [Faza];
            end;
    Faza3 : begin
              ldhx [tn4];
              sthx s[dt];
              
              bset ELSA,[TPM1C0SC];
              
              ldaa Faza4;
              staa [Faza];
            end;
    Faza4 : begin
              ldhx [tn5];
              sthx s[dt];
              
              bclr ELSA,[TPM1C0SC];
              
              ldaa Faza1;
              staa [Faza];
            end;
  end;
  
  ldhx [TPM1C0V]; //compare registar kanala 0 tajmera 1 se uvecava za 
  txa;            //zeljeno vreme koje je napred odredjeno
  adda s[dt.1];   //main counter tajmera 1 stalno broji, i izjednacice se
  tax;            //sa sadrzajem u ovom registru za zadato vreme, zato se 
  pshh;           //stalno uvecava compare registar da bude ispred main 
  pula;           //counter-a
  adca s[dt.0];
  psha;
  pulh;
  sthx [TPM1C0V];
  
  pulh;   //par pshh i ova moraju da postoje samo zbog kompatibilnosti sa
          //ranijom familijom HC05
end; 
//===================================
BEGIN
  ldhx EndRAMa;  //odredjivanje vrednosti stek
  thxs;          //pointera tako da ukazuje na kraj RAM-a

  //podesavanje frekvencije na bus-u 4.9152 x 4 = 19.6608MHz  
  mov $78,[ICGC1];
  mov $20,[ICGC2];
  
  mov |PS1,PS2,CLKSA|,[TPM1SC];   //podesavanje da izvor kloka za tajmer 1 bude
                                  //bus frekvencija (19.6608MHz) sa postavlanjem
                                  //CLKSA na 1, a postavljanje PS1 i PS2 na 1
                                  //(dok je PS0 = 0 odredjuje da preskaler deli
                                  //19.6608MHz sa 64, i da je to klok za tajmer 1
                                  //sto daje periodu tajmera od 3.255us
                                  
  mov |ELSB,MSA,CHIE|,[TPM1C0SC]; //odredjuje da je odobren interrupt od kanala 0
                                  //tajmera 1, da je funkciija output compare
                                  //MSA = 1; MSB = 0 i da se na interrupt na 
                                  //pinu postavi log. nula (ELSB = 0; ELSB = 1)
  
  ldaa Faza1;   //pocetno je Faza = Faza1
  staa [Faza];
  
  ldhx 3072;  //t2 = 3072*3.255us = 9.99936ms
  sthx [tn2];

  ldhx 2458;  //t3 = 2458*3.255us = 8.00079ms
  sthx [tn3];
    
  ldhx 307;   //t2 = 307*3.255us = 0.999285ms
  sthx [tn4];
  
  ldhx 30722; //t2 = 30722*3.255us = 100.00011ms
  sthx [tn5];
      
  cli; //dozvoljava interrupt
  clc;
  repeat     //prazna petlja, a sve ostalo se odigrava u interrupt-u.
    ClrWDT;
  until sc;

END.


Pozdrav.
Prikačeni fajlovi
 
Odgovor na temu

sander
Aleksandar Golovic
Beograd

Član broj: 21336
Poruke: 211
*.smin-1.sezampro.yu.



Profil

icon Re: Kako da napravim uredjaj koji generise zadatu povorku impulsa?12.11.2007. u 18:51 - pre 200 meseci
Nesto mi se cini da bi takva povoraka inpulsa mogla da se generise relativno jednostavno pomucu naredbi, funkcija za kasnjenje, nesto kao

(PICbasic)

low portb.0
pause 10 ; kasnjenje 10mS
high portb.0
pause 10 ; kasnjenje 10mS
low portb.0
pause 1 ; kasnjenje 1mS
high portb.0
pause 79 ; kasnjenje 79mS

pa u krug dok je taster pritisnut.

Ako je potrebno preciznije koristi se pauseus u mikrosekundama, recimo umesto 1mS, 995uS:

pauseus 995

Dok za recimo PIC24F serijiu u asembleru:

nop
REPEAT Wn ; gde je u Wn (working registar n) smesteno koliko ce se puta ponavljati prethodna instukcija gde je ukupno ponavljanje vrednost Wn+1

tako za tacno 1ms (vreme izvrsenja instukcije 1uS):

mov 998,W0
nop
repeat W0

Ako se dobro secam igrarija oko paljenja LED-ova na Microchip-ovom Work Shop-u za 24F seriju kontrolera pre pola godine.
 
Odgovor na temu

[es] :: Elektronika :: Mikrokontroleri :: Kako da napravim uredjaj koji generise zadatu povorku impulsa?

[ Pregleda: 3296 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.