Stepper motor + analóg joystick
Stepper motor + analóg joystick
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?
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?
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?

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?
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
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
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.
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
A megoldásom neémi sajátságos gondolkodás után:
2ms a max amin mehet és kb 52ms a min., amin még van értelme hajtani.
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