Ovládání KM programovacím jazykem, inpout32.dll

petr.h
Příspěvky: 7
Registrován: 6. 7. 2014, 2:49

6. 7. 2014, 3:39

Ahoj,

rád bych se zeptal na to, co programově posílat na LPT piny, abych rozpohyboval jeden krokový motor připojený přes driver k PC. Tím programově myslím v jazyku C, Java, C#, Delphi apod. O rychlost nebo přesnost mi moc nejde, spíš o princip.
Hledal jsem googlem, ale většina webů z linků v diskusích dnes již neexistuje.
Jsem v KM začátečník a navíc nejsem elektrikář. Proto prosím o shovívavost.

Mám zapojení:
PC – driver – KM (1ks)
Na Windows 7 32bit s pomocí Mach 3 mi vše krásně funguje.
Toto je mé nastavení v Machu:
img02_config.png
img01_motor_tuning.png
Mimo to, programově dokážu volat funkci z knihovny inpout32.dll
PortAccess.Output(port, value);
Kde LPT port dávám 888 což je 0x378
A value dávám 0 nebo 1. (1 motorem cukne, 0 zastaví)

Jenomže, já přesně nevím, co do port a value psát, abych udělal to, co dělá Mach 3. Tj.:
1. Co tam napsat, abych zapnul/vypnul proud?? Resp. to, co dělá Mach při stisku tlačítka Reset?
2. Co tam napsat, abych nastavil směr pohybu motoru?
3. Co tam napsat, abych nastavil otáčky motoru. Resp. Mach dělá to, že se motor pomalu rozjede, dosáhne maxima a pak se pomalu zastaví. Takže jak tohle udělat?
4. Co tam napsat, abych motorem točil?


Budu moc vděčen za objasnění!
lubos
Sponzor fora
Příspěvky: 5091
Registrován: 2. 5. 2007, 3:47
Bydliště: Praha

6. 7. 2014, 3:56

Začni tím že si přečteš třeba toto
http://www.ulozto.cz/hledej?q=Vyu%C5%BE ... &related=1" onclick="window.open(this.href);return false;

pak si zjisti jak vlasně funguje driver ( co znamenaji piny Step a dir).
Jak dlouho musí být na pinu step úroven H aby driver zareagoval
A pak už ti to musí být jasné jak to na pár řádků napsat.
XpertMill, Gravos, Ninos, Galaad
IQ156
-1500Kč, -520Kč, -1čokoláda, - 28000Kč
www.freeair.cz www.rotexelectric.eu www.retrofitcnc.cz
petr.h
Příspěvky: 7
Registrován: 6. 7. 2014, 2:49

6. 7. 2014, 4:44

Ok, jdu to zkusit nastudovat, zatím díky za nasměrování!
petr.h
Příspěvky: 7
Registrován: 6. 7. 2014, 2:49

6. 7. 2014, 10:50

Abych pravdu řekl, hodně jsem to studoval, ale z těch elektrotechnických pojmů mám spíše chaos než moudro.

Zatím se mi podařilo sesmolit a odzkoušet několik variant kódu, kde jsem různě kombinoval hodnoty pro PortAccess.Output(888, 3); Vždy dojde k nějakému cukání a pištění motoru, ale žádný skvělý zážitek z toho zatím nemám.

Tohle cuká a piští, ale moc se to netočí ani když to volám opakovaně:

Kód: Vybrat vše

        private void button6_Click(object sender, EventArgs e)
        {
            /*PortAccess.Output(888, 255);
            Thread.Sleep(100);*/

            PortAccess.Output(888, 3);
            Thread.Sleep(100);

            PortAccess.Output(888, 1);
            Thread.Sleep(100);
            PortAccess.Output(888, 2);
            Thread.Sleep(100);
            PortAccess.Output(888, 4);
            Thread.Sleep(100);
            PortAccess.Output(888, 8);
            Thread.Sleep(100);
        }
Pokud to správně chápu, na pinu 2 mám STEP, tj. krokování motoru a to mám volat prostě pořád s nějakým časovým zdržením. Čím kratší zdržení mezi voláním, tím větší rychlost?
Pak dále na pinu 3 mám DIR. Ale to jsem nepřišel na to, jak to nastavit.

Když zkusím tohle:

PortAccess.Output(888, 3 | 1);
Thread.Sleep(100);
PortAccess.Output(888, 3 | 0);
Thread.Sleep(100);

Tak motor změní pískot ve vřískot, nebo opačně, nebo úplně utichne. Prostě tak různě, asi jak se mu chce.

No a teď co s tím?

Prosím o radu. Znovu připomínám, že nejsem elektrotechnik, tak chápu, že je to se mnou těžké.
Ale pokud mi to někdo pomůže rozhodit, tak pošlu poštou třeba čokoládu. :)
Uživatelský avatar
robokop
Site Admin
Příspěvky: 22403
Registrován: 10. 7. 2006, 12:12
Bydliště: Praha
Kontaktovat uživatele:

7. 7. 2014, 6:17

a co ze to mas za driver?
Vsechna prava na chyby vyhrazena (E)
lubos
Sponzor fora
Příspěvky: 5091
Registrován: 2. 5. 2007, 3:47
Bydliště: Praha

7. 7. 2014, 7:27

Zkus to takhle

PortAccess.Output(888, 3 | 1);
Thread.Sleep(10);
PortAccess.Output(888, 3 | 0);
Thread.Sleep(1000);


to už by se ti mohl pomalu točit, myslím že úroven H by měla 10 msec být až až, taky aby ti motor pak nepískal ( až budeš chtít rychlejší pohyb) budeš muse udělat akceleraci.
XpertMill, Gravos, Ninos, Galaad
IQ156
-1500Kč, -520Kč, -1čokoláda, - 28000Kč
www.freeair.cz www.rotexelectric.eu www.retrofitcnc.cz
petr.h
Příspěvky: 7
Registrován: 6. 7. 2014, 2:49

7. 7. 2014, 9:19

lubos, to bohuzel nefunguje.

robokop, driver mam tenhle:
20140707_021312.jpg
20140707_021328.jpg
oscar
Příspěvky: 1190
Registrován: 2. 5. 2010, 8:50
Bydliště: Perníkovice

7. 7. 2014, 9:34

co je cilem cviceni?

1. nahodis enable - motor musi zacit piskat
2. nastavis spravny bit na smer - DIR
3. cvicis s bitem pro krok - STEP.

nic na tom neni.

BTW, nakresli jeste jak to mas zapojene, nejak se mi to moc nezda....
lubos
Sponzor fora
Příspěvky: 5091
Registrován: 2. 5. 2007, 3:47
Bydliště: Praha

7. 7. 2014, 9:42

Tak jak píše oscar
ještě nahodit enable :-)
XpertMill, Gravos, Ninos, Galaad
IQ156
-1500Kč, -520Kč, -1čokoláda, - 28000Kč
www.freeair.cz www.rotexelectric.eu www.retrofitcnc.cz
petr.h
Příspěvky: 7
Registrován: 6. 7. 2014, 2:49

7. 7. 2014, 9:55

No, neelektrotechnik tady cvičí elektřinu, nebo spíše ona s nim. :)

Tak když pouštím dokola tohle, tak se to pomalu hejbe, ale motor jde relativne pomalu:

loop {
PortAccess.Output(888, 1);
Thread.Sleep(10);
PortAccess.Output(888, 0);
Thread.Sleep(20);
}

Když zkrátím ineterval

loop {
PortAccess.Output(888, 1);
Thread.Sleep(10); // a
PortAccess.Output(888, 0);
Thread.Sleep(1); // b
}

Pak je to rychlejší, ale pořád proti machu pomalé. Který z těch intervalů se má zkrátit, aby se to zrychlilo? Nebo udělat něco jiného pro zrychlení?

A co se týče nastavení enabled. Hm, to jsem zatím neudělal. Když se podívám do nastavení svého machu a pokud to správně čtu, pak mám enabled na pinu 4?, takže musím poslat
value = ConvertBinToDec ( 00010000 );
PortAccess.Output(888, value);

Chápu to správně?

Zapojení viz příloha. Svítí červená ledka, někdy i dvě. Asi to není zapojeno nejlépe, ale v machu to jezdí.
Přílohy
20140705_151824.jpg
Mex
Příspěvky: 10287
Registrován: 6. 2. 2014, 10:29

7. 7. 2014, 12:11

Hlavně by sis měl ujasnit, co chceš dělat a jak (teoreticky) toho chceš dosáhnout.
Program to za tebe nevymyslí, ty sám musíš vědět, co na jakém pinu a jak rychle se má hýbat, abys dosáhl požadovaného stavu.

Kdyby nebyly prázdniny, tak bych řekl, že jsi určitě dostal ve škole za úkol udělat nějaký "projekt", ale protože ses celý rok neučil, tak teď nevíš, jak na to. ;-)

Takže na chvíli přestaň "programovat" a začni studovat. Ujasni si význam signálů STEP, DIR a případně ENA (ten ale klidně můžeš pro začátekj nechat nezapojený). Spočítej si, jak rychle ty signály musí kmitat, abys dosáhl požadované rychlosti (nezapomeň zvážit i zrychlení, okamžitě plné rychlosti nedosáhneš). Pak si ty rychlosti přepočítej na časové konstanty do svého programu a teprva pak zační psát "kód".

A jestli můžu podoručit: když je nějaký údaj tradičně lidsky v hexadecimálním tvaru (např. ta bázová adresa LPT portu), tak bývá dobrým zvykem ji uvádět hexadecimálně i v programu. Pokud někdo místo 0x378 použije 888, tak to dělá buď pro to, aby to ztížil případnému dalšímu člověku, který bude ten kód studovat (nebude patrné na první pohled o co jde), nebo to píše někdo, kdo neví co dělá.
oscar
Příspěvky: 1190
Registrován: 2. 5. 2010, 8:50
Bydliště: Perníkovice

7. 7. 2014, 12:25

no, kdyz das puls jednou za dve milisekundy (1+1) tak jich mas 500 za sekundu.

i kdybys nemel zadny mikrokrok tak je to 150 otacek za minutu - to je mozna to co vidis.
nemuzes pouzit sleep na ms, musis jit o par radu dolu. a to pres vlakno.spi() nedas.
zkus performancecounters

co je cilem?
vlastni sw na ovladani? zapomen na to.
petr.h
Příspěvky: 7
Registrován: 6. 7. 2014, 2:49

7. 7. 2014, 1:54

Smyslem bylo naučit se základy, jak to všechno funguje a to se mě nelektrotechnikovi povedlo. Jezdí mi to doleva, doprava v C#. Pokud so správně chápu, rychlost dosáhnu rychlejším voláním toho co mám uvnitř cyklu? Což mohu udělat třeba v extra vlákně s prioritou realtime a nechráněném režimu, nebo v ASM, Delphi, C a pod.

Kód: Vybrat vše

                    int direction = rbDoprava.Checked ? 1 : 0;
                    for (int i = 0; i < 100; i++)
                    {
                        PortAccess.Output(0x378, 1 + direction);
                        Thread.Sleep(1);
                        PortAccess.Output(0x378, 0 + direction);
                        Thread.Sleep(1);
                    }
Jen jeden dotaz bych ještě měl.

Jediný port a piny, které má smysl u krokových motorů zapojených na LPT1 zapisovat je 0x378 a datové piny 2 - 9 ? Ty, které jsou označené jako Status a Control slouží ke čtění, ale pokud nemám řídící desku se zpětnou vazbou, tak to stejně nepřečtu? Nebo mi ty Control piny slouží i k nastavování nečeho?

Problém je, že dokumentace k této problematice moc není. Všechno je to psané pro tiskárny nebo pro sériové porty, ale nepovedlo se mi najít nic rozumného k driverům, KM a dir-step impulzům na LPT. Proto v tom dost tápu a víceméně jsem to odvozoval z toho co jsem dohledal. K tomu motoru a driveru co mám, taky není žádná dokumentace.

Jinak děkuji moc za rady a nápovědy!
oscar
Příspěvky: 1190
Registrován: 2. 5. 2010, 8:50
Bydliště: Perníkovice

7. 7. 2014, 2:10

petr.h píše:Smyslem bylo naučit se základy, jak to všechno funguje a to se mě nelektrotechnikovi povedlo. Jezdí mi to doleva, doprava v C#. Pokud so správně chápu, rychlost dosáhnu rychlejším voláním toho co mám uvnitř cyklu? Což mohu udělat třeba v extra vlákně s prioritou realtime a nechráněném režimu, nebo v ASM, Delphi, C a pod.

Kód: Vybrat vše

                    int direction = rbDoprava.Checked ? 1 : 0;
                    for (int i = 0; i < 100; i++)
                    {
                        PortAccess.Output(0x378, 1 + direction);
                        Thread.Sleep(1);
                        PortAccess.Output(0x378, 0 + direction);
                        Thread.Sleep(1);
                    }
nepouzivej na to cekani thread.sleep. pouzij performancetimers. kdyz uz.
https://stackoverflow.com/questions/625 ... illisecond" onclick="window.open(this.href);return false;
petr.h píše: Jen jeden dotaz bych ještě měl.

Jediný port a piny, které má smysl u krokových motorů zapojených na LPT1 zapisovat je 0x378 a datové piny 2 - 9 ? Ty, které jsou označené jako Status a Control slouží ke čtění, ale pokud nemám řídící desku se zpětnou vazbou, tak to stejně nepřečtu? Nebo mi ty Control piny slouží i k nastavování nečeho?
http://www.hw.cz/navrh-obvodu/rozhrani/ ... -1284.html" onclick="window.open(this.href);return false;
petr.h píše: Problém je, že dokumentace k této problematice moc není. Všechno je to psané pro tiskárny nebo pro sériové porty, ale nepovedlo se mi najít nic rozumného k driverům, KM a dir-step impulzům na LPT. Proto v tom dost tápu a víceméně jsem to odvozoval z toho co jsem dohledal. K tomu motoru a driveru co mám, taky není žádná dokumentace.
generovat pulsy na step a prepinat dir. nic vic k tomuto driveru nepotrebujes.
petr.h
Příspěvky: 7
Registrován: 6. 7. 2014, 2:49

7. 7. 2014, 2:40

Děkuji oscar! Teď to jezdí, kroutí a lítá jak od profíka! Jsem si k tomu motoru přidělal lepidlem vrtuli a skoro vzlétnul. :-) A prý "zapomeň na to, abys napsal vlastní řícící sw." :-)

Teď mi už snad chybí jen jediná instrukce ... jaký imuplz mi vypne to pískání v motoru ... alá mach3 Reset?

A pošli mi adresu, kam Ti mám zaslat čokoládu! :-)
Odpovědět

Zpět na „Krokové motory“