řízení KM s MCU

Odpovědět
expertdb
Příspěvky: 608
Registrován: 20. 5. 2011, 7:25
Bydliště: Valašsko

12. 3. 2016, 7:25

expertdb píše:Ahá, díky moc za polopatické vysvětlení. Nechám Tě teď odpočinout, než si zase něco vymyslím :) . Příště si zkusím zobrazit ty proměnné na display. No to zas bude.... :D . Ještě jednou díky.
Tak jsem zase tu a opět s problémkem :wink: . Zkusil jsem zobrazovaní proměnných, ale narazil jsem na problém. Výrazně to zpomaluje ten rozběh krokáče. Tak nevím jestli se to dá nějak vyřešit, nebo to zobrazovaní potřebuje nějakou dobu a tím to zpomaluje?

Kód: Vybrat vše

setfreq m32

start:
pwmout pwmdiv64, b.2,0,0     ;vypne motor
if pinc.3=0 then goto dolu    ;při stisknutí tlačítka T1 se provede odskok na smyčku chod dolů
pause 200                                      ;čas na náběh LCD 
serout b.4,N4800_32,($FE,$01)                     ;vymazání LCD 254,1
pause 200                                      ;čas na vymazání LCD
goto start

dolu:                            ;smyčka pro chod dolů
if pinc.3=0 then dolu     ;pokud je stále stisknuto tlačítko T1 program se zaciklí a "čeká" na jeho uvolnění
high b.5                        ;nastaví směr otáčení motoru pro pohyb dolů
readadc c.0,b3              ;načte rychlost otáčení z potenciometru
for b0= 150 to b3 step -1
let w2=b0*4
serout b.4,N4800_32,(254,192)                     ;od začátku 2. řádku
serout b.4,N4800_32,("b0 = ",#b0)              ;popis	
serout b.4,N4800_32,(254,137)                     ;od půlky 1. řádku
serout b.4,N4800_32,("b3 = ",#b3)              ;popis
serout b.4,N4800_32,(254,128)                     ;od začátku 1. řádku
serout b.4,N4800_32,("w2 = ",#w2)              ;popis
pwmout pwmdiv64, b.2,b0,w2
pause 140
if pinc.1=0 then goto nahoru      ;při najetí na spodní koncák K1 odskok na smyčku nahoru
if pinc.3=0 then goto pauza 
next

dal:
if pinc.1=0 then goto nahoru      ;při najetí na spodní koncák K1 odskok na smyčku nahoru
if pinc.3=0 then goto pauza        ;při stisknutí tlačítka T1 se provede odskok na smyčku pauza
goto dal

nahoru:                     ;smyčka pro chod motoru nahoru
low b.5                     ;nastaví směr otáčení motoru pro pohyb nahoru
readadc c.0,b0         ;načte rychlost otáčení z potenciometru
let w2=b0*4             
pwmout pwmdiv64, b.2,b0,w2
if pinc.2=0 then goto start         ;při najetí na horní koncák K2 následuje odskok na začátek programu a tím jeho ukončení
goto nahoru

pauza:           
pwmout pwmdiv64, b.2,0,0       ; zastavení posuvu motoru dolů
if pinc.3=0 then pauza                ;pokud je stále stisknuto tlačítko T1 program se zaciklí a "čeká" na jeho uvolnění
pauza1:
if pinc.3=1 then pauza1
pauza2:
if pinc.3=0 then nahoru         ;při opětovném stisknutí tlačítka T1 se provede odskok na smyčku pro posuv nahoru
goto pauza1


Rotwerk 300
Sieg SX2L homemade cnc
Uživatelský avatar
robokop
Site Admin
Příspěvky: 22916
Registrován: 10. 7. 2006, 12:12
Bydliště: Praha
Kontaktovat uživatele:

12. 3. 2016, 7:30

co treba pouzit arduino jako procesni rizeni a na generovani pulzu pouzit neco hotoveho, bezezbytku funkcniho, odladeneho.
Vsechna prava na chyby vyhrazena (E)
Uživatelský avatar
jova
Příspěvky: 2547
Registrován: 2. 11. 2007, 1:40
Bydliště: Chýnov to je kousek od Tábora
Kontaktovat uživatele:

12. 3. 2016, 8:05

expertdb píše: Tak jsem zase tu a opět s problémkem :wink: .
Protože ten program „běží“ po řádcích a posílá ta data sériovou komunikací, potřebuje nějaký čas než to všechno vypíše na LCD. V rychlosti mě napadají dvě řešení. Buď s tím budeš počítat a úměrně zkrátíš tu pauzu v té smyčce for-next (pause 140) tak, aby to odpovídalo zamýšlenému zrychlení, nebo pokud i tak by to bylo pomalé, to čtení dat budeš muset dát před smyčku, hned za měření potenciometru a zobrazovat jen ty jeho nastavené hodnoty.
Já osobně zobrazení řeším tak, že tu část s výpisem na LCD, dám třeba někam na konec programu jako samostatný podprogram např. s označením lcd: , pak následuje ten výpis a ukončím to příkazem return. V té části programu kde chci zobrazit aktuální data vložím příkaz gosub lcd. Program udělá odskok, vypíše data a pokračuje na dalším řádku. Samozřejmě to, ale nevyřeší tvůj problém se zpožděním. Zřejmě ještě narazíš na problém přepisování víceciferných čísel s méně cifernými případně s mazáním dat z LCD, ale to se dá lehce řešit.
Mimochodem, jaký používáš převodník na LCD?
expertdb
Příspěvky: 608
Registrován: 20. 5. 2011, 7:25
Bydliště: Valašsko

12. 3. 2016, 10:03

Takže je to tak,jak jsem si myslel. Zkrácení pouzy to neřeší-stále pomalé. GOSUB jsem zkoušel, ale ted zrovna si nevzpomínám,jak se to chovalo. Ještě to testnu. To přepisování čísel, nevím co tím myslíš, ale je fakt, že hodnota tuším b0 se zobrazovala zajímavě. Nejdříve to nabylo hodnotu do 1000 a pak to padalo na nastavenou hodnotu b3x10??? Možná je to to, co jsi měl na mysli.
Řadič používám s Picaxe 20M2, co má v sobě display ,nevím.


robokop:
Máš asi pravdu, ale beru to zatím jako seznámení s "nejakým procesorem". Pokud by to nefungovalo, těžkou hlavu si z toho dělat nebudu, k životu to nepotřebuji :D . Spíše poklona patří jovovi, že má se mnou trpělivost :shock: .
Rotwerk 300
Sieg SX2L homemade cnc
Uživatelský avatar
jova
Příspěvky: 2547
Registrován: 2. 11. 2007, 1:40
Bydliště: Chýnov to je kousek od Tábora
Kontaktovat uživatele:

12. 3. 2016, 11:28

Proměnné b by měly mít maximální hodnotu 255. Pokud potřebuješ pracovat s větším číslem, musíš použít proměnou w, což jsou vlastně dvě proměnné b mezi sebou násobené. Tím pádem můžeš pracovat s číslem 0 – 65536. Pokud to nedodržíš, začne se to chovat „divně“, protože ty proměnné číselně přetékají a začínají znovu od 0.
Co se týká té rychlosti, potřebuješ skutečně vypisovat všechny proměnné?
Mělo by to fungovat i tak, že na LCD před tou smyčkou pošleš kompletní výpis všech dat a v té smyčce for-next budeš posílat jen jeden řádek s tou proměnou co potřebuješ sledovat.

Kód: Vybrat vše

dolu:                            ;smyčka pro chod dolů
if pinc.3=0 then dolu     ;pokud je stále stisknuto tlačítko T1 program se zaciklí a "čeká" na jeho uvolnění
high b.5                        ;nastaví směr otáčení motoru pro pohyb dolů
readadc c.0,b3 	;načte rychlost otáčení z potenciometru
serout b.4,N4800_32,(254,137)                     ;od půlky 1. řádku
serout b.4,N4800_32,("b3 = ",#b3)              ;popis             
for b0= 150 to b3 step -1
let w2=b0*4
serout b.4,N4800_32,(254,192)                     ;od začátku 2. řádku
serout b.4,N4800_32,("b0 = ",#b0)              ;popis
pwmout pwmdiv64, b.2,b0,w2
if pinc.1=0 then goto nahoru      ;při najetí na spodní koncák K1 odskok na smyčku nahoru
if pinc.3=0 then goto pauza
next  
Bude to pak mnohem rychlejší a když to LCD nevynuluješ, tak ty ostatní data zůstanou stále zobrazena. Alespoň tak to funguje u mě.
Osobně se domnívám, že to vypisování rampy nemá smysl. Nechal bych jí normálně jen v té původní smyčce for-next s pauzou a zobrazoval maximálně tu hodnotu z potenciometru v úvodu. Pokud jí vhodně přepočítáš, můžeš jí zobrazovat třeba ve tvaru posuvu v mm /otáčku nebo v mm / sekundu ...

Nevím jak se konkrétně chová to tvé LCD, ale to mé pokud na něj například pošlu postupně odečítající se čísla, tak například při přechodu ze 100 na 99 tam ta poslední 0 zůstane, protože to číslo 99 se jako by posune doleva a přepisuje jen první dvě čísla. Musím tu 0 smazat jinak. Je to dáno tím, že adresuješ první číslo směrem doprava. Stejně se to chová při přechodu na řád jednotek.
Třeba u hodin co si s nimi nyní hraji ten "pohyb" čísel řeším takto:

Kód: Vybrat vše

serout c.7, baud, (254,148)   
if b2<10 then serout c.7, baud, ("0",#b2)endif
if b2>9 then serout c.7, baud, (#b2)endif
Uživatelský avatar
pafik
Příspěvky: 2920
Registrován: 10. 2. 2013, 5:07
Bydliště: Praha 4

12. 3. 2016, 2:48

Nekamenujte mě, jestli mě napadla blbost, ale jelikož jsou ty procesory relativně levný, co kdybys tam dal dva "paralelně". V tom smyslu, že vstupy, který chceš sledovat, bys spojil paralelně, to lze, a na jednom procesoru by běžela samostatná smyčka regulace motorů a na druhom jen program k vyčítání nastavených hodnot? Pak se ti to navzájem nezdržuje.
lubbez
Příspěvky: 3347
Registrován: 21. 6. 2012, 9:26
Bydliště: Praha

12. 3. 2016, 8:02

Otázka je, jestli na to ten procák výkonově stačí a jak je postavená struktura programu. Vidím, že to píšete v nějakém vyšším programovacím jazyce, to taky není úplně OK. Je potřeba si uvědomit, že signál step musí být symetrický a může nabývat hdnot desitek uS. V podstatě to musíš udělat takto, nastavíš všechny požadované proměnné vč. dodnoty DIR, pak pošleš info na displej a teprve pak začbeš STEPovat. V tuto chvíli už nemůžeš dělat prakticky nic jiného, protože na to nemáš čas. Jediné, co v tom podprogramu ješrě musí být, jak zastavit STEPování. Samozřejmě v té polovině STEP rutiny, kde to zastavení vyhodnocuješ musíš kompenzovat délku zpoždění, aby STEP byl symetrický. A když si vezmeš ješté výpočet rampy a to, že v pomalejších rychlostech budeš počítat v 16bitovejch proměnnejch :-(. Docela vím co říkám, protože jsem před vánocemi dělal posuv Xka na BF20. Držím palce.
Uživatelský avatar
jova
Příspěvky: 2547
Registrován: 2. 11. 2007, 1:40
Bydliště: Chýnov to je kousek od Tábora
Kontaktovat uživatele:

13. 3. 2016, 7:43

U PICAXE v tomto případě užíváme funkci PWM a generujeme s ní ten signál step. Výhodou je že generovat v ní symetrický signál není problém a běží na pozadí, takže provádět další úkoly součastně není problém. V uvedeném případě se narazilo na problém se změnou rychlosti toho PWM při součastném výpisu na LCD. Ten výpis je poměrně „pomalý a zdržuje“. Tím pádem ani ta změna (zrychlení) nemůže probíhat dostatečně rychle.
expertdb
Příspěvky: 608
Registrován: 20. 5. 2011, 7:25
Bydliště: Valašsko

13. 3. 2016, 2:49

To moje LCD se chová přesně stejně jako Tvé. Vše jsem si otestoval,vyzkoušel. To zobrazování všech parametrů je samozřejmě blbost. Byla to jen taková euforie,že jsem to dokazal všechno zobrazit :wink: . Dle dobré rady, využiju jen to nastavení z pot. pro nastavení posuvu.
Ale stejně ještě jedna věc by mne zajímala. Lze to udělat tak, aby šlo měnit otáčky i při posuvu dolů po náběhu rampy a to pak i kontinuálně zobrazovat na lcd?
Rotwerk 300
Sieg SX2L homemade cnc
Uživatelský avatar
jova
Příspěvky: 2547
Registrován: 2. 11. 2007, 1:40
Bydliště: Chýnov to je kousek od Tábora
Kontaktovat uživatele:

13. 3. 2016, 3:17

Podle mě by to mělo jít. Snad tam nebudou nějaké kolize, ostatně není nic jednoduššího než to vyzkoušet.
Dej to zobrazení do samostatného bloku. A odskok na to odkud potřebuješ. Do té části dál: dej čtení z potenciometru a odskok na to zobrazení LCD. Zkus toto:

Kód: Vybrat vše

setfreq m32
pause 200                                      ;čas na náběh LCD 
serout b.4,N4800_32,($FE,$01)                     ;vymazání LCD 254,1
pause 200                                      ;čas na vymazání LCD

start:
pwmout pwmdiv64, b.2,0,0     ;vypne motor
readadc c.0,b3       
gosub lcd      
if pinc.3=0 then goto dolu    ;při stisknutí tlačítka T1 se provede odskok na smyčku chod dolů
 
goto start

dolu:                            ;smyčka pro chod dolů
if pinc.3=0 then dolu     ;pokud je stále stisknuto tlačítko T1 program se zaciklí a "čeká" na jeho uvolnění
high b.5                        ;nastaví směr otáčení motoru pro pohyb dolů 
for b0= 150 to b3 step -1
let w2=b0*4
pause 140
if pinc.1=0 then goto nahoru      ;při najetí na spodní koncák K1 odskok na smyčku nahoru
if pinc.3=0 then goto pauza 
next

dal:
readadc c.0,b3    
gosub lcd         
let b0=b3         
let w2=b0*4             
pwmout pwmdiv64, b.2,b0,w2
if pinc.1=0 then goto nahoru      ;při najetí na spodní koncák K1 odskok na smyčku nahoru
if pinc.3=0 then goto pauza        ;při stisknutí tlačítka T1 se provede odskok na smyčku pauza
goto dal

nahoru:                     ;smyčka pro chod motoru nahoru
low b.5                     ;nastaví směr otáčení motoru pro pohyb nahoru
readadc c.0,b0         ;načte rychlost otáčení z potenciometru
let w2=b0*4             
pwmout pwmdiv64, b.2,b0,w2
if pinc.2=0 then goto start         ;při najetí na horní koncák K2 následuje odskok na začátek programu a tím jeho ukončení
goto nahoru

pauza:           
pwmout pwmdiv64, b.2,0,0       ; zastavení posuvu motoru dolů
if pinc.3=0 then pauza                ;pokud je stále stisknuto tlačítko T1 program se zaciklí a "čeká" na jeho uvolnění
pauza1:
if pinc.3=1 then pauza1
pauza2:
if pinc.3=0 then nahoru         ;při opětovném stisknutí tlačítka T1 se provede odskok na smyčku pro posuv nahoru
goto pauza1

lcd:
serout b.4,N4800_32,(254,137)                 ;od půlky 1. řádku
serout b.4,N4800_32,("b3 = ",#b3)              ;popis 
return
expertdb
Příspěvky: 608
Registrován: 20. 5. 2011, 7:25
Bydliště: Valašsko

20. 3. 2016, 8:42

Dostal jsem se k tomu až dnes. V tom Tvém posledním návrhu nefunguje rampa. Po zmáčknutí tlačítka to chvíli čeká a pak to jede na nastavené rychlosti. Zkoušel jsem s tím laborovat a funguje mně to s tímto:

Kód: Vybrat vše

setfreq m32
;pause 200                        ;čas na náběh LCD 
serout b.4,N4800_32,($FE,$01)    ;vymazání LCD 254,1
pause 30                         ;čas na vymazání LCD

start:
pwmout pwmdiv64, b.2,0,0         ;vypne motor
readadc c.0,b3  
gosub lcd
if pinc.3=0 then goto dolu       ;při stisknutí tlačítka T1 se provede odskok na smyčku chod dolů
goto start

dolu:                            ;smyčka pro chod dolů
low b.3
if pinc.3=0 then dolu            ;pokud je stále stisknuto tlačítko T1 program se zaciklí a "čeká" na jeho uvolnění
high b.5                         ;nastaví směr otáčení motoru pro pohyb dolů
readadc c.0,b3
for b0= 160 to b3 step -1
let w2=b0*4
pwmout pwmdiv64, b.2,b0,w2
pause 70 
if pinc.1=0 then goto nahoru      ;při najetí na spodní koncák K1 odskok na smyčku nahoru
if pinc.3=0 then goto pauza 
if pinc.4=0 then goto estop       ;estop
next

dal:
readadc c.0,b3    
gosub lcd         
let b0=b3         
let w2=b0*4 
pwmout pwmdiv64, b.2,b0,w2
if pinc.1=0 then goto nahoru       ;při najetí na spodní koncák K1 odskok na smyčku nahoru
if pinc.3=0 then goto pauza        ;při stisknutí tlačítka T1 se provede odskok na smyčku pauza
if pinc.4=0 then goto estop
goto dal

estop:
high b.3
if pinc.4=0 then estop
goto start

nahoru:                            ;smyčka pro chod motoru nahoru
low b.3                            ;uvolní EN
low b.5                            ;nastaví směr otáčení motoru pro pohyb nahoru
readadc c.0,b1                     ;načte rychlost otáčení z potenciometru
gosub lcd
let w2=b1*4             
pwmout pwmdiv64, b.2,b1,w2
if pinc.2=0 then goto start         ;při najetí na horní koncák K2 následuje odskok na začátek programu a tím jeho ukončení
if pinc.4=0 then goto estop
goto nahoru

pauza:           
pwmout pwmdiv64, b.2,0,0            ; zastavení posuvu motoru dolů
if pinc.3=0 then pauza              ;pokud je stále stisknuto tlačítko T1 program se zaciklí a "čeká" na jeho uvolnění
pauza1:
if pinc.3=1 then pauza1
pauza2:
if pinc.3=0 then nahoru             ;při opětovném stisknutí tlačítka T1 se provede odskok na smyčku pro posuv nahoru
goto pauza1

lcd:
serout b.4,N4800_32,(254,128)                     ;128= kurzor na řádek 1 pozice 1, (129 pozice 2 atd., max 143/16)
serout b.4,N4800_32,("vpred = ",#b3)                 ;popis
serout b.4,N4800_32,(254,192)                     ;192= kurzor na řádek 2 pozice 1, (193 pozice 2 atd., max 207/16)
serout b.4,N4800_32,("zpet = ",#b1)                     ;popis
return
Ještě ohledně těch displejů. Prázdný znak asi nejde nastavit, že?
Rotwerk 300
Sieg SX2L homemade cnc
Uživatelský avatar
jova
Příspěvky: 2547
Registrován: 2. 11. 2007, 1:40
Bydliště: Chýnov to je kousek od Tábora
Kontaktovat uživatele:

20. 3. 2016, 11:50

Za chybu se omlouvám, testoval jsem to jen v simulátoru, nemám to už na destičce.
U mě prázdný znak na LCD vytvoří mezerník odeslaný v uvozovkách.
Pak to třeba vypadá takto:

Kód: Vybrat vše

serout c.7, baud, (254,138)
if b4<10 then serout c.7, baud, ("0",#b4," ")endif
if b4>9 then serout c.7, baud, (#b4," ")endif
To IF slouží k zobrazení čísla pod 10 a nad 10
Uživatelský avatar
robokop
Site Admin
Příspěvky: 22916
Registrován: 10. 7. 2006, 12:12
Bydliště: Praha
Kontaktovat uživatele:

21. 3. 2016, 6:39

neda mi to abych si nerejpnul
to to rizeni km musi bejt fakt jednoduchy kdyz se s tim tu trapite mozna 1000x dyl nez je beznou praxi
nestalo by to zamyslet se nad necim aby to rizeni bylo skutecne jednoduche
ne jen z jednoduchych komponent ale na realizaci neskutecne komplikovane
ale skutecne jednoduche se vsim vsudy
Vsechna prava na chyby vyhrazena (E)
Uživatelský avatar
jova
Příspěvky: 2547
Registrován: 2. 11. 2007, 1:40
Bydliště: Chýnov to je kousek od Tábora
Kontaktovat uživatele:

21. 3. 2016, 7:36

A jak by podle tebe mělo takové jednoduché řízení krokového motoru vypadat?
Podle mě to bude v základu pořád něco co generuje pulsy ve spojením s driverem.
V okamžiku kdy se k tomu přidá požadavek na ovládání tlačítky, koncáky, rampy... se dostáváme do situace, kdy se klasické zapojení s logickými obvody stává příliš složité a je vhodnější použít procesor. V tomto okamžiku se musí každý rozhodnout jaký procesor, respektive jaký programovací jazyk se naučí, aby ten procesor mohl využít. Já si zvolil Picaxe a Basic, protože mi ten jazyk připadal nejjednodušší a na vlastní programování mi stačí kabel ze staré myši.
Jestli se stále dá ještě hovořit o "jednoduchém řízení krokového motoru" musí říci hlavně ti, co se o to na základě tohoto vlákna pokusili. Já osobně se domnívám že ano, protože na zvládnutí té zadané úlohy i se zobrazením dat na LCD se stačí naučit používat, jestli jsem dobře počítal, 12 programových příkazů.
Uživatelský avatar
Thomeeque
Příspěvky: 9336
Registrován: 30. 1. 2012, 10:20
Bydliště: Mimo ČR

21. 3. 2016, 7:38

lubbez píše:Je potřeba si uvědomit, že signál step musí být symetrický..
Co tím symetrický myslíš, střídu 1:1?
mimooborová naplavenina • kolowratský zázrak™ • NPS • GCU • HirthCalc • ncDP.ino
Odpovědět

Zpět na „Ostatní elektronika“