Léptetőmotor vezérlés

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Nem.
Vagy egyik, vagy másik fut le - elfordítástól függően....
Avatar
Marvinn
Tranzisztorgyógyász
Hozzászólások: 153
Csatlakozott: 2008. július 24. csütörtök, 6:00

Hozzászólás Szerző: Marvinn »

Egyszerű lenne ha így lenne :) örülnék :) de sajnos nem...

az adatlapján rajzolja a négyszögjelet... meg megnéztem oscilloscoppal
eltolt négyszögjelek..

jobbra:
Kép

balra:
Kép
Avatar
vavi
Biztosítékgyilkos
Hozzászólások: 72
Csatlakozott: 2006. április 29. szombat, 6:00

Hozzászólás Szerző: vavi »

É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.
Avatar
Marvinn
Tranzisztorgyógyász
Hozzászólások: 153
Csatlakozott: 2008. július 24. csütörtök, 6:00

Hozzászólás Szerző: Marvinn »

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...
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

A kontakt enkóderre segítség lehet az is hogyha a kontakttal párhuzamosan 10..100 nF kondit raksz. Csökkenti a prellt.

10k felhúzóellenállás esetén 33..100nF javasolt. Igaz a gyors forgást ez sem javítja :P. De legalább lassú elmozdulás esetén javul.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

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 8)
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.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

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 :P )


A pozíciók emlékeztetőül:
0. 1000
1. 1100
2. 0100
3. 0110
4. 0010
5. 0011
6. 0001
7. 1001
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

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:

Kód: Egész kijelölése

If CelPos=AP then 
   temp1=celpos mod 8
   Celpos=32768+temp1
   AP =celpos
endif
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.
Avatar
Marvinn
Tranzisztorgyógyász
Hozzászólások: 153
Csatlakozott: 2008. július 24. csütörtök, 6:00

Hozzászólás Szerző: Marvinn »

Róbálkozok:
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
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Jelenposition nincs definiálva a programban.
Gyakorlatilag ugyanaz, mint az AP.


Illetve a 0 pozícióra állás sincs belerakva aDo-Loop ciklus végére.... Lsd 2vel korábbi hozzászólás.
Avatar
Marvinn
Tranzisztorgyógyász
Hozzászólások: 153
Csatlakozott: 2008. július 24. csütörtök, 6:00

Hozzászólás Szerző: Marvinn »

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..

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
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

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
A portot most nem tudod egyszerűsíteni..... Egybe kiírás esetén kezdőként áttekinthetetlen lesz.....

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:)
Avatar
Marvinn
Tranzisztorgyógyász
Hozzászólások: 153
Csatlakozott: 2008. július 24. csütörtök, 6:00

Hozzászólás Szerző: Marvinn »

Köszönöm szépen a türelmet!
Avatar
kefeur
Tranzisztorgyógyász
Hozzászólások: 187
Csatlakozott: 2008. február 17. vasárnap, 7:00

Hozzászólás Szerző: kefeur »

Üdv mindnkinek!
Hosszú idő után újra it vagyok.
:lol:
Í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!
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

pwm1a, pwm1b, pwma, pwmb az a hivatkozási alap.
Config timer1= és Config timer0 kell.



De: Fontos, hogy a Timer 1 is 8 bites módban legyen a PWMhez!
Válasz küldése