|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
Mikim Član
Pridružen-a: Ned 10 Okt 2010 1:11 Prispevkov: 141 Aktiv.: 0.86 Kraj: Brežice
|
Objavljeno: Sre Apr 16, 2014 7:56 pm Naslov sporočila: Arduino mini pro 5V 16Mhz krmilnik koračnega motorja |
|
|
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 |
|
|
skalpel Član
Pridružen-a: Tor 31 Jan 2012 19:46 Prispevkov: 432 Aktiv.: 2.92 Kraj: Šenčur
|
Objavljeno: Sre Apr 16, 2014 8:10 pm Naslov sporočila: |
|
|
Mogoče bi delalo, če bi uporabil navaden delay ukaz?
Koda: |
delay(1000) // počaka 1 sekundo
|
|
|
Nazaj na vrh |
|
|
Mikim Član
Pridružen-a: Ned 10 Okt 2010 1:11 Prispevkov: 141 Aktiv.: 0.86 Kraj: Brežice
|
Objavljeno: Sre Apr 16, 2014 8:25 pm Naslov sporočila: |
|
|
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 |
|
|
Peter123 Član
Pridružen-a: Tor 13 Jan 2009 15:34 Prispevkov: 1364 Aktiv.: 7.37 Kraj: Lj.
|
|
Nazaj na vrh |
|
|
Mikim Član
Pridružen-a: Ned 10 Okt 2010 1:11 Prispevkov: 141 Aktiv.: 0.86 Kraj: Brežice
|
Objavljeno: Čet Apr 17, 2014 8:36 pm Naslov sporočila: |
|
|
Ž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 |
|
|
Peter123 Član
Pridružen-a: Tor 13 Jan 2009 15:34 Prispevkov: 1364 Aktiv.: 7.37 Kraj: Lj.
|
Objavljeno: Pet Apr 18, 2014 7:18 am Naslov sporočila: |
|
|
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 |
|
|
Mikim Član
Pridružen-a: Ned 10 Okt 2010 1:11 Prispevkov: 141 Aktiv.: 0.86 Kraj: Brežice
|
Objavljeno: Sre Apr 23, 2014 1:37 pm Naslov sporočila: |
|
|
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 |
|
|
|
|
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
|