Léptetőmotor vezérlés
Én pár hete próbáltam (először) életre kelteni egy enkódert. Az általad berakott jelalakot produkálta.
A Bascom könyben lévő mintaprogival (kontakt enkóder) sikerült.
Próbáld ki!
A bourns-ecw elég stabilnak tűnt. Nem tévesztett, csak kár, hogy nincs nyomógomb rajta. Vettem valami 100 ft-os gagyit is (nyomógombosat) próbaképp, de az egy kalap sz@r. Lassú forgatásnál megbolondul.
A Bascom könyben lévő mintaprogival (kontakt enkóder) sikerült.
Próbáld ki!
A bourns-ecw elég stabilnak tűnt. Nem tévesztett, csak kár, hogy nincs nyomógomb rajta. Vettem valami 100 ft-os gagyit is (nyomógombosat) próbaképp, de az egy kalap sz@r. Lassú forgatásnál megbolondul.
Nekem nem kell nyomógomb rá és a lassú forgás is nagyon lényeges
alps.ot néztem amit belinkeltem, mert azt még kapni is lehet...
megnéztem, nekem mindegyik programmal működött.. mármint szimulációban... na most a gyakorlat biztos más.. de még nem vettem meg az alkatrészeket az építéshez.. mert ugye a vezérlés még nincs kész... mi tévő legyek? nem ragaszkodok az alps-hoz...
alps.ot néztem amit belinkeltem, mert azt még kapni is lehet...
megnéztem, nekem mindegyik programmal működött.. mármint szimulációban... na most a gyakorlat biztos más.. de még nem vettem meg az alkatrészeket az építéshez.. mert ugye a vezérlés még nincs kész... mi tévő legyek? nem ragaszkodok az alps-hoz...
Kérdés:
A jelenlegi játékunkkal meg tudjuk azt csinálni hogy ne egy ciklust fordítson az enkóder egy jele hanem egy enkóderjel egy lépést fordítson a motoron? ez lenne a cél... 2 sebességi fokozat kéne amit az enkóder jeleiből veszünk. az egyik amikor egyet tekerek az enkóderen és egyet ugrik a motor. a másik meg amikor folyamatosan érkezik az enkódertől a jel akkor a motor "gyorsan" forog.
Van egy kapcsolásom logikai kapukból ami így működik de azért gondoltam avr-re mert nem akarok sok sok alkatrészt... és avr-t utána tudom finomítani, máshogy programozni. Kérlek nyugtass meg hogy avr-el is lehetséges a fent leírt dolog
Válasz, folyt:
Igen, megoldható. Itt a pozíció abszolút értéke érdekes. De ezt tessék végiggondolni, hogy hogyan lehet megoldani.
Ergo van a teljes fordulat , ez ugye a 4 Full lépés (half esetén
A pozíciót az enkóder adja. 1 lépés, célpozíció lép 1-t.
Van 2 értéked: jelenlegi pozíció és célpozíció.
do
jelenposition' itt vagyok most
celposition 'ide kell jutni
if celposition<jelenposition gosub csokkenes
if celposition>jelenposition gosub novekves
loop
Csokkenes:
temp=jelenposition-1
temp1=temp mod 8 'azaz a 1...8 szemgensbol hova kell allni
select case temp1
case pos1: 1-es pozíciórajz
case pos2: 2-es pozíciórajz
....
case pos8:8-es pozíciórajz
end select
waitms 50 'motor beallasi ido
jelenposition=jelenposition -1
return
novekedes:
temp=jelenposition+1
temp1=temp mod 8 'azaz a 1...8 szemgensbol hova kell allni
select case temp1
case pos1: 1-es pozíciórajz
case pos2: 2-es pozíciórajz
....
case pos8:8-es pozíciórajz
end select
waitms 50 'motor beallasi ido
jelenposition =jelenposition+1
return
Ha half/Full kell, akkor trukk:
a temp1 erteket szorozni 2-vel és a temp1=temp mod 4 kell!
Gondold vegig az allast, hogy 32768-ról indulsz....
jelenpos=32768
celpos=321768
enkoder tekeressel valtozik a celpos.(nő v. csökken) Ez meg INT alapon magy, az független a főprogramtól.
A gyors tekerés, amikor a enkóder gyorsabban forog mint a motor. Ekkor megjegyzésre kerül úgyis a pozíció. Lassan meg több az azonos pozícióban a várakozás, szóval az is megy.
A jelenlegi játékunkkal meg tudjuk azt csinálni hogy ne egy ciklust fordítson az enkóder egy jele hanem egy enkóderjel egy lépést fordítson a motoron? ez lenne a cél... 2 sebességi fokozat kéne amit az enkóder jeleiből veszünk. az egyik amikor egyet tekerek az enkóderen és egyet ugrik a motor. a másik meg amikor folyamatosan érkezik az enkódertől a jel akkor a motor "gyorsan" forog.
Van egy kapcsolásom logikai kapukból ami így működik de azért gondoltam avr-re mert nem akarok sok sok alkatrészt... és avr-t utána tudom finomítani, máshogy programozni. Kérlek nyugtass meg hogy avr-el is lehetséges a fent leírt dolog
Válasz, folyt:
Igen, megoldható. Itt a pozíció abszolút értéke érdekes. De ezt tessék végiggondolni, hogy hogyan lehet megoldani.
Ergo van a teljes fordulat , ez ugye a 4 Full lépés (half esetén
A pozíciót az enkóder adja. 1 lépés, célpozíció lép 1-t.
Van 2 értéked: jelenlegi pozíció és célpozíció.
do
jelenposition' itt vagyok most
celposition 'ide kell jutni
if celposition<jelenposition gosub csokkenes
if celposition>jelenposition gosub novekves
loop
Csokkenes:
temp=jelenposition-1
temp1=temp mod 8 'azaz a 1...8 szemgensbol hova kell allni
select case temp1
case pos1: 1-es pozíciórajz
case pos2: 2-es pozíciórajz
....
case pos8:8-es pozíciórajz
end select
waitms 50 'motor beallasi ido
jelenposition=jelenposition -1
return
novekedes:
temp=jelenposition+1
temp1=temp mod 8 'azaz a 1...8 szemgensbol hova kell allni
select case temp1
case pos1: 1-es pozíciórajz
case pos2: 2-es pozíciórajz
....
case pos8:8-es pozíciórajz
end select
waitms 50 'motor beallasi ido
jelenposition =jelenposition+1
return
Ha half/Full kell, akkor trukk:
a temp1 erteket szorozni 2-vel és a temp1=temp mod 4 kell!
Gondold vegig az allast, hogy 32768-ról indulsz....
jelenpos=32768
celpos=321768
enkoder tekeressel valtozik a celpos.(nő v. csökken) Ez meg INT alapon magy, az független a főprogramtól.
A gyors tekerés, amikor a enkóder gyorsabban forog mint a motor. Ekkor megjegyzésre kerül úgyis a pozíció. Lassan meg több az azonos pozícióban a várakozás, szóval az is megy.
Szóval a működés, vázlatosan:
Példa.
Alappozíció (AP) =32768
32768 mod 8 (mert half steppel számolunk):
32768 - Int(32768 / 8 ) * 8 = 0 (azaz 8-l osztva a 32768-at mennyi a maradék)
Starthelyzet a 0 pozíció.
elmozdulok a célpozícióba (megtekerem a enkódert és a cálpozíció a kiindulási 32768-ról 32778-ra nő. Így:
1. lépés
32768->32769 Tehát mozdulni kell
32769 mod 8 = 1 (egészosztás maradéka 1)
motor léptetés 0->1
AP=32768+1 ->32769
2. lépés
32769->32770 Tehát mozdulni kell
32770 mod 8 = 2 (egészosztás maradéka 2)
motor léptetés 1->2
AP=32769+1 ->32770
.
.
.
.
10. lépés
32777->32778 Tehát mozdulni kell
32778 mod 8 = 2 (egészosztás maradéka 2)
motor léptetés 1->2
AP=32777+1 ->32778
AP = célpozíció -> nem kell léptetni amíg a célpozíció nem változik.
Ellenkező irány
1-et lépjen...
AP=32768
CélP=32767
32768-1=32767
32767 mod 8 = 7
Elmozdulás 0->7 (azaz visszafele 1-t!)
AP=32768-1
köv ellenőrzés:
CélP=AP nyugi van:)
Azaz amint bármelyik urányba visz el az enkóder - a motorral utolérem:)
A half és a Full Steppel nem biztos hogy vacakolnék.
Mondjuk annyit csak, hogy a pozíciólépés kiszámolásakor a maradék esetén:
0....7 értékem lehet (nevezzük lépésnek).
A tényleges lépéskoordináta:
temp1=lépés/2
temp1=int(temp1)'azaz a tizedest elhagyom, Temp1 as byte esetéán ez alapban meg is történik.
lépés=temp1*2
programilag:
lépés = 0....7
temp1=lépés/2 'egészrész csak
lépés=temp1*2
lépés értéke lehet: 0,2,4,6 Azaz minden 2. lépés ahol a 2 tekercs van bekapcsolva, mert így erősebb a motor!:) (na jó, hozzá kell adni az értékhez 1-t )
A pozíciók emlékeztetőül:
0. 1000
1. 1100
2. 0100
3. 0110
4. 0010
5. 0011
6. 0001
7. 1001
Példa.
Alappozíció (AP) =32768
32768 mod 8 (mert half steppel számolunk):
32768 - Int(32768 / 8 ) * 8 = 0 (azaz 8-l osztva a 32768-at mennyi a maradék)
Starthelyzet a 0 pozíció.
elmozdulok a célpozícióba (megtekerem a enkódert és a cálpozíció a kiindulási 32768-ról 32778-ra nő. Így:
1. lépés
32768->32769 Tehát mozdulni kell
32769 mod 8 = 1 (egészosztás maradéka 1)
motor léptetés 0->1
AP=32768+1 ->32769
2. lépés
32769->32770 Tehát mozdulni kell
32770 mod 8 = 2 (egészosztás maradéka 2)
motor léptetés 1->2
AP=32769+1 ->32770
.
.
.
.
10. lépés
32777->32778 Tehát mozdulni kell
32778 mod 8 = 2 (egészosztás maradéka 2)
motor léptetés 1->2
AP=32777+1 ->32778
AP = célpozíció -> nem kell léptetni amíg a célpozíció nem változik.
Ellenkező irány
1-et lépjen...
AP=32768
CélP=32767
32768-1=32767
32767 mod 8 = 7
Elmozdulás 0->7 (azaz visszafele 1-t!)
AP=32768-1
köv ellenőrzés:
CélP=AP nyugi van:)
Azaz amint bármelyik urányba visz el az enkóder - a motorral utolérem:)
A half és a Full Steppel nem biztos hogy vacakolnék.
Mondjuk annyit csak, hogy a pozíciólépés kiszámolásakor a maradék esetén:
0....7 értékem lehet (nevezzük lépésnek).
A tényleges lépéskoordináta:
temp1=lépés/2
temp1=int(temp1)'azaz a tizedest elhagyom, Temp1 as byte esetéán ez alapban meg is történik.
lépés=temp1*2
programilag:
lépés = 0....7
temp1=lépés/2 'egészrész csak
lépés=temp1*2
lépés értéke lehet: 0,2,4,6 Azaz minden 2. lépés ahol a 2 tekercs van bekapcsolva, mert így erősebb a motor!:) (na jó, hozzá kell adni az értékhez 1-t )
A pozíciók emlékeztetőül:
0. 1000
1. 1100
2. 0100
3. 0110
4. 0010
5. 0011
6. 0001
7. 1001
A középérték 32768-as indulásáról ha eljutsz 65535-re és innen 1-t lépsz fel, akkor 0-ra jutsz. Ez olyan, mintha a motort mint a hülyre ellenkező oldalra tekernéd.
kivédeni a főprogramba lehet:
Ha nem lassú baromira a motorod és tekered gyorsan az enkódert, így a pozícióraálláskor középhelyzetre kerülsz. Azért nem pont 32768-ra, mert ha eltéársz a 0. pozíciótól, akkor annyival többediken állsz. ezért kellett a Temp1-ben ezt kiszámolni.
kivédeni a főprogramba lehet:
Kód: Egész kijelölése
If CelPos=AP then
temp1=celpos mod 8
Celpos=32768+temp1
AP =celpos
endif
Róbálkozok:
Mi az ami még hibás?
Mi az ami még hibás?
Kód: Egész kijelölése
$crystal = 100000
$regfile = "ATtiny2313.DAT"
$baud = 9600
$hwstack = 64
$swstack = 20
$framesize = 80
Config Portd = Input
Config Portb = Output
Jled Alias Portb.6
Bled Alias Portb.7
Dim B As Byte
Dim Fut As Bit
Dim Ap As Word
Dim Celpos As Word
Dim Temp1 As Byte
Ap = 32768
Portb = &B00000011
Do
Fut = 0
B = Encoder(pind.4 , Pind.5 , Left_ , Right_ , 1)
Waitms 10
If Celpos < Jelenposition Then Gosub Csokkenes
End If
If Celpos > Jelenposition Then Gosub Novekedes
End If
Jled = 0
Bled = 0
Loop
Left_:
If Fut = 1 Then Goto Kihagyleft
Fut = 1
'motorlépés jobb
Jled = 1
Bled=0
Celpos = Celpos + 1
'motorlépés jobb eddig
Kihagyleft:
Return
Right_:
If Fut = 1 Then Goto Kihagyright
Fut = 1
'motorlépés bal
Bled = 1
Jled=0
Celpos = Celpos - 1
'motorlépés bal eddig
Kihagyright:
Return
End
Csokkenes:
Temp = Jelenposition - 1
Temp1 = Temp Mod 8
Select Case Temp1
Case Pos1 :
Portb.1 = 1
Portb.2 = 0
Portb.3 = 0
Portb.4 = 0
Case Pos2 :
Portb.1 = 1
Portb.2 = 1
Portb.3 = 0
Portb.4 = 0
Case Pos3 :
Portb.1 = 0
Portb.2 = 1
Portb.3 = 0
Portb.4 = 0
Case Pos4 :
Portb.1 = 0
Portb.2 = 1
Portb.3 = 1
Portb.4 = 0
Case Pos5 :
Portb.1 = 0
Portb.2 = 0
Portb.3 = 1
Portb.4 = 0
Case Pos6 :
Portb.1 = 0
Portb.2 = 0
Portb.3 = 1
Portb.4 = 1
Case Pos7 :
Portb.1 = 0
Portb.2 = 0
Portb.3 = 0
Portb.4 = 1
Case Pos8 :
Portb.1 = 1
Portb.2 = 0
Portb.3 = 0
Portb.4 = 1
End Select
Waitms 50
Jelenposition = Jelenposition - 1
Return
Novekedes:
Temp = Jelenposition + 1
Temp1 = Temp Mod 8
Select Case Temp1
Case Pos1 :
Portb.4 = 1
Portb.3 = 0
Portb.2 = 0
Portb.1 = 0
Case Pos2 :
Portb.4 = 1
Portb.3 = 1
Portb.2 = 0
Portb.1 = 0
Case Pos3 :
Portb.4 = 0
Portb.3 = 1
Portb.2 = 0
Portb.1 = 0
Case Pos4 :
Portb.4 = 0
Portb.3 = 1
Portb.2 = 1
Portb.1 = 0
Case Pos5 :
Portb.4 = 0
Portb.3 = 0
Portb.2 = 1
Portb.1 = 0
Case Pos6 :
Portb.4 = 0
Portb.4 = 0
Portb.2 = 1
Portb.1 = 1
Case Pos7 :
Portb.4 = 0
Portb.3 = 0
Portb.2 = 0
Portb.1 = 1
Case Pos8 :
Portb.4 = 1
Portb.3 = 0
Portb.2 = 0
Portb.1 = 1
End Select
Waitms 50
Jelenposition = Jelenposition + 1
Return
End
Még mindig van probléma.
a port1-4 ig részt lehet oly módon egyszerűsíteni hogy ne enter legyen közte hanem vessző vagy valamilyen elválasztójel.. lényeg hogy "rövidebben" tudjam felírni..
a port1-4 ig részt lehet oly módon egyszerűsíteni hogy ne enter legyen közte hanem vessző vagy valamilyen elválasztójel.. lényeg hogy "rövidebben" tudjam felírni..
Kód: Egész kijelölése
$crystal = 100000
$regfile = "ATtiny2313.DAT"
$baud = 9600
$hwstack = 64
$swstack = 20
$framesize = 80
Config Portd = Input
Config Portb = Output
Jled Alias Portb.6
Bled Alias Portb.7
Dim B As Byte
Dim Fut As Bit
Dim Ap As Word
Dim Celpos As Word
Dim Temp1 As Byte
Ap = 32768
Portb = &B00000011
Do
Fut = 0
B = Encoder(pind.4 , Pind.5 , Left_ , Right_ , 1)
Waitms 10
If Celpos < Ap Then Gosub Csokkenes
If Celpos > Ap Then Gosub Novekedes
Jled = 0
Bled = 0
If CelPos=AP then
Temp1 = Celpos Mod 8
Celpos = 32768 + Temp1
Ap = Celpos
End If
Loop
End
Left_:
If Fut = 1 Then Goto Kihagyleft
Fut = 1
'motorlépés jobb
Jled = 1
Bled=0
Celpos = Celpos + 1
'motorlépés jobb eddig
Kihagyleft:
Return
Right_:
If Fut = 1 Then Goto Kihagyright
Fut = 1
'motorlépés bal
Bled = 1
Jled=0
Celpos = Celpos - 1
'motorlépés bal eddig
Kihagyright:
Return
End
Csokkenes:
Temp = Ap - 1
Temp1 = Temp Mod 8
Select Case Temp1
Case Pos1 :
Portb.1 = 1
Portb.2 = 0
Portb.3 = 0
Portb.4 = 0
Case Pos2 :
Portb.1 = 1
Portb.2 = 1
Portb.3 = 0
Portb.4 = 0
Case Pos3 :
Portb.1 = 0
Portb.2 = 1
Portb.3 = 0
Portb.4 = 0
Case Pos4 :
Portb.1 = 0
Portb.2 = 1
Portb.3 = 1
Portb.4 = 0
Case Pos5 :
Portb.1 = 0
Portb.2 = 0
Portb.3 = 1
Portb.4 = 0
Case Pos6 :
Portb.1 = 0
Portb.2 = 0
Portb.3 = 1
Portb.4 = 1
Case Pos7 :
Portb.1 = 0
Portb.2 = 0
Portb.3 = 0
Portb.4 = 1
Case Pos8 :
Portb.1 = 1
Portb.2 = 0
Portb.3 = 0
Portb.4 = 1
End Select
Waitms 50
Ap = Ap - 1
Return
Novekedes:
Temp = Ap + 1
Temp1 = Temp Mod 8
Select Case Temp1
Case Pos1 :
Portb.4 = 1
Portb.3 = 0
Portb.2 = 0
Portb.1 = 0
Case Pos2 :
Portb.4 = 1
Portb.3 = 1
Portb.2 = 0
Portb.1 = 0
Case Pos3 :
Portb.4 = 0
Portb.3 = 1
Portb.2 = 0
Portb.1 = 0
Case Pos4 :
Portb.4 = 0
Portb.3 = 1
Portb.2 = 1
Portb.1 = 0
Case Pos5 :
Portb.4 = 0
Portb.3 = 0
Portb.2 = 1
Portb.1 = 0
Case Pos6 :
Portb.4 = 0
Portb.4 = 0
Portb.2 = 1
Portb.1 = 1
Case Pos7 :
Portb.4 = 0
Portb.3 = 0
Portb.2 = 0
Portb.1 = 1
Case Pos8 :
Portb.4 = 1
Portb.3 = 0
Portb.2 = 0
Portb.1 = 1
End Select
Waitms 50
Ap = Ap + 1
Return
End
Kód: Egész kijelölése
$crystal = 14745600
$regfile = "m88def.dat"
$baud = 9600
$hwstack = 64
$swstack = 20
$framesize = 80
Config Portd = Input
Config Portb = Output
Jled Alias Portb.6
Bled Alias Portb.7
Dim B As Byte
Dim Fut As Bit
Dim Ap As Word
Dim Celpos As Word
Dim Temp1 As Word
Dim Temp As Word
Ap = 32768
Celpos = 32768
Portb = &B00000011
Do
Fut = 0
B = Encoder(pind.4 , Pind.5 , Left_ , Right_ , 1)
Waitms 10
If Celpos < Ap Then Gosub Csokkenes
If Celpos > Ap Then Gosub Novekedes
Jled = 0
Bled = 0
If CelPos=AP then
Temp1 = Celpos Mod 8
Celpos = 32768 + Temp1
Ap = Celpos
End If
Loop
Left_:
If Fut = 1 Then Goto Kihagyleft
Fut = 1
'motorlépés jobb
Jled = 1
Bled=0
Celpos = Celpos + 1
'motorlépés jobb eddig
Kihagyleft:
Return
Right_:
If Fut = 1 Then Goto Kihagyright
Fut = 1
'motorlépés bal
Bled = 1
Jled=0
Celpos = Celpos - 1
'motorlépés bal eddig
Kihagyright:
Return
Csokkenes:
Temp = Ap - 1
Temp1 = Temp Mod 8
gosub Lepked
Waitms 50
Ap = Ap - 1
Return
Novekedes:
Temp = Ap + 1
Temp1 = Temp Mod 8
gosub Lepked
Waitms 50
Ap = Ap + 1
Return
Lepked:
Select Case Temp1
Case 0 :
Portb.4 = 1
Portb.3 = 0
Portb.2 = 0
Portb.1 = 0
Case 1 :
Portb.4 = 1
Portb.3 = 1
Portb.2 = 0
Portb.1 = 0
Case 2 :
Portb.4 = 0
Portb.3 = 1
Portb.2 = 0
Portb.1 = 0
Case 3 :
Portb.4 = 0
Portb.3 = 1
Portb.2 = 1
Portb.1 = 0
Case 4 :
Portb.4 = 0
Portb.3 = 0
Portb.2 = 1
Portb.1 = 0
Case 5 :
Portb.4 = 0
Portb.4 = 0
Portb.2 = 1
Portb.1 = 1
Case 6 :
Portb.4 = 0
Portb.3 = 0
Portb.2 = 0
Portb.1 = 1
Case 7 :
Portb.4 = 1
Portb.3 = 0
Portb.2 = 0
Portb.1 = 1
End Select
return
end
Prg-t átszabtam....
- Órajelet megadtam
- léptetési pozíció rutinba került
- ATMega88 lett a chip
- Temp nem volt definiálva
- Temp1 is Word típus lett
Eddig a lefordított kód ~1k:)
Üdv mindnkinek!
Hosszú idő után újra it vagyok.
Írtam egy egyszerű progit Tiny13-ba , léptetőmotor vezérlőre volt zükségem.
ez működik is szépen .
Anyi a szépséghibálya hogy programozás után nem lehet módosítani a programon mert a reset lábra szükség volt bemenetként .
De sebaj legalább működik
Most tervezem 2313-al PWM-es vezérlést mert így nagyon melegszenek a motorok.
Azt nem tudom hogyan lehetne életre kelteni a chip mind a 4 pwm-ezhető kimenetét?
Eddig 1 -et sikerült csak!
van ugye a 0a
a 0b
az 1a
és az 1b
eddig a pwm1a működik csak a többire ezt mondja a fordító hogy nem megfelelő utasítás (assigment error) ha jól értem.
Mi lehet a probléma vajon?
Ha valakit érdekel a Tiny 13 ra írt léptetőmotor vezérlő , szivesen közzé teszem!
Hosszú idő után újra it vagyok.
Írtam egy egyszerű progit Tiny13-ba , léptetőmotor vezérlőre volt zükségem.
ez működik is szépen .
Anyi a szépséghibálya hogy programozás után nem lehet módosítani a programon mert a reset lábra szükség volt bemenetként .
De sebaj legalább működik
Most tervezem 2313-al PWM-es vezérlést mert így nagyon melegszenek a motorok.
Azt nem tudom hogyan lehetne életre kelteni a chip mind a 4 pwm-ezhető kimenetét?
Eddig 1 -et sikerült csak!
van ugye a 0a
a 0b
az 1a
és az 1b
eddig a pwm1a működik csak a többire ezt mondja a fordító hogy nem megfelelő utasítás (assigment error) ha jól értem.
Mi lehet a probléma vajon?
Ha valakit érdekel a Tiny 13 ra írt léptetőmotor vezérlő , szivesen közzé teszem!