 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
mravlcax Član

Pridružen-a: Sre 21 Feb 2007 19:19 Prispevkov: 299 Aktiv.: 1.34 Kraj: Ljubljana
|
Objavljeno: Tor Jan 28, 2014 8:23 pm Naslov sporočila: Arduino UNO in krmilnik koračnega motorja |
|
|
Pozdravljeni!
Že nekaj časa se ukvarjam s kodo za Arduino UNO s katerim sem povezan na krmilnik koračnega motorja. Spodnja koda sicer deluje čisto vredu, ko uporabljam nov koračni motor, v primeru starega pa se pojavijo težave. Ko želim stari motor pognati z večjimi obrati le ta začne piskati in z malo pomoči se začne vrteti, če pa mu postopno zvišujem obrate pa ne rabi nobene pomoči.
"Hardware" je trenutno narejen tako, da imam za izbiranje hitrosti stikalni preklopnik na katerem so upori, ki služijo kot napetostni delilnik, vrednosti tega delilnika pa berem na analognem pinu Arduina, uporabljam še en izhod za frekvenco in enega za "enable" na krmilniku koračnega motorja.
Sama koda izgleda takole:
Koda: |
int selectorPin;
int numOfSteps;
float divider;
int enable = 5;
void setup()
{
//pin za enable
pinMode(enable, OUTPUT);
digitalWrite(enable, LOW);
//analogni pin za branje vrednosti stikalnega preklopnika
selectorPin = 0;
//stevilo preklopov stikalnega preklopnika
numOfSteps = 5;
//divider for decoding analog input
divider = 900.0 / numOfSteps;
}
void loop()
{
//divide and round the input as float
float selectorValueFloat = round(analogRead(selectorPin) / divider);
//cast to integer for e.g. indexing arrays
int selectorValue = selectorValueFloat;
if(selectorValueFloat == 0)
{noTone(3); digitalWrite(enable, LOW);}
if(selectorValueFloat == 1)
{tone(3, 500); digitalWrite(enable, HIGH);}
if(selectorValueFloat == 2)
{tone(3, 1100); digitalWrite(enable, HIGH);}
if(selectorValueFloat == 3)
{tone(3, 1850); digitalWrite(enable, HIGH);}
if(selectorValueFloat == 4)
{tone(3, 2500); digitalWrite(enable, HIGH);}
} |
Probal sem z "for" zanko v "if" stavkih, vendar se program potem "zacikla". Koda v "if" stavku je izgledala takole.
Koda: |
if(selectorValueFloat == 3)
{
digitalWrite(enable, HIGH);
for( x = 200, x <= 1850, x++)
{
tone(3, x);
delay(3);
}
}
|
Torej, prosil bi za kakšno idejo pri programu.
Lp,
Aleš |
|
Nazaj na vrh |
|
 |
jnz Član

Pridružen-a: Pon 23 Mar 2009 22:11 Prispevkov: 112 Aktiv.: 0.57 Kraj: Ljubljana
|
Objavljeno: Tor Jan 28, 2014 10:13 pm Naslov sporočila: |
|
|
Očitno motorja nista enaka, ali pa ima stari toliko povečano trenje v ležajih, da ne starta. Je pa povsem normalno da korakar ne starta pri maksimalni hitrosti, pri kateri sicer lahko teče. Problem je namreč v tem, da krmilnik zgenerira krmilni vzorec, ki mu mora korakar slediti brez izgube koraka, Če le pri enem vzorcu ne naredi koraka, se sinhronozacija izgubi in motor začne piskati.
Pravzaprav si pa iz opisa tudi ne predstavljam tvoje izvedbe krmilnika in bi bila kakšna skica prav dobrodošla.
LP
Janez |
|
Nazaj na vrh |
|
 |
mravlcax Član

Pridružen-a: Sre 21 Feb 2007 19:19 Prispevkov: 299 Aktiv.: 1.34 Kraj: Ljubljana
|
Objavljeno: Tor Jan 28, 2014 11:31 pm Naslov sporočila: |
|
|
@jnz Hvala za kratko razlago.
Dejansko bi rad v svoj program vstavil pospeševanje motorja brez, da bi se ta "zaciklal".
Lp,
Aleš |
|
Nazaj na vrh |
|
 |
PZUFIC Vseved


Pridružen-a: Sob 17 Nov 2007 19:06 Prispevkov: 6987 Aktiv.: 32.63 Kraj: Rakek
|
Objavljeno: Tor Jan 28, 2014 11:39 pm Naslov sporočila: |
|
|
Kdo se zacikla, program? _________________ Ne čakaj, da se bo nekaj premaknilo pojdi in nekaj premakni.
Lp Primož |
|
Nazaj na vrh |
|
 |
mravlcax Član

Pridružen-a: Sre 21 Feb 2007 19:19 Prispevkov: 299 Aktiv.: 1.34 Kraj: Ljubljana
|
Objavljeno: Sre Jan 29, 2014 12:21 am Naslov sporočila: |
|
|
PZUFIC je napisal/a: |
Kdo se zacikla, program? |
Ja.. mogoče je to malo napačen izraz Če uporabim še tisto for zanko znotraj if stavka (da bi dosegel pospeševanje motorja), potem motor nikoli ne začne delovati s konstantnimi obrati ampak pospeši, potem se upočasni, pa spet pospeši itd... s to for zanko tudi ne morem izbrati pozicije stop na preklopnem stikalu, katera naj bi izklopila enable in "clock" za krmilnik koračnika, verjetno tudi ne katere druge.
Lp,
Aleš |
|
Nazaj na vrh |
|
 |
PZUFIC Vseved


Pridružen-a: Sob 17 Nov 2007 19:06 Prispevkov: 6987 Aktiv.: 32.63 Kraj: Rakek
|
Objavljeno: Sre Jan 29, 2014 12:37 am Naslov sporočila: |
|
|
Ja program se v tisti for zanki v bistvu za en čas res zacikla, če temu lahko tako rečemo. Ker imaš glede na kodo branje preklopnika pred for zanko seveda zadeva med izvajanjem for zanke ne deluje.
Če prav razumem ti zgolj pošiljaš podatek za smer in pa pulze za hitrost z Arudinom nekemu krmilniku korakarjev? Če še ni tako bi jaz naredil tako, je pa res, da se na koračne motorje ne spoznam. Glede na to verjetno od motorja zahtevaš prehitro pospeševanje, torej povečaj pavzo v for zanki.
Kot drugo domnevam, da ne uporabljaš PWM izhoda? Namreč PWM izhod je neke vrste strojna zadeva programsko krmiljena. Ti v register vpišeš periodo, potem pa še željen delež, ko je signal visok in to potrdiš. Tako je namreč veliko bolje, ker ne zapravljaš procesorskega časa s pavzami in podobno.
Če pa že sedaj uporabljaš PWM se pa oproščam in vzemi kot brezpredmetno. _________________ Ne čakaj, da se bo nekaj premaknilo pojdi in nekaj premakni.
Lp Primož |
|
Nazaj na vrh |
|
 |
Jaka57 Moderator



Pridružen-a: Ned 12 Dec 2004 21:47 Prispevkov: 5820 Aktiv.: 24.56 Kraj: Grosuplje
|
Objavljeno: Sre Jan 29, 2014 10:26 am Naslov sporočila: |
|
|
Aleš, sicer mi brez sheme ni čisto jasno kaj želiš, kakorkoli, sam bi naredil to isto takole:
Koda: |
int selectorPin;
int numOfSteps;
float divider;
int enable = 5;
void setup()
{
//pin za enable
pinMode(enable, OUTPUT);
digitalWrite(enable, LOW);
//analogni pin za branje vrednosti stikalnega preklopnika
selectorPin = 0;
//stevilo preklopov stikalnega preklopnika
numOfSteps = 5;
//divider for decoding analog input
divider = 900.0 / numOfSteps;
}
void loop()
{
//divide and round the input as float
float selectorValueFloat = round(analogRead(selectorPin) / divider);
//cast to integer for e.g. indexing arrays
int selectorValue = selectorValueFloat;
switch (selectorValue) {
case 0:
noTone(3);
digitalWrite(enable, LOW);
break;
case 1:
tone(3, 500);
digitalWrite(enable, HIGH);
break;
case 2:
tone(3, 1100);
digitalWrite(enable, HIGH);
break;
case 3:
tone(3, 1850);
digitalWrite(enable, HIGH);
break;
case 4:
tone(3, 2500);
digitalWrite(enable, HIGH);
break;
default:
// ni potreben je opcija, če nobeden case ne ustreza potem lahko naredi to
// break sem dodal, ker pač nekaj mora biti za default, lahko bi dal
// npr. tone(3, 4000);...........
break;
}
} |
_________________ Lp, Jaka |
|
Nazaj na vrh |
|
 |
mravlcax Član

Pridružen-a: Sre 21 Feb 2007 19:19 Prispevkov: 299 Aktiv.: 1.34 Kraj: Ljubljana
|
Objavljeno: Sre Jan 29, 2014 1:01 pm Naslov sporočila: |
|
|
@jaka57
Hvala za kodo, sicer deluje enako kot moja.
Želim postopno zviševanje frekvence in ko dosežem željeno frekvenco hočem, da obstane ta željena frekvenca do spremembe na stikalnem preklopniku. Torej ko vstavim v case for zanko se motor ne ustavi v najvišji frekvenci ampak zopet začne s pospeševanjem.
Lp,
Aleš |
|
Nazaj na vrh |
|
 |
PZUFIC Vseved


Pridružen-a: Sob 17 Nov 2007 19:06 Prispevkov: 6987 Aktiv.: 32.63 Kraj: Rakek
|
Objavljeno: Sre Jan 29, 2014 2:18 pm Naslov sporočila: |
|
|
Mogoče najenostavneje narediš tako. S for zanko šteješ do vrednosti definirane na tvojem preklopniku in ko gre enkrat for zanka skozi preverjaš, če je prišlo do spremembe preklopnika recimo z if stavkom in v primeru da je še enkrat zaženeš for zanko, sicer pa jo preskočiš. _________________ Ne čakaj, da se bo nekaj premaknilo pojdi in nekaj premakni.
Lp Primož |
|
Nazaj na vrh |
|
 |
Jaka57 Moderator



Pridružen-a: Ned 12 Dec 2004 21:47 Prispevkov: 5820 Aktiv.: 24.56 Kraj: Grosuplje
|
Objavljeno: Sre Jan 29, 2014 2:59 pm Naslov sporočila: |
|
|
Aleš, program se ne zacikla, enostavno, ko je preklopnik v določeni poziciji, potem znova in znova dela isti FOR...NEXT.
Funkcija tone() ima lahko tudi tretji parameter tj. trajanje tona v ms, tako da tistega delaya ne potrebuješ.
Rešitev je, z dodatnimi spremenljivkami, torej, ko frekvenca doseže max vrednost, ne sme iti več v zanko FOR.
Pa še nekaj, definiral si spremenljivko int selectorValue, katere pa ne uporabljaš! _________________ Lp, Jaka |
|
Nazaj na vrh |
|
 |
mravlcax Član

Pridružen-a: Sre 21 Feb 2007 19:19 Prispevkov: 299 Aktiv.: 1.34 Kraj: Ljubljana
|
Objavljeno: Sre Jan 29, 2014 3:37 pm Naslov sporočila: |
|
|
Hvala vam za nasvete! Sem naredil tako da sem naredil še dodatne pogoje za FOR zanke, v primeru da izberem hitrost prej preden prižgem napravo. Še vedno se mi pojavi en manjši problem in sicer ko grem iz pozicije 2 v pozicijo 3 motor pospešuje do 1850Hz medtem ko iz pozicije 4 v 3 deluje nromalno...
Koda: |
int selectorPin;
int numOfSteps;
float divider;
int enable = 5;
int has1 =1;
int has2 =2;
int has3 =3;
int has4 =4;
int x;
void setup()
{
//pin za enable
pinMode(enable, OUTPUT);
digitalWrite(enable, LOW);
//analogni pin za branje vrednosti stikalnega preklopnika
selectorPin = 5;
//stevilo preklopov stikalnega preklopnika
numOfSteps = 5;
//divider for decoding analog input
divider = 930.0 / numOfSteps;
}
void loop()
{
//divide and round the input as float
float selectorValueFloat = round(analogRead(selectorPin) / divider);
//cast to integer for e.g. indexing arrays
int selectorValue = selectorValueFloat;
switch (selectorValue) {
case 0:
noTone(3);
digitalWrite(enable, LOW);
has1 = 1;
break;
case 1:
digitalWrite(enable, HIGH);
if(has1 == 1)
{
for(x = 200; x<=1850; x++)
{
tone(3,x);
delay(3);
has1 = 2;
has2 = 2;
}
}
else
{
tone(3, 1850);
}
break;
case 2:
digitalWrite(enable, HIGH);
if(has2 == 2)
{
for(x = 200; x<=1100; x++)
{
tone(3,x);
delay(3);
has2 = 1;
has3 = 3;
has1 = 1;
}
}
else
{
tone(3, 1100);
}
break;
case 3:
digitalWrite(enable, HIGH);
if(has3 == 3)
{
for(x = 100; x<=555; x++)
{
tone(3,x);
delay(3);
has2 = 2;
has3 = 2;
has4 = 4;
}
}
else
{
tone(3, 555);
}
break;
case 4:
digitalWrite(enable, HIGH);
if(has4 == 4)
{
for(x = 200; x<=1850; x++)
{
tone(3,x);
delay(3);
has3 = 3;
has4 = 3;
}
}
else
{
tone(3, 1850);
}
break;
}
}
|
Lp,
Aleš |
|
Nazaj na vrh |
|
 |
Jaka57 Moderator



Pridružen-a: Ned 12 Dec 2004 21:47 Prispevkov: 5820 Aktiv.: 24.56 Kraj: Grosuplje
|
Objavljeno: Sre Jan 29, 2014 5:00 pm Naslov sporočila: |
|
|
Pa si prepričan, da so vrednosti na analognem vhodu res take kot misliš ti oz. kaj prebere ADC?
Vključi serijski port in izpisuj spremenljivko selectorValue, da boš prepričan ali so int vrednosti za CASE res take kot misliš ti. _________________ Lp, Jaka |
|
Nazaj na vrh |
|
 |
mravlcax Član

Pridružen-a: Sre 21 Feb 2007 19:19 Prispevkov: 299 Aktiv.: 1.34 Kraj: Ljubljana
|
Objavljeno: Čet Jan 30, 2014 1:01 pm Naslov sporočila: |
|
|
To je bila prva stvar, ki sem jo naredil in sicer, da sem prebral vrednosti stikala. Sicer pa so te vrednosti: 0, 203, 407, 612, 818. Sem pa probal še z enim identičnim preklopnim stikalom in zadeva deluje brez problema.
Lp,
Aleš |
|
Nazaj na vrh |
|
 |
Jaka57 Moderator



Pridružen-a: Ned 12 Dec 2004 21:47 Prispevkov: 5820 Aktiv.: 24.56 Kraj: Grosuplje
|
Objavljeno: Čet Jan 30, 2014 1:23 pm Naslov sporočila: |
|
|
Aleš, zakaj si se odločil tipat stikalo na tak način. Pri vseh digitalnih pinih, ki jih imaš na razpolago, ne vidim v tem smisla.
Pa še nekaj, ADC lepo pleše in zagotovo tudi vhod na analognem pinu ni vedno to, kar bi hotel.
Mislim, da tudi tudi funkcija float selectorValueFloat ni ravno potrebna.
Poglej si malo, kako dela celoštevilčna aritmetika, kajti ADC ti vrne INT vrednost (0-1023) in če to vrednost deliš s tvojim dividerjem, ki je tudi INT, je rezultat še vedno INT.
V glavnem, float aritmetike se izogibam, če res ni nujno potrebna. _________________ Lp, Jaka |
|
Nazaj na vrh |
|
 |
mravlcax Član

Pridružen-a: Sre 21 Feb 2007 19:19 Prispevkov: 299 Aktiv.: 1.34 Kraj: Ljubljana
|
Objavljeno: Pet Jan 31, 2014 5:13 pm Naslov sporočila: |
|
|
Jaka hvala za namig glede spremenljiv. Sicer sem izbral to vrsto stikala oziroma izbire, ker sem želel to narediti z attiny85, ampak mi potem tone funkcija ni delovala skupaj s floatom. Potem je pa tukaj še trma, ko se v nekaj zapičiš in želiš, da na tak način deluje.
Lp,
Aleš |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 495 dni
Powered by phpBB © 2001, 2005 phpBB Group
|