Řízení rotační osy

Odpovědět
jova
Příspěvky: 361
Registrován: 16 pro 2013, 11:40

Řízení rotační osy

Příspěvek od jova »

Dobrá den, jako začátečník jsem vás chtěl poprosit o několik rad při naprogramování picaxe 14m2. Stavím si rotační osu která bude připevněná na fréze a budou se pomocí ní vyrábět ozubená kola.
Představa je následující: LCD displej pro zobrazení nastavených údajů, rotační enkodér pro nastavování hodnot, řízení jednoho případně dvou krokových motorů. Něco už mám v chodu, s něčím si nevím rady.
Prvním problémem s kterým bych potřeboval poradit je rotační enkodér: http://www.gme.cz/img/cache/doc/532/089 ... heet-1.pdf
Potřebuji v programu vytvořit smyčku tak, aby se mi do proměnné w0 přičítala nebo odečítala hodnota 1 podle toho na jakou stranu točím. Tato hodnota se mi pak má průběžně zobrazovat na LCD a po stisknutí tlačítka dojde k ukončení smyčky a k trvalému zapsání hodnoty do w0. LCD mám vyřešené, enkodér zapojený ale sestavit program (smyčku) pro převod z enkodéru na w0 se mi nedaří :(
Uživatelský avatar
jrt
Příspěvky: 1921
Registrován: 17 úno 2013, 17:13

Re: Řízení rotační osy

Příspěvek od jrt »

Zkuste se podívat sem.
jrt
jova
Příspěvky: 361
Registrován: 16 pro 2013, 11:40

Re: Řízení rotační osy

Příspěvek od jova »

Tak jsem to cvičně zkoušel a nějak si s tím nevím rady. Přerušení není má parketa a ještě se mi to nějak asi pere s tím mým ovládáním LCD :(

Kód: Vybrat vše

setfreq m4			
symbol baud=N4800
Pause 500
serout C.0, baud, (254,1)
serout C.0, baud, (254,128)   ;první řádek, první pozice
serout C.0, baud, ("Pocet zubu:")
serout C.0, baud, (254,192)   ;druhý řádek, první pozice
serout C.0, baud, ("Stiskni tlacitko")
Do

readadc 4,w0			;potenciometr na vstup 4 - tuto proměnnou bych rád měnil tím snímačem

bintoascii b1,b2,b3,b4		;převod asci
serout C.0, baud,(254,128) 
serout C.0, baud,("Pocet zubu: ",#w0,"  ") 
if pin3=0 then exit               ;ukončí smyčku 
Loop
Uživatelský avatar
jrt
Příspěvky: 1921
Registrován: 17 úno 2013, 17:13

Re: Řízení rotační osy

Příspěvek od jrt »

Vyzkoušel jsem tenhle kód a funguje, tak vám to snad pomůže...

Kód: Vybrat vše

#picaxe 08M2

#rem

          +V 1 U 8 0V
   GND - 10K 2   7 (0) OUT
I/O/ADC4 (4) 3   6 (1) I/O/ADC1 --- rotary encoder
  IN3    (3) 4   5 (2) I/O/ADC2 --- rotary encoder

b1  b0 b3  b2 b5  b4 b7  b6 b9  b8 b11 b10 b13 b12
--w0-- --w1-- --w2-- --w3-- --w4-- --w5--- --w6---

b0 = bit7  : bit6  : bit5  : bit4  : bit3  : bit2  : bit1 : bit0
b1 = bit15 : bit14 : bit13 : bit12 : bit11 : bit10 : bit9 : bit8


Rotary encoder connection:

   0V
   |
  4k7
   |
o--.---- pin1 (phys 6)
o--330-- +5V
o--.---- pin2 (phys 5)
   |
  4k7
   |
   0V

Encoder result (early detection):
pin1 pin2
  1    0  one direction
  0    1  other direction
  0    0  init and final (= "detent") status

One direction: pin1 goes high before pin2
         ___     ___
pin1 ___|   |___|   |___
           ___     ___
pin2 _____|   |___|   |___

Other direction: pin2 goes high before pin1
           ___     ___
pin1 _____|   |___|   |___
         ___     ___
pin2 ___|   |___|   |___

#endrem


'           Used bits                                          xxxx   xxxx
symbol getBits   = b0 'b0 = bit7 : bit6 : bit5 : bit4 : bit3 : bit2 : bit1 : bit0
symbol dir       = b1
symbol counter   = b3

setint %00000010,%00000010 'interrupt on pin1 high only

main:
  do
   sertxd("Main loop - Counter=",#b3,13,10)
   pause 1000
  loop
  
interrupt:
 bit2 = pin2: bit1 = pin1       'save rotary encoder pins status
 getBits = getBits & %000000110 'isolate rotary encoder pins
 if getBits <> 0 then           'if both pins are low, the direction is undetermined: discard
  dir = bit2 * 2                'direction: if bit2=low then dir=0; if bit2=high then dir=2
  counter = counter - 1 + dir   'change counter variable accordingly
  do while getBits <> 0         'wait for the encoder to go to the next "detent" position
   getBits = pins & %000000110
  loop
 endif
 setint %00000010,%00000010     'restore interrupt on pin1 high
 return
jrt
jova
Příspěvky: 361
Registrován: 16 pro 2013, 11:40

Re: Řízení rotační osy

Příspěvek od jova »

Tenhle konkrétní jsem nedokázal upravit pro můj displej. Zkoušel jsem, ale ostatní z odkazů a chovají se všechny více méně stejně. Při testování to funguje, pokud to zapojím na cvičné desce, ten rotační snímač nestíhá, impulsy se s ztrácejí a hodně záleží na rychlosti otáčení. Zřejmě nedokážu pracovat správně s přerušením. Nakonec jsem se dopracoval k tomuto, pro mě vyhovujícímu programu:

Kód: Vybrat vše

rotace:
if pin4=1 and pin5=1 then rotace1
if pin6=0 then goto start
goto rotace

rotace1:
if pin4=1 and pin5=1 then rotace1
if pin4=1 and pin5=0 then rotacea
if pin4=0 and pin5=1 then rotaceb
if pin6=0 then goto start
goto rotace

rotacea:
w0=w0+1
gosub lcd_nastav_zuby
goto rotace

rotaceb:
w0=w0-1
if w0=65535 then gosub podnulu
gosub lcd_nastav_zuby
goto rotace

podnulu:
w0=w0+1
return
pin4, pin5 - spínače enkodéru, pin6 - tlačítko v něm pro zapsání nastavené ho počtu zubů.
jova
Příspěvky: 361
Registrován: 16 pro 2013, 11:40

Re: Řízení rotační osy

Příspěvek od jova »

Rotační osa je již nějakou dobu funkční, děkuji za rady.
Jak to celé dopadlo je ke zhlédnutí zde:
http://www.jova1.cz/dilna/rotacni_osa/rotacni_osa.html
Přílohy
27.jpg
Naposledy upravil(a) jova dne 30 dub 2016, 23:14, celkem upraveno 3 x.
Uživatelský avatar
jrt
Příspěvky: 1921
Registrován: 17 úno 2013, 17:13

Re: Řízení rotační osy

Příspěvek od jrt »

Gratuluji! Sledoval jsem vývoj vašeho zařízení na c-n-c.cz a moc se mi líbí výsledky, kterých jste dosáhl.
jrt
jova
Příspěvky: 361
Registrován: 16 pro 2013, 11:40

Re: Řízení rotační osy

Příspěvek od jova »

Děkuji.
Jsem rád, že se projekt podařilo dotáhnout do konce k úplné spokojenosti i s použitím tak jednoduchého programovacího jazyka a mikroprocesorem PICAXE.
Odpovědět