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ří
Řízení rotační osy
Re: Řízení rotační osy
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
Re: Řízení rotační osy
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
Re: Řízení rotační osy
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:
pin4, pin5 - spínače enkodéru, pin6 - tlačítko v něm pro zapsání nastavené ho počtu zubů.
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
Re: Řízení rotační osy
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
Jak to celé dopadlo je ke zhlédnutí zde:
http://www.jova1.cz/dilna/rotacni_osa/rotacni_osa.html
Naposledy upravil(a) jova dne 30 dub 2016, 23:14, celkem upraveno 3 x.
Re: Řízení rotační osy
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
Re: Řízení rotační osy
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.
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.