www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

PIC in servo motorji
Pojdi na stran Prejšnja  1, 2
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
galjotj
Član
Član



Pridružen-a: Pet 02 Nov 2012 15:08
Prispevkov: 231
Aktiv.: 1.50
Kraj: Zgornji Brnik

PrispevekObjavljeno: Sob Nov 03, 2012 12:10 am    Naslov sporočila:   Odgovori s citatom

Uporabljam metodo s prekinitvama dveh timerjev, pa me zanima, a obstaja še kakšna, ker bi kak timer porabil raje drugje.
_________________
Pa sam programirat sem hotu!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
aly
Član
Član



Pridružen-a: Tor 28 Sep 2004 14:51
Prispevkov: 9407
Aktiv.: 39.71
Kraj: Kranj - struževo

PrispevekObjavljeno: Sob Nov 03, 2012 11:45 am    Naslov sporočila:   Odgovori s citatom

En timer je zadosti za generiranje desetih ali še več PWM signalov.
Prekinitve se morajo izvajati na najvišjo željeno resolucijo.
Če želiš resolucijo npr 64 korakov, potem 20 ms (periodo) razdeliš na 64 korakov. En korak je tako dolg 312,5 µs.
Seveda mora biti mikrokontroler dovolj zmogljiv in hiter, da v tem času obdela vse pwm izhode in naredi še kaj drugega poleg tega.

_________________
I'm going to stand outside, so if anyone asks, I'm outstanding Smile
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran MSN Messenger - naslov
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3641
Aktiv.: 16.01

PrispevekObjavljeno: Sob Nov 03, 2012 12:47 pm    Naslov sporočila:   Odgovori s citatom

Vsak servo impulz ima dolžino 1 do 2ms. Torej vklopiš prvi izhod za 1ms, vklopiš drugi izhod, v naslednjih 1024us pa je možno z 8-bitno resolucijo izklopiti prvi izhod. Nato počakaš do preteka 1024us, vklopiš tretji izhod in začneš čakati do izklopa drugega izhoda.
V 20ms ciklu lahko s čistimi decfsz pavzami 8-bitno poganjaš 18 ali 19 servo motorčkov, na koncu in v prvi ms novega cikla pa postoriš še kakšno malenkost.
Enostavno ne dobijo vsi servoti hkrati začetka impulza (to bi se poznalo tudi kot motnja na napajanju), ampak gre vse lepo po vrsti.

Za tiste 4 servote se PIC-u sploh ne pozna, da kaj počne. Timer lahko uporabiš kar za zbujanje iz sleep Smile vsakih 20ms. To pa že veš, da lahko za sproti spreminjaš bite razpoložljivih registrov (preddelilnika, INTCON, ...), da notranji časi tečejo skladno s potrebami.

Sploh tisti, ki za debounce tipk uporabljate nekaj ms zakasnitve z zankami, imate še ogromno rezerve za optimizacijo kode.

_________________
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
galjotj
Član
Član



Pridružen-a: Pet 02 Nov 2012 15:08
Prispevkov: 231
Aktiv.: 1.50
Kraj: Zgornji Brnik

PrispevekObjavljeno: Sob Nov 03, 2012 3:09 pm    Naslov sporočila:   Odgovori s citatom

A obstaja kakšen nazoren C primer ?

Delam z 18f2550 v C18 in bi rad poleg mnogih drugih I/O operacij, izračunavanj.. krmilil še 8-9servo-tov, kar sedaj počnem z dvema timer-jema ter prekinitvenimi rutinami.

HVALA IN LP

_________________
Pa sam programirat sem hotu!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
xsyt
Član
Član



Pridružen-a: Sre 28 Maj 2008 22:19
Prispevkov: 1346
Aktiv.: 6.48
Kraj: Slov.Bistrica

PrispevekObjavljeno: Sob Nov 03, 2012 3:12 pm    Naslov sporočila:   Odgovori s citatom

Microcontrollers - AVR Atmega32 - Controlling Multiple Servos Using Standard Available Output Pins
_________________
If you're in control, you aren't going fast enough
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
galjotj
Član
Član



Pridružen-a: Pet 02 Nov 2012 15:08
Prispevkov: 231
Aktiv.: 1.50
Kraj: Zgornji Brnik

PrispevekObjavljeno: Sob Nov 03, 2012 3:58 pm    Naslov sporočila:   Odgovori s citatom

Zelo zanimiv in nazoren prikaz, res pa da iz "drugega tabora" (Atmel).

Bom probal to implementirati na PIC-u in če kaj dobrega rata, to tudi objavim.

HVALA IN LP

_________________
Pa sam programirat sem hotu!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
aly
Član
Član



Pridružen-a: Tor 28 Sep 2004 14:51
Prispevkov: 9407
Aktiv.: 39.71
Kraj: Kranj - struževo

PrispevekObjavljeno: Sob Nov 03, 2012 6:26 pm    Naslov sporočila:   Odgovori s citatom

Tale koda, predstavljena v videu, je precej slaba.
Se lepo vidi na koncu, ko motorčki "žmrkajo", namesto, da bi bili pri miru: klik.

_________________
I'm going to stand outside, so if anyone asks, I'm outstanding Smile
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran MSN Messenger - naslov
galjotj
Član
Član



Pridružen-a: Pet 02 Nov 2012 15:08
Prispevkov: 231
Aktiv.: 1.50
Kraj: Zgornji Brnik

PrispevekObjavljeno: Sob Nov 03, 2012 8:21 pm    Naslov sporočila:   Odgovori s citatom

Moram malce bolj preučiti posnetek, čeprav o Atmelih nevem kaj dosti. Ker uporablja prekinitev, je kar čudno, da motorčki takole trzajo.

Pri uporabi dveh timerjev so servoti pri miru, a se zaplete, če hkrati uporabljaš prekinitve za kaj drugega, vendar trzajo veliko manj.

Tale PWM s enim timerjem pa verjetno pomeni, da se uporablja CPP modul - po pregledu nekaterih primerov sklepam ?

LP

_________________
Pa sam programirat sem hotu!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
tezo
Član
Član



Pridružen-a: Sob 19 Sep 2009 10:44
Prispevkov: 40
Aktiv.: 0.21
Kraj: Zgornji brnik

PrispevekObjavljeno: Sob Nov 03, 2012 9:48 pm    Naslov sporočila:   Odgovori s citatom

Še ena možnost: Rabiš en timer in 2ms porabljenga časa vsakih 20ms.

Prvo pulze razporediš po času, od najkrajšega, do najdaljšega. Ko timer vsakih 20ms sproži interupt, v njem postavimo vse izhode na "1", nato čakamo dokler ne poteče čas najkrajšega pulza in ga potem postavimo na "0". Nato izračunamo koliko časa moramo še počakati do drugega najkrajšega pulza, počakamo in potem ta izhod postavimo na "0". in tako dalje...

Tako bi lahko dosegel veliko natančnost in število izhodov, in to samo z uporabo 8bitnega timerja. Tega še nisem preizkusil v praksi, ampak bom to kmalu rabil v enem projektu. Trenutno imam problem z BRANJEM pwm signala iz sprejemnika. Če ima kdo kakšen predlog kako to narediti (na ZS ali tukaj, da nebomo smetili teme)...

Lep Pozdrav!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
MvE
Član
Član



Pridružen-a: Ned 04 Jan 2009 12:24
Prispevkov: 146
Aktiv.: 0.73
Kraj: MB

PrispevekObjavljeno: Tor Nov 06, 2012 2:15 am    Naslov sporočila:   Odgovori s citatom

Takšen čisto amaterski program napisan iz glave (bi se ga dalo sigurno optimirati) in približek tega kar sem nekoč delal. Verjetno vsebuje napake ampak se vidi princip:

Koda:
//Globalne spremenljivke
int servo_A=0, servo_B=0, korak=0;

//Prekinitev timerja
void timer_interrupt(void){

        korak++;

        //Zanka, ki skrbi da pulz na RB1 in RB2 traja med 1 in 2ms in ju postavi na "0"
        if(korak <= 32){
                if(korak >= servo_A) izklopi RB1;
                if(korak >= servo_B) izklopi RB2;
        }

        //Ko število korakov preseže 20ms postavi RB1 in RB2 nazaj na "1"
        if(korak >= 312){
                vklop RB1;
                vklop RB2;
                korak = 0;
        }
}

void main(void){
       inicializiraj izhode;
       nastavi timer in prekinitve;

       //Nastavi začetni položaj servomotorja
       servo_a = 16;
       servo_b = 31;
     
       while(1){

              //Postavi na drug položaj
              servo_A++;
              servo_B--;

              //Če preseže dovoljeno vrednost postavi na začetni položaj/vrednost
              if(servo_A > 31) servo_A = 16;
              if(servo_B < 16) servo_B = 31;

              delay;   //Upočasni premikanje servomotorja
       }
       
}


Napisano za primer da imamo 16MHz kristal in 8 bitni timer s preddelilnikom 256. Minimalna vrednost za spremenljivko servo_x je 16 (1,024ms) in maksimalna 31 (1,984ms). Se pravi, da ima servomotor 16 položajev oziroma deluje z resolucijo je 64us ali drugače povedano prekinitev se sproži vsakih 64us.

Imam napisan tudi program za branje dolžine pulza iz RC sprejemnika ampak je za PIC, tega še imam nekje shranjenega če ga kdo potrebuje, drugače je opisan v Tips ‘n Tricks - stran 3-4, TIP#3.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
galjotj
Član
Član



Pridružen-a: Pet 02 Nov 2012 15:08
Prispevkov: 231
Aktiv.: 1.50
Kraj: Zgornji Brnik

PrispevekObjavljeno: Čet Nov 08, 2012 12:20 am    Naslov sporočila:   Odgovori s citatom

Uporabljam C18 prekinitveno rutino za branje PPM (Pulse Position Modulation-8 pulzov direktno iz RC sprejemnika) na 18F2550 in sem jo našel v enem projektu RC simulatorja.

Mogoče malo iz konteksta, a koristno za koga.

Dela na RB2 in nisem preučeval delovanja, ker je kar takoj delovala. Dancing

Prilagam...

LP



PPM_ISR.c.txt
 Opis:
PPM_ISR.c

Download
 Ime datoteke:  PPM_ISR.c.txt
 Velikost datoteke:  2.79 KB
 Downloadano:  3 krat


_________________
Pa sam programirat sem hotu!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran Prejšnja  1, 2
Stran 2 od 2

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 492 dni


Powered by phpBB © 2001, 2005 phpBB Group