Stepper motor + analóg joystick

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
HPMaster
Bitmanipulátor
Hozzászólások: 138
Csatlakozott: 2008. március 10. hétfő, 6:00
Tartózkodási hely: Budapest IX. ker

Stepper motor + analóg joystick

HozzászólásSzerző: HPMaster » 2011. december 1. csütörtök, 20:07

Tisztelet az Uraknak!

Elég rég jártam már itt. Mondjuk az is igaz, hogy régen is atmeleztem már.
A minap belefogtam egy régóta húzott halasztott projektbe. Panelfúrót fogok csinálni, de akarok rá kézivezérlést is.
Stepper motor lesz vezérelve, a kézi vezérléshez pedig egy játékkonzol joysickjából kitermelt 2 potis vezérlő lett illesztve. Ez X-Y irányban egy-egy 10k-s ptit jelent.
A két poti megy két ADC-re.

A kérdés: milyen egyszerű módszerrel tudnám megoldani, hogy a léptetőmotorom, ami amúgy soros vezérlésű (unipoláris).

Milyen metódus alapján lehetne megcsinálni, hogy az adc értékének függvényében alakuljon a motor sebessége?

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3348
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2011. december 1. csütörtök, 21:11

Elég nagy feladat és jó sok megoldani való buktató van benne!
Mondjuk én inkább enkóderrel vezérelném, mivel azok már eleve impulzusokat produkálna!
A léptető motornak kel valami vezérlő! Ami lehet HW megoldású vannak hozzávaló IC áramkörök.
Amelyeknek csak Dir (irány) és Step (léptető impulzusok) kellenek.
Vagy lehet az AVRt programozni, hogy ellássa ezt a feladatot.
Ha pontos pozicionálást akarsz az analóg jel nem lesz OK ide.

Lenne még sok kérdés, de haladjunk csak apránként?

:idea:

Avatar
winnerbt
Chipfüstölő
Hozzászólások: 897
Csatlakozott: 2007. március 25. vasárnap, 6:00
Tartózkodási hely: Kecskemét

HozzászólásSzerző: winnerbt » 2011. december 1. csütörtök, 21:13

Alapban az ADC-értékeknél képezned kell egy holtsávot. Mondjuk 480-525-ig állónak veszi (középállású gondolom a poti). Ha 480 alatt van, akkor DIR=0 ha 525 felett van, akkor DIR=1 iránybitet már kell is állítani. A sebességállítás elég parlagias módon kezdetnek úgy csinálnám, hogy a ciklusba, ami adja a STEP jelet betennék egy WAITMS vagy WAITUS (attól függ, mit tud a motor sebességben), aminek a paramétere lefelé ADC, felfelé 1023-ADC lenne.
Természetesen ez idealizált állapot, gondoskodni kell az esetleges átfordulás kiküszöböléséről és a potik végkitérésekor biztos nem 0 és 1023 lesz az értéked, tehát a határokat be kell állítani, meg kell mérni.
JAni

Avatar
HPMaster
Bitmanipulátor
Hozzászólások: 138
Csatlakozott: 2008. március 10. hétfő, 6:00
Tartózkodási hely: Budapest IX. ker

HozzászólásSzerző: HPMaster » 2011. december 1. csütörtök, 21:28

Van egy ilyen progim. Ebből kiderül, hogy hogy kezelem a joy-t.

Egyenlőre csak az egyik tengely van kezelve. Mivel az ADC értékét osztom 10-el, így elég jól kezelhető a holtsáv.

Csak abban kellene a segítség, hogy ahogy az érték változik a középértéktől távolodva (jelen esetben 1024/10=102 vagy 0 irányva, a MOTORIRANY szubrutin meghívási gyakorisága is nőjjön, ezáltal a sebesség is.

A motor egy ULN2803-on keresztül kapja a GND vezérlést.

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

$regfile = "m16def.dat"
$crystal = 8000000
$baud = 19200

Config Adc = Single , Prescaler = Auto
Start Adc

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.0 , Rs = Portc.1
Config Portb = Output

Declare Sub Motorirany(irany As Byte)

Dim A As Word
Dim B As Word
Dim I As Byte
Dim Motor_irany As Byte

I = 1
Do
  A = Getadc(0)
  B = Getadc(1)

  A = A / 10


  If A < 52 Then
    Incr I
    If I > 8 Then I = 1
    Call Motorirany(i)
    Waitms 10
  End If

  If A > 52 Then
    Decr I
    If I = 0 Then I = 8
    Call Motorirany(i)
    Waitms 10
  End If

  If A = 52 Then Portb = 0

  Locate 1 , 1
  Lcd A ; "    " ; I ; "    "
  Locate 2 , 1
  Lcd B ; "    " ; I ; "    "

  Waitms 50
Loop
End                                                         'end program


Sub Motorirany(irany As Byte)
   Select Case Irany
   Case 1 : Portb = &B10000000
   Case 2 : Portb = &B11000000
   Case 3 : Portb = &B01000000
   Case 4 : Portb = &B01100000
   Case 5 : Portb = &B00100000
   Case 6 : Portb = &B00110000
   Case 7 : Portb = &B00010000
   Case 8 : Portb = &B10010000
   End Select

End Sub

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3348
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2011. december 1. csütörtök, 22:07

Tegyed az A,B vizsgálatát is Select Case-be és mennél nagyobb az értékük annál többször hívod meg For next ciklusban az „Motorirany(irany As Byte)” rutint. Mivel így csak 1-et lép minden hívásra.
8)

Avatar
HPMaster
Bitmanipulátor
Hozzászólások: 138
Csatlakozott: 2008. március 10. hétfő, 6:00
Tartózkodási hely: Budapest IX. ker

HozzászólásSzerző: HPMaster » 2011. december 1. csütörtök, 22:29

Mondjuk, miután az LCD-re írást kivettem, egy picit gyorsabb lett a rendszer :P

Avatar
HPMaster
Bitmanipulátor
Hozzászólások: 138
Csatlakozott: 2008. március 10. hétfő, 6:00
Tartózkodási hely: Budapest IX. ker

HozzászólásSzerző: HPMaster » 2011. december 1. csütörtök, 22:56

A megoldásom neémi sajátságos gondolkodás után:

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

  If A < 52 Then

    Incr I
    If I > lepesszam Then I = 1
    J = 51 - A
    J = 53 - J

    Call Motorirany(i)

  End If

  If A > 52 Then
    Decr I
    If I = 0 Then I = Lepesszam

    J = A - 53
    J = 52 - J

    Call Motorirany(i)
  End If


  Waitms J


2ms a max amin mehet és kb 52ms a min., amin még van értelme hajtani.

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3348
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2011. december 2. péntek, 10:34

Kezdésnek jó!
De semmi mást nem tudsz csinálni a fő ciklusban, mert akkor már elrontod az időzítéseket!
:?:


Vissza: “Bascom-AVR nyelvű programozás (AVR programozásának lehetőségei)”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég