Stepper motor + analóg joystick

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Avatar
HPMaster
Bitmanipulátor
Hozzászólások: 138
Csatlakozott: 2008. március 10. hétfő, 6:00

Stepper motor + analóg joystick

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

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: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

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
Elektronbűvölő
Hozzászólások: 907
Csatlakozott: 2007. március 25. vasárnap, 6:00

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

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

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

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: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

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

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

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

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

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: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

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