Problemen met aansturen stappenmotor

Ik heb een probleem met het aansturen van mijn stappenmotor.
De opstelling:
Arduino -> DM856 steppermotor driver -> Joy-It Nema34-01 stappenmotor.
Het geheel voed ik met een Meanwell SPV-300-24 power supply.
Zoals in het filmpje te zien is, wil de stappenmotor niet rond draaien. Maar in plaats daarvan trilt deze en gaat heel ongelijk stapjes naar voor en terug.
Eerste instantie dacht ik dat ik een fout had gemaakt in de bedrading (spoelen verkeerd aangesloten). Maar bij naderinzien, bleek dit toch te kloppen.
In mijn programma heb ik ook een analoge ingang toegewezen om zo het toerental te wijzigen.
In het filmpje is te zien dat deze daar wel op reageert maar dit alleen te merken in het geluid wat de motor maakt.
https://youtu.be/uZBSho5WngY

Het is me eerder op de avond wel gelukt om in een bepaalde stand van de trimmer, de motor te laten draaien. Maar dit was ook enkel mogelijk in deze specifieke stand. Een tikkie links of rechtsom op de trimmer resulteerde weer in het gedrag wat te zien is in het filmpje.
Tijdens het opnemen, was het helemaal niet meer mogelijk om de motor rond te laten draaien.
Betreft de stappenmotor controller, heb ik alle dipswitches op 'on' gezet.
Want ik wil simpel beginnen met 200 stappen per omwenteling. En als ik het goed begrijp moet ik SW5 t/m SW8 daarom hoog maken.
Verder wil ik het totale vermogen uit de controller halen. Hierdoor SW1 t/m SW3 hoog. En S4 heb ik hoog gemaakt vanwege het volle vermogen.

Wat zie ik over het hoofd, of wat doe ik fout?

Hieronder mijn gebruikte code:

c code:

/*
  Stepper Motor Test
  stepper-test01.ino
  Uses ACT DM856 or simular Stepper Driver Units
  Has speed control & reverse switch
 */

// Defin pins
int reverseSwitch = 2; // Endswitch for reverse
int driverPUL = 7; // PUL- pin
int driverDIR = 6; // DIR- pin
int spd = A0; //Potentiometer

// Variables
int pd=500; //Pulse Delay period
boolean setdir = LOW; // Set Direction

// Interrupt Handler

void revmotor (){

  setdir = !setdir;

}



 void setup() {

  pinMode (driverPUL, OUTPUT);
  pinMode (driverDIR, OUTPUT);
  attachInterrupt(digitalPinToInterrupt(reverseSwitch), revmotor, FALLING);

}

void loop() {

  pd = map((analogRead(spd)),0,1023,2000,50);
  digitalWrite(driverDIR,setdir);
  digitalWrite(driverPUL,HIGH);
  delayMicroseconds(pd);
  digitalWrite(driverPUL,LOW);
  delayMicroseconds(pd);
 

}

Instellen op 800 stappen per revolution zoals in het filmpje van DroneBot .

buckfast_beekeeper

Golden Member

Zet SW 4 terug op off. Dit is de houd stroom. Op maximaal zorgt die alleen voor warmte. Ik zou ook eerder >36V gebruiken voor dit soort motor en eerder een 3 phase. Maar daar is je probleem niet mee opgelost.

Welke frequentie haal je nu? 200kHz is de maximale frequentie volgens act motor. Ze geven een minimale spanning van 24V en maximaal 80V. Typisch 48V. Een SP-750-48 lijkt me de ideale voeding voor 1 motor.

Punt 4 van bladzijde 5 van de driver datasheet al geprobeerd? Lees ook een keer de datasheet van de Leadshine DM852. Veel uitgebreider dan die van act motor en waarschijnlijk gaat het over dezelfde driver. De DIR moet 5µs stabiel hoog of laag zijn voor de PUL pulsen beginnen. De PUL pulsen moeten minimaal 2,5µs hoog en laag zijn. Dus minimaal 5µs lang. Haal je het minimale hoog voltage van 3,5V op je arduino uitgang? Voed je de arduino uit dezelfde voeding? Kakt deze niet in? De driver aangesloten met voldoende dikke draden? Ik zou voor minimaal 2,5mm2 gaan.

Van Lambiek wordt goede geuze gemaakt.

Haal de "reversing" code eens weg. Als die perongeluk triggert ben je de sjaak.

Je zou met je potmeter de snelheid lineair willen regelen. Door de delay linair te regelen werkt dat niet.

c code:

delay = 2000*1023 / pd;

zou wat dat betreft beter zijn. (even uitkijken dat 2000*1023 niet in een 16-bit integer past).

Met "fullstep" is de max step frequentie in de eerste instantie iets van 300Hz. een keertje VEEL langzamer gaan (delay * 100 of zelfs *1000) om te kijken wat er dan gebeurt is een manier om informatie te verzamelen voor wat er aan de hand is....

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Als je je motor wat sneller wilt laten lopen zul je toch ook een ramp-up en down moeten doen anders stallt hij.
Wat je in het filmpje ziet lijkt daar ook wel op.

Ik ben begonnen met de tip van rew om de reversing code weg te halen. Daar leek het grote probleem in te zitten.
Ik heb dip switch 4 op off gezet.
De as van de motor moet 45 rpm gaan draaien. Wanneer ik dit terug reken met stappen van 200, dan zou de periode van de pulse 150Hz moeten zijn.
Uiteindelijk is het niet de bedoeling om de snelheid te regelen. Maar deze moet dus fixed zijn op 150Hz. Voorlopig nog even zonder terugkoppeling van een encoder of iets dergelijks.
De potmeter had ik er even inzitten om meer wegwijs te maken in het aansturen van deze motor.
Wat ik wel nog zie is bij het opdraaien van de potmeter naar een hoger toerental, dan begint deze wel weer te schokken. En uiteindelijk draait deze niet meer. Maar dan heb ik het nog niet over een echt hoog toerental. Dit begint al bij om en nabij de 500Hz. Zou dat dan te maken kunnen hebben met die ramp-up en down time?
Of zit er toch nog iets niet lekker in de aansturing?

Betreft de pulsen, die zijn dus lang zat hoog en laag. De arduino uitgang blijft ook netjes 5V bij hoog. Resp. 3,33ms hoog en 3,33ms laag.

En dan alsnog die reverse functie. Ik heb het nu even software matig gedaan. Ik laat de motor 1 rondje linksom draaien, en vervolgens 2 rondjes rechtsom. Dit blijft zich herhalen. Maar ik de praktijk komen straks 2 eindschakelaars die er voor moeten zorgen dat het karretje, die aangedreven wordt door de stappenmotor, stopt wanneer deze schakelaar geactiveerd wordt en vervolgens de andere kant op gaat draaien totdat deze weer de andere eindschakelaar tegenkomt.
Op zich allemaal niet zo spannend, maar hoe kan ik er dan voor zorgen dat deze functie geen problemen op gaat leveren met het aansturen van de motor?

Op zich wel raar want ik heb gekeken naar dit filmpje: https://www.youtube.com/watch?v=iY_4YOlpqyI en heb in het begin de code overgenomen van de beste man, maar deze lijkt al mijn problemen niet te hebben. Al had ik wel verwacht dat hij last zou hebben van contactdender op zijn schakelaar voor de reversing. En dit is ook duidelijk te zien. Maar goed bij hem gaat het optoeren (en naar een hoge snelheid) wel goed. En ook het omkeren (op de contactdender issue na dan)ook.

Tja, een stappenmotor zorgt voor een magnetisch veld zodat de rotor in een bepaalde positie gehouden wordt. Maar die positie is niet uniek. Er zijn er vijftig per omwenteling. Geef je dan een pulsje dan verschuift de positie waar ie heen wil/wil blijven. Geef je nu 6ms later al weer een volgend pulsje dan kan het zijn dat ie liever "achteruit" naar de dichtst bijzijnde "gewenste positie" gaat dan vooruit naar de positie dat jij had gewild.

Eigenlijk is het zo:

code:

      *
2101210121012101210121

Hij wil naar het laagste punt lopen: de nul. Als je 1 pulsje geeft, dan krijg je:

code:

      *
12101210121012101210121

De motor staat nu bij de 1 en ziet "2" (wil ie niet heen) en 0 naast zich, daar wil ie wel heen.

Geef je nu snel nog een pulsje staat de motor op de twee en weet niet welke kant ie op moet.

Anyway. Als je begint met bewegen is het verstandig om de puls frequentie zeg bij 10pulsen per seconde te laten beginnen en "langzaam" naar die 150 pulsen per seconde op te laten lopen.

Ook het "software matig van richting veranderen vind ik geen goed plan. Dan krijg je dus een richtings verandering terwijl ie al aan het bewegen is. Nog moeilijker om direct te volgen. Eerst gewoon "1 kant op kunnen draaien."

Het kan best dat je denkt: Dat moet ik in 1x goed kunnen schrijven, maar als dan bij het testen niet werkt, moet je (tijdelijk) alle "ingewikkelde" dingen er uit slopen om te zoeken waar het probleem zit.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Begrijp ik het goed als je eigenlijk wilt zeggen dat ik gebruik moet maken van een Ramp up en ramp down tijd?
Anders kan het zijn dat ie paar stappen mist en daardoor raar gedrag gaat vertonen. Klopt dat?

buckfast_beekeeper

Golden Member

Klopt. Met een auto vertrek je ook niet aan 120km/h. Hoe snel je kan accelereren en afremmen is afhankelijk van de inertie. Een grote en zware motor ga je minder snel op topsnelheid krijgen.

Van Lambiek wordt goede geuze gemaakt.
Lambiek

Special Member

Als je haar maar goed zit, GROETEN LAMBIEK.

Als je die interrupt wil gebruiken denk ik dat je hem op output high met pullup moet zetten, mischien liever nog een externe pullup van 10k of zo.
Anders pik je alleen maar storing op.
Ik heb ooit wel eens een programmaatje gemaakt met acceleratie en deceleratie wat voor mij goed werkte.

c code:


unsigned int nsteps=4800, // totaal aantal stappen
              asteps=500, // aantal stappen voor acceleratie deceleratie
              steptime, acctime,i,d;
unsigned long startspeed=62,accspeed,inc,topspeed=5000;
const int dirPin=6, stepPin = 7, startPin = 3;
void setup() 
{
nsteps=nsteps-2*asteps;
if(nsteps<0) {
  asteps=nsteps/2;
  nsteps=0;
}
inc=(topspeed-startspeed)/asteps;
steptime=1000000/topspeed;
pinMode(dirPin, OUTPUT);
digitalWrite(dirPin,LOW);
pinMode(stepPin, OUTPUT);
digitalWrite(stepPin,LOW);
pinMode(startPin,INPUT_PULLUP);
digitalWrite(startPin, HIGH);       // turn on pullup resistors
}

void loop() 
{
while(digitalRead(startPin) == LOW);  // wait for startpulse
accspeed=0;
for(i=0;i<asteps;i++) // accelerate
{
  digitalWrite(stepPin,HIGH);
  delayMicroseconds(10);
  digitalWrite(stepPin,LOW);
  accspeed +=inc;
  d=1000000/accspeed;
  delayMicroseconds(d); 
}
for(i=0;i<nsteps;i++) // continuous run
{
  digitalWrite(stepPin,HIGH);
  delayMicroseconds(10);
  digitalWrite(stepPin,LOW);
  delayMicroseconds(steptime);
}
accspeed=topspeed;  // decelerate
for(i=0;i<asteps;i++) 
{
  digitalWrite(stepPin,HIGH);
  delayMicroseconds(10);
  digitalWrite(stepPin,LOW);
  accspeed -=inc;
  d=1000000/accspeed;  
  delayMicroseconds(d); 
}
}

Toch heb ik het idee dat de draden verkeerd zitten in je schema staat rood, groen, geel en blauw in die volgorde en op de controller heb je aangesloten rood, groen, blauw en geel.

Op 10 november 2020 16:11:26 schreef benleentje:
Toch heb ik het idee dat de draden verkeerd zitten in je schema staat rood, groen, geel en blauw in die volgorde en op de controller heb je aangesloten rood, groen, blauw en geel.

Ik heb dit voor de goede orde gewijzigd, maar levert geen resultaat.

Op 10 november 2020 15:48:49 schreef floppy:
Als je die interrupt wil gebruiken denk ik dat je hem op output high met pullup moet zetten, mischien liever nog een externe pullup van 10k of zo.
Anders pik je alleen maar storing op.
Ik heb ooit wel eens een programmaatje gemaakt met acceleratie en deceleratie wat voor mij goed werkte.

c code:


unsigned int nsteps=4800, // totaal aantal stappen
              asteps=500, // aantal stappen voor acceleratie deceleratie
              steptime, acctime,i,d;
unsigned long startspeed=62,accspeed,inc,topspeed=5000;
const int dirPin=6, stepPin = 7, startPin = 3;
void setup() 
{
nsteps=nsteps-2*asteps;
if(nsteps<0) {
  asteps=nsteps/2;
  nsteps=0;
}
inc=(topspeed-startspeed)/asteps;
steptime=1000000/topspeed;
pinMode(dirPin, OUTPUT);
digitalWrite(dirPin,LOW);
pinMode(stepPin, OUTPUT);
digitalWrite(stepPin,LOW);
pinMode(startPin,INPUT_PULLUP);
digitalWrite(startPin, HIGH);       // turn on pullup resistors
}

void loop() 
{
while(digitalRead(startPin) == LOW);  // wait for startpulse
accspeed=0;
for(i=0;i<asteps;i++) // accelerate
{
  digitalWrite(stepPin,HIGH);
  delayMicroseconds(10);
  digitalWrite(stepPin,LOW);
  accspeed +=inc;
  d=1000000/accspeed;
  delayMicroseconds(d); 
}
for(i=0;i<nsteps;i++) // continuous run
{
  digitalWrite(stepPin,HIGH);
  delayMicroseconds(10);
  digitalWrite(stepPin,LOW);
  delayMicroseconds(steptime);
}
accspeed=topspeed;  // decelerate
for(i=0;i<asteps;i++) 
{
  digitalWrite(stepPin,HIGH);
  delayMicroseconds(10);
  digitalWrite(stepPin,LOW);
  accspeed -=inc;
  d=1000000/accspeed;  
  delayMicroseconds(d); 
}
}

Ik had de schakelaar extern al uitgevoerd met ene pullup weerstand. Ik zal eens gaan kijken hoe jij het doet in je programma. Bedankt daarvoor..

Ik probeer je code te begrijpen floppy. Maar ik zit er nog niet ver genoeg in de programmeer omgevingen. Excuses als ik onnozele vragen stel. Ik ben je al kwijt onder het Void setup stukje. Maar als ik dan verder ga kijken in je loop, probeer ik te begrijpen wat je doet. En dat is volgens mij als volgt:
Je wacht tot input 3 hoog wordt. Zodra deze hoog is, start je procedure.
Je doorloopt de acceleratietijd 500 keer. En daarna ga je naar je continueloop. Deze duurt 4800 stappen. En vervolgens weer aftoeren met 500 stappen. Correct me if i am wrong.
Maar wat me opvalt, is dat je de positieve flank steeds op 10us laat staan en enkel de negatieve flank uitrekt of inkort.
Waarom wordt dat gedaan in plaats van de zowel de positieve als de negatieve flank in te korten of uit te rekken?
Ik heb hierbij een filmpje gemaakt van mijn scoop, wat ik meet op de StepPin. Hierin te zien dat elke positieve flank 10us duurt.
https://youtu.be/FyLf3OnSAqU

Wat je vertelt is helemaal correct.
Waarom een puls van 10us? Dat is voor elke stepperdriver lang genoeg.
Het eerste stukje is om het totaal aantal stappen op te delen in een start continue en stop gedeelte.
Als het totaal aantal stappen kleiner is dan het start+stopgedeelte doe ik alleen dat stuk.
Dat is hier eigenlijk niet nodig omdat ik een vaste waarde heb opgegeven maar het is de bedoeling om die in te kunnen voeren.
Verder als je de steptijd lineair veranderd krijg je geen lineaire snelheidsverandering. Daarom zit er die

c code:

d=1000000/accspeed;

in.

Ik heb net jou programma eens geprobeerd in mijn setup, maar dan faalt de meanwell voeding. Ik denk dat deze dan in protectie schiet. Wat op zich apart is, aangezien dit een 300W voeding is.
Kan het zijn dat de schakelfrequentie te hoog is voor de door mijn gebruikte stappen motor?
En wat me verder opvalt, is wanneer ik de motor aansluit, dan kijkt deze ook niet meer naar start commando's op mijn digitale inputs. Ook met jou programma begint de motor gelijk te draaien en dus uiteindelijk schiet mijn voeding in protectie.
Wanneer ik de motor loskoppel, dan wacht deze netjes op het startcommando wat ik geef. Dat is ook te zien in het vorige filmpje.

[Bericht gewijzigd door Ricotjuh op 11 november 2020 12:07:09 (40%)]

Hmmm strange.. nu bij de volgende test wacht deze wel netjes op mijn start commando. Maar in het volgende filmpje is wel te zien dat de voeding uitschakelt. De motor accelereert maar loopt snel vast..
https://youtu.be/aInY_-6Dgk8

Lambiek

Special Member

Probeer nu eerst eens met een simpel programma om je motor te laten lopen, dan kun je in iedergeval zien of alles goed is aan gesloten.

Nu doe je maar wat en je komt geen stap verder.

Staat je stroom niet te hoog?

Als je haar maar goed zit, GROETEN LAMBIEK.

Dat alles klinkt wel een beetje vreemd, zeker dat je voeding eruit klapt. Nu is een originele DM856 van Leadshine en jij hebt een goedkopere van ACT motors.
Mischien is die driver gewoon niet goed.
probeer ook eens die driver op 8x microstappen te zetten dus
sw 5-8 op off-off-on-on.

Ik kan de motor wel laten draaien.. Maar dan op lagere snelheid. In principe is dat goed voor mijn toepassing, aangezien deze maar 45rpm hoeft te draaien. Dat werkt wel. Alleen hogere snelheden, dan gaat hij de fout in. Maar ik wil voor mezelf ook de mogelijkheid bieden om sneller te kunnen draaien. Vandaar deze test en vragen.

Op 11 november 2020 12:24:24 schreef floppy:
Dat alles klinkt wel een beetje vreemd, zeker dat je voeding eruit klapt. Nu is een originele DM856 van Leadshine en jij hebt een goedkopere van ACT motors.
Mischien is die driver gewoon niet goed.
probeer ook eens die driver op 8x microstappen te zetten dus
sw 5-8 op off-off-on-on.

Ik heb de driver via Reichelt besteld. Geen idee of er veel verschillen zitten in de door jou genoemde.
Ik zal eens testen met 8x micorsteps

Lambiek

Special Member

Op 11 november 2020 12:28:28 schreef Ricotjuh:
Ik kan de motor wel laten draaien.. Maar dan op lagere snelheid. In principe is dat goed voor mijn toepassing, aangezien deze maar 45rpm hoeft te draaien. Dat werkt wel.

Waar heb je de stroom op staan?

Alleen hogere snelheden, dan gaat hij de fout in. Maar ik wil voor mezelf ook de mogelijkheid bieden om sneller te kunnen draaien. Vandaar deze test en vragen.

Voor een hogere snelheid moet de spanning ook omhoog, dan is die 24VDC niet genoeg denk.

Je voeding moet in ieder geval zwaar genoeg zijn, dus ik snap niet waarom je voeding uitschakelt in het filmpje. Je driver zou eerder een fout moeten geven dan je voeding. Nu is het wel zo dat een geschakelde voeding een hekel heeft aan inductieve belastingen.

Heb je nog extra weerstanden tussen je Arduino en driver?

Als je haar maar goed zit, GROETEN LAMBIEK.

Op 11 november 2020 12:24:24 schreef floppy:
Dat alles klinkt wel een beetje vreemd, zeker dat je voeding eruit klapt. Nu is een originele DM856 van Leadshine en jij hebt een goedkopere van ACT motors.
Mischien is die driver gewoon niet goed.
probeer ook eens die driver op 8x microstappen te zetten dus
sw 5-8 op off-off-on-on.

Ik heb de driver ingesteld op 8x microstappen zoals je hebt aangegeven. Dan werkt hij wel.
Ik heb ook getest met 4x microstappen. Dus on-off-on-on. Dit gaat ook goed.
Maar zodra ik de volgende stap maak, dus vanaf 400 pulse/rev dan gaat het fout. Dan draait de motor niet of niet goed rond.
Bij 200 stappen schakelt de voeding uit zoals al eerder is gezien.

Op 11 november 2020 13:17:49 schreef Lambiek:
[...]
Waar heb je de stroom op staan?

[...]
Voor een hogere snelheid moet de spanning ook omhoog, dan is die 24VDC niet genoeg denk.

Je voeding moet in ieder geval zwaar genoeg zijn, dus ik snap niet waarom je voeding uitschakelt in het filmpje. Je driver zou eerder een fout moeten geven dan je voeding. Nu is het wel zo dat een geschakelde voeding een hekel heeft aan inductieve belastingen.

Heb je nog extra weerstanden tussen je Arduino en driver?

Wat bedoel je precies met, waar heb je de stroom op staan? Bedoel je van de driver? Deze staat op 5.6A. De hoogste stap.

Verder zitten er geen weerstanden tussen de driver en de uitgangen van de arduino.