Arduin interrupt ENCODER

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 59
Geregistreerd: 19 Mrt 2015, 01:17

Arduin interrupt ENCODER

Berichtdoor hazanovo » 23 Aug 2018, 01:26

Hallo,

Voor een nieuwe robot arm wil ik graag chihai servo's gebruiken.


Zoiets als dit:

https://nl.aliexpress.com/store/product/Chihai-Motor-CHR-16G-050-ABHL-DC-6-V-12-V-7PPR-Encoder-Motor-Reducer-Carbon/3096049_32833392055.html?spm=a2g0z.search0104.3.99.13561b3fhg0gLT&ws_ab_test=searchweb0_0%2Csearchweb201602_1_10152_5724111_10151_10065_10344_10068_10342_5724211_10343_10340_10341_5724311_10696_5724011_10084_10083_10618_10304_10307_10820_10301_10821_10843_10059_100031_10103_5725011_10624_10623_10622_10621_10620_5724911%2Csearchweb201603_54%2CppcSwitch_5&algo_expid=827da9c9-824b-43e9-8908-d222ab4774f9-14&algo_pvid=827da9c9-824b-43e9-8908-d222ab4774f9&transAbTest=ae803_1&priceBeautifyAB=0

Ik gebruik hiervoor de Encoder.h bibliotheek. De encoder is aangesloten op een interrupt pinnen.
Mijn vraag is het volgende: is het mogelijk om een stuk of 6 van deze 7 of 11 PPR encoders op de arduino aan te sluiten zonder dat de arduino stappen mist ? Uitgaande van max 500hz pulse per motor.
Ik heb ook een Due liggen, die ik eventueel kan aansluiten als de arduino niet "snel" genoeg is.

Wanneer de servo's draaien moet de arduino natuurlijk in de gaten houden waar de motor zich bevind en digitalwrite(stop of start) sturen, dit zal voor alle 6 motoren gelden.

Ik heb een deel van de code bijgevoegd voor 1 motor. Uiteindelijk moeten er nog 5 bijkomen.

En wat denken jullie, is het makkelijk te doen voor arduino of moet ik een "snellere" micro controller nemen ?







cpp code
//mijn schone "loopje"

void loop() {

newPosition1 = myEnc.read();
//readWrite();
debug();
servoMove();
wait();
afremmen1();



}


void servoMove() {

toGo1();
currentMillis = millis();


if (newPosition1 > servo1[xCnt]) {


if (teGaan1 > 150) {
rem1State = 2;
}
else {
rem1State = 1;

}
rem1Dir = 0;


speed1 = newPosition1;
speed1 = map(speed1, newPos, oldPos, speedMin, speedMax);


dir = 0;
afremmen1();
}


//*****************************************************************************************
//*****************************************************************************************
//*****************************************************************************************


if (newPosition1 == servo1[xCnt]) {





rem1State = 0;
digitalWrite(forward1, HIGH);
digitalWrite(backward1, HIGH);
vrijgave1 = 1; // de timer aka wait() wordt nu aktief gemaakt
readWrite();
delay(1000);




}


//*****************************************************************************************
//*****************************************************************************************
//*****************************************************************************************



if (newPosition1 < servo1[xCnt]) {
rem1Dir = 1;

if (teGaan1 > 150) {
rem1State = 2;
}
else {
rem1State = 1;

}

speed1 = newPosition1;
speed1 = map(speed1, newPos, oldPos, speedMin, speedMax);


dir = 1;
afremmen1();
}





}

void toGo1() {

//hoeveel stappen nog te gaan

if (newPos > newPosition1) {
teGaan1 = newPos - newPosition1;
}
else {
teGaan1 = newPosition1 - newPos;
}

//=========================


}

void remSt1A(){

if(teGaan1<150 && rem1State==1){

if(rem1Cnt==0){

digitalWrite(forward1, HIGH);
digitalWrite(backward1, HIGH);

}

else if(rem1Cnt==1 && rem1Dir==0){

digitalWrite(forward1, HIGH);
digitalWrite(backward1, LOW);


}

else if(rem1Cnt==1 && rem1Dir==1){
digitalWrite(forward1, LOW);
digitalWrite(backward1, HIGH);

}

} //end (teGaan1<150 && rem1State==1){



}

void remSt1B(){
//++++++++++++++++STATE 2

if(rem1State==2){



if(rem1Dir==0){

digitalWrite(forward1, HIGH);
digitalWrite(backward1, LOW);


}

else if(rem1Dir==1){
digitalWrite(forward1, LOW);
digitalWrite(backward1, HIGH);

}


} //end rem2stae
}




void afremmen1() {

//////////State 1

currentMillis = millis();

//Overshooting van de motor zorgt voor -speed1, om dit tegen te gaan is de minimum aantal pulsen "10"

if (speed1 < 10) {
speed1 = 10;
}

//START DE PULS TREIN COUNTER, ALS TEgAAN LAGER IS DAN 150

if (currentMillis - rem1 > speed1) { //speed1 is de snelheid waarmee de PWM wordt geproduceerd
rem1Cnt++;
rem1 = currentMillis;
}
//anders volle snelheid
else {
rem1State = 2; // = volle snelheid aka remSt2
}


remSt1A(); //hunting fase servo1
remSt1B(); //run fase servo1


//PULSE TREIN COUNTER

if (rem1Cnt > 1) { //schakelt remSt
rem1Cnt = 0;
}

}

Advertisement

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Arduin interrupt ENCODER

Berichtdoor shooter » 29 Aug 2018, 11:12

op de arduino zitten maar 2 interupt ingangen, maar je kunt met een pcf8574 dat wel uitbreiden.
paul deelen
shooter@home.nl

Berichten: 59
Geregistreerd: 19 Mrt 2015, 01:17

Re: Arduin interrupt ENCODER

Berichtdoor hazanovo » 29 Aug 2018, 15:19

Hi ja je hebt gelijk, ik wilde mega gebruiken en daar zitten 6 ingangen. Arduino due heeft alle digitale pinnen als interrupt, waar het mij om gaat is dat de due geen pulsen mist als alle 6 encoders 6 * 1khz per sec sturen. Mvg

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Arduin interrupt ENCODER

Berichtdoor shooter » 03 Sep 2018, 11:20

Dat weet je nooit zeker, dus daar zul je bijvoorbeeld een hardware teller voor moeten zetten, dan ben je wel zeker.
bijv de MC14516
paul deelen
shooter@home.nl

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 5 gasten