www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Arduino UNO in krmilnik koračnega motorja
Pojdi na stran 1, 2  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Arduino sekcija
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
mravlcax
Član
Član



Pridružen-a: Sre 21 Feb 2007 19:19
Prispevkov: 299
Aktiv.: 1.34
Kraj: Ljubljana

PrispevekObjavljeno: Tor Jan 28, 2014 8:23 pm    Naslov sporočila:  Arduino UNO in krmilnik koračnega motorja Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
jnz
Član
Član



Pridružen-a: Pon 23 Mar 2009 22:11
Prispevkov: 112
Aktiv.: 0.57
Kraj: Ljubljana

PrispevekObjavljeno: Tor Jan 28, 2014 10:13 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
mravlcax
Član
Član



Pridružen-a: Sre 21 Feb 2007 19:19
Prispevkov: 299
Aktiv.: 1.34
Kraj: Ljubljana

PrispevekObjavljeno: Tor Jan 28, 2014 11:31 pm    Naslov sporočila:   Odgovori s citatom

@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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
PZUFIC
Vseved



Pridružen-a: Sob 17 Nov 2007 19:06
Prispevkov: 6987
Aktiv.: 32.63
Kraj: Rakek

PrispevekObjavljeno: Tor Jan 28, 2014 11:39 pm    Naslov sporočila:   Odgovori s citatom

Kdo se zacikla, program?
_________________
Ne čakaj, da se bo nekaj premaknilo pojdi in nekaj premakni.
Lp Primož
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran MSN Messenger - naslov
mravlcax
Član
Član



Pridružen-a: Sre 21 Feb 2007 19:19
Prispevkov: 299
Aktiv.: 1.34
Kraj: Ljubljana

PrispevekObjavljeno: Sre Jan 29, 2014 12:21 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
PZUFIC
Vseved



Pridružen-a: Sob 17 Nov 2007 19:06
Prispevkov: 6987
Aktiv.: 32.63
Kraj: Rakek

PrispevekObjavljeno: Sre Jan 29, 2014 12:37 am    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran MSN Messenger - naslov
Jaka57
Moderator
Moderator



Pridružen-a: Ned 12 Dec 2004 21:47
Prispevkov: 5820
Aktiv.: 24.56
Kraj: Grosuplje

PrispevekObjavljeno: Sre Jan 29, 2014 10:26 am    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
mravlcax
Član
Član



Pridružen-a: Sre 21 Feb 2007 19:19
Prispevkov: 299
Aktiv.: 1.34
Kraj: Ljubljana

PrispevekObjavljeno: Sre Jan 29, 2014 1:01 pm    Naslov sporočila:   Odgovori s citatom

@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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
PZUFIC
Vseved



Pridružen-a: Sob 17 Nov 2007 19:06
Prispevkov: 6987
Aktiv.: 32.63
Kraj: Rakek

PrispevekObjavljeno: Sre Jan 29, 2014 2:18 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran MSN Messenger - naslov
Jaka57
Moderator
Moderator



Pridružen-a: Ned 12 Dec 2004 21:47
Prispevkov: 5820
Aktiv.: 24.56
Kraj: Grosuplje

PrispevekObjavljeno: Sre Jan 29, 2014 2:59 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
mravlcax
Član
Član



Pridružen-a: Sre 21 Feb 2007 19:19
Prispevkov: 299
Aktiv.: 1.34
Kraj: Ljubljana

PrispevekObjavljeno: Sre Jan 29, 2014 3:37 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Jaka57
Moderator
Moderator



Pridružen-a: Ned 12 Dec 2004 21:47
Prispevkov: 5820
Aktiv.: 24.56
Kraj: Grosuplje

PrispevekObjavljeno: Sre Jan 29, 2014 5:00 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
mravlcax
Član
Član



Pridružen-a: Sre 21 Feb 2007 19:19
Prispevkov: 299
Aktiv.: 1.34
Kraj: Ljubljana

PrispevekObjavljeno: Čet Jan 30, 2014 1:01 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Jaka57
Moderator
Moderator



Pridružen-a: Ned 12 Dec 2004 21:47
Prispevkov: 5820
Aktiv.: 24.56
Kraj: Grosuplje

PrispevekObjavljeno: Čet Jan 30, 2014 1:23 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
mravlcax
Član
Član



Pridružen-a: Sre 21 Feb 2007 19:19
Prispevkov: 299
Aktiv.: 1.34
Kraj: Ljubljana

PrispevekObjavljeno: Pet Jan 31, 2014 5:13 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Arduino sekcija Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran 1, 2  Naslednja
Stran 1 od 2

 
Pojdi na:  
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