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 mini pro 5V 16Mhz krmilnik koračnega motorja

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Programiranje embedded sistemov
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
Mikim
Član
Član



Pridružen-a: Ned 10 Okt 2010 1:11
Prispevkov: 141
Aktiv.: 0.86
Kraj: Brežice

PrispevekObjavljeno: Sre Apr 16, 2014 7:56 pm    Naslov sporočila:  Arduino mini pro 5V 16Mhz krmilnik koračnega motorja Odgovori s citatom

Pozdravljeni vsem arduino uporabnikom, s tem tudi rabim vašo pomoč.
Imam v uporabi Arduino pro mini za krmiljenje koračnega motorja z signalom inkoderja. Krmilnik deluje odlično vendar pri sunkovitem pomiku inkoderja motor izgubi pulz in se upočasni. Zato sem zamenjal mini pro z DUE. Arduino DUE ima 84Mhz 32bit in naj bi bil problem rešen. Vendar se pojavit težava z programom.
Ne zna uporabljat funkcijo delay.h
Prilagam kodo, če bi kdo znal rešit problem

#define encoder_a 2 //keep this on and interrupt pin
#define encoder_b 3 //keep this on and interrupt pin
#define motor_step 6 //can be any pin
#define motor_direction 7 //can be any pin

#include <delay.h>
volatile long motor_position, encoder;

void setup () {
//set up the various outputs
pinMode(motor_step, OUTPUT);
pinMode(motor_direction, OUTPUT);

// then the encoder inputs
pinMode(encoder_a, INPUT);
pinMode(encoder_b, INPUT);
// enable pullup as we are using an open collector encoder
digitalWrite(encoder_a, HIGH);
digitalWrite(encoder_b, HIGH);

// encoder pin on interrupt 0 (pin 2)
attachInterrupt(0, encoderPinChangeA, CHANGE);
// encoder pin on interrupt 1 (pin 3)
attachInterrupt(1, encoderPinChangeB, CHANGE);
encoder = 0; //reseet the encoder position to 0
}

void loop() {
//do stuff dependent on encoder position here
//such as move a stepper motor to match encoder position
//if you want to make it 1:1 ensure the encoder res matches the motor res by dividing/multiplying
if (encoder > 0) {
digitalWrite(motor_direction, HIGH);// move stepper in reverse
digitalWrite(motor_step, HIGH);
digitalWrite(motor_step, LOW);
delayMicroseconds(600); //_delay_us(200); //modify to alter speed
motor_position++;
encoder = 0; //encoder--;
}
else if (encoder < 0) {
digitalWrite (motor_direction, LOW); //move stepper forward
digitalWrite (motor_step, HIGH);
digitalWrite (motor_step, LOW);
delayMicroseconds(600); //_delay_us(200); //modify to alter speed
motor_position--;
encoder = 0; //encoder++;
}
}

void encoderPinChangeA() {
if (digitalRead(encoder_a)==digitalRead(encoder_b)) {
encoder--;
}
else{
encoder++;
}
}

void encoderPinChangeB() {
if (digitalRead(encoder_a) != digitalRead(encoder_b)) {
encoder--;
}
else {
encoder++;
}
}
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
skalpel
Član
Član



Pridružen-a: Tor 31 Jan 2012 19:46
Prispevkov: 432
Aktiv.: 2.92
Kraj: Šenčur

PrispevekObjavljeno: Sre Apr 16, 2014 8:10 pm    Naslov sporočila:   Odgovori s citatom

Mogoče bi delalo, če bi uporabil navaden delay ukaz?

Koda:

delay(1000) // počaka 1 sekundo
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran MSN Messenger - naslov
Mikim
Član
Član



Pridružen-a: Ned 10 Okt 2010 1:11
Prispevkov: 141
Aktiv.: 0.86
Kraj: Brežice

PrispevekObjavljeno: Sre Apr 16, 2014 8:25 pm    Naslov sporočila:   Odgovori s citatom

skalpel je napisal/a:
Mogoče bi delalo, če bi uporabil navaden delay ukaz?

Koda:

delay(1000) // počaka 1 sekundo


Sem probal vse možnosti ampak po moje due ne podpira funcij delay.
#include <delay.h>
če pa to kodo izbrišem mi pa program nima napak, vendar ne deluje.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Peter123
Član
Član



Pridružen-a: Tor 13 Jan 2009 15:34
Prispevkov: 1364
Aktiv.: 7.37
Kraj: Lj.

PrispevekObjavljeno: Čet Apr 17, 2014 7:26 am    Naslov sporočila:   Odgovori s citatom

Ultimativna rešitev je da napišeš if zanko, nekaj v tem smislu:
int i
i=256
if(i>0) i--
else i=256

Opcij je več, če ti je čas z enim števcem prekratek ponoviš odštevanje z drugim števcem.
Tako je dejansko narejen tisti delay ki ga kličeš.
Google je bolši tolmač od mene:
http://www.wikihow.com/Delay-in-C
http://stackoverflow.com/questions/3930363/implement-time-delay-in-c
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Mikim
Član
Član



Pridružen-a: Ned 10 Okt 2010 1:11
Prispevkov: 141
Aktiv.: 0.86
Kraj: Brežice

PrispevekObjavljeno: Čet Apr 17, 2014 8:36 pm    Naslov sporočila:   Odgovori s citatom

Peter123 je napisal/a:
Ultimativna rešitev je da napišeš if zanko, nekaj v tem smislu:
int i
i=256
if(i>0) i--
else i=256

Opcij je več, če ti je čas z enim števcem prekratek ponoviš odštevanje z drugim števcem.
Tako je dejansko narejen tisti delay ki ga kličeš.
Google je bolši tolmač od mene:
http://www.wikihow.com/Delay-in-C
http://stackoverflow.com/questions/3930363/implement-time-delay-in-c


Živijo Peter,
sem probal vstavit te kode ampak imam kar nekaj napak.
Mi lahko preveriš z arduino 1.5.7 programom pa izberi DUE ploščo pa vnesi ta program.Ma sem začetnik in nujno rabim to zadevo. Dam za pir ko pridem v Lj.
Napaka:
: expected initializer before 'i'
: In function 'void setup()':
: error: 'encoder' was not declared in this scope
: In function 'void loop()':
: error: 'encoder' was not declared in this scope
: error: 'motor_position' was not declared in this scope
: error: 'motor_position' was not declared in this scope
In function 'void encoderPinChangeA()':
: error: 'encoder' was not declared in this scope
: error: 'encoder' was not declared in this scope
: In function 'void encoderPinChangeB()':
error: 'encoder' was not declared in this scope
error: 'encoder' was not declared in this scope
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Peter123
Član
Član



Pridružen-a: Tor 13 Jan 2009 15:34
Prispevkov: 1364
Aktiv.: 7.37
Kraj: Lj.

PrispevekObjavljeno: Pet Apr 18, 2014 7:18 am    Naslov sporočila:   Odgovori s citatom

Jaz ti nisem napisal programa za kopirat samo namignit sem ti hotel smer v katero lahko greš.
Prilepil sem ti tudi povezave do strani z delujočimi programi in razlagami.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Mikim
Član
Član



Pridružen-a: Ned 10 Okt 2010 1:11
Prispevkov: 141
Aktiv.: 0.86
Kraj: Brežice

PrispevekObjavljeno: Sre Apr 23, 2014 1:37 pm    Naslov sporočila:   Odgovori s citatom

Peter123 je napisal/a:
Jaz ti nisem napisal programa za kopirat samo namignit sem ti hotel smer v katero lahko greš.
Prilepil sem ti tudi povezave do strani z delujočimi programi in razlagami.


Zadevo sem usposobil, vendar ni bila napaka v arduino krmilnikih, napaka je v programu saj mi pri DUE impulsi še vedno gubijo pri hitrem pomiku inkoderja.
Sedaj spreminjam program, tako da izostavim funkcije digiralread, z direct port manipulation. Je kar zapleteno. A zgleda simpl.
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 -> Programiranje embedded sistemov Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
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: 48 dni


Powered by phpBB © 2001, 2005 phpBB Group