Skocz do zawartości
wmaker

Obniżenie strat cieplnych silnika krokowego.

Pomocna odpowiedź

Witam, po pierwszym (w życiu) uruchomieniu silnika krokowego KH56JM2U014A05 Japan Servo przy pomocy Arduino + DRV8825 + FORBOT jestem zachwycony :).

Kręci jak mu każe - władza upaja 😉

Silnik unipolarny podłączony czterem skrajnymi wyjściami cewek (2 środkowe odczepy wolne) DRV 8825 ustawiony na 32 mikrokroki zasilanie 12v (3S) ograniczenie 1A.

Pytanie: jakie parametry napięcia i mikrokroków (ew. inne, jakie?) będą optymalne pod względem energetycznym (najmniejsze straty energii cieplnej, grzanie) przy chęci zachowania małej prędkości obrotowej (20-30 rpm) i sporej siły bez przekładni ( koło d=20-30cm).

 

Edytowano przez wmaker

Udostępnij ten post


Link to post
Share on other sites

W zakresie niskich obrotów taki silnik będzie pobierał podobny prąd prawie niezależnie od tego czy kręcisz czy stoisz. Ty masz wpływ na prąd drivera a od niego zależy moment. Ponieważ posługujesz się pojęciami z zakresu ezoteryki i wróżbiarstwa ("spora siła") to odpowiedź musi być podobna: tak ustaw prąd by mieć wystarczająco duży moment (albo siłę na danym ramieniu - to to samo) i jednocześnie silnik grzał się jak najmniej. Skoro nie znamy parametrów tego silnika (rezystancje i indukcyjności uzwojeń, prąd znamionowy, moment znamionowy) ani nie wiemy ile naprawdę potrzebujesz momentu na wyjściu to co czym tu dywagować? Gdyby silnik miał znamionowo np. 1Nm przy prądzie 1A a Ty potrzebowałbyś 0.5Nm wtedy wystarczyłby prąd 0.5A, proste.

Te silniki grzeją się z zasady pracy bo prąd płynie tam cały czas a rezystancje uzwojeń są niezerowe i nic na to nie poradzisz. Gdyby w mechanice jaką projektujesz (tego też nie wiemy)  moment nie był potrzebny zawsze a tylko w pewnych chwilach, to mógłbyś "luzować" silnik przez cyfrowe wyłączanie drivera lub nawet przez płynną regulację prądu oszczędzać trochę energii kosztem spadku lub wyłączania momentu.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
26 minut temu, marek1707 napisał:

1Nm przy prądzie 1A a Ty potrzebowałbyś 0.5Nm wtedy wystarczyłby prąd 0.5A, proste.

Dziękuję za wróżby, czyli albo liczymy na podstawie karty silnika albo na żywym (poskładanym ) sprzęcie ograniczam prąd na tyle żeby starczyło siły - faktycznie proste. A co z mikrokrokami ? Jeszcze nie eksperymentowałem ale rozumuję że ich zmniejszenie spowoduje mniej płynną pracę silnika, czy mają jakikolwiek wpływ na pobór prądu i lub grzanie ( na pobór prądu wpływa sumaryczny okres komutacji w danym czasie, nie widzę związku ilości cykli z poborem prądu w jednostce czasu ale może czegoś nie rozumiem).

Udostępnij ten post


Link to post
Share on other sites

Tak, mikrokroki skutkują bardziej płynną pracą silnika szczególnie gdy rusza i gdy generalnie pracuje powoli. No i umożliwiają bardziej precyzyjną kontrolę położenia - nie wiem na czym Ci zależy bo nie znamy aplikacji. Wyobraź sobie taki silnik jak element do którego pchasz prąd żeby dostać moment na wale. Im więcej prądu wpompujesz tym więcej momentu otrzymasz. Dobrze myślisz: dopóki driver a dokładniej jego źródła prądowe nadążają za komutacjami faz (czyli powiedzmy od 0 do 50-100 kroków/s) to sumaryczny prąd zasilania prawie się nie zmienia (suma modułów dwóch sinusoid przesuniętych o 90 stopni) więc i moment też nie. Im dasz wyższe zasilanie drivera tym ma on większy komfort (zapas), tym łatwiej jego źródła prądowe kompensują indukcyjności uzwojeń podczas komutacji (szybciej rośnie prąd po przełączeniu) i tym szybciej możesz kręcić bez spadku momentu.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Chciałbym pokazać projekt ale jest tylko w głowie (mało użyteczne podejście dla forum ale myślenie, proste obliczenia i wyobrażenia rozwiązań pomagają mi się zrelaksować po pracy - taka techniczna medytacja 🙂  ). Jak już mnie przyprze do ściany to naszkicuje w AutoCadzie.

Celem projektu (marzeniem) jest nauka programowania/sterowania i autonomiczna kosiarka like AutoMower. 

Etapy poza poza warstwą mechaniczną:

  • blink - done
  • zasilanie 3S z balanserem 10A - done
  • sterowanie przekaźnikami i silnikami 12v - done
  • włączanie/wyłączanie silników BLDC - done
  • regulacja obrotów/kierunku silnika BLDC - done
  • implementacja czujnika ultradźwiękowego
  • implementacja sterowania perimetrycznego obwodu ograniczającego
  • implementacja sterowania perimetrycznego obwodu ładowarki (kontaktowej lub indukcyjnej)
  • implementacja dodatkowych czujników optymalizujących pracę (GPS, wilgotność....)  - rok 2032 ? 😉 

Nurtuje mnie pytanie - dlaczego w podobnych projektach stosuje się silniki komutatorowe z przekładnią zamiast prostszych mechanicznie (mniej awaryjnych) BLDC ?

Udostępnij ten post


Link to post
Share on other sites

Moim zdaniem wszystko zależy od konstruktora. Wiele starszych osób wyssało silniki komutatorowe z mlekiem matki. Są one pojęciowo prostsze, są osobnym elementem działającym od razu po podłączeniu do prądu i przede wszystkim są wystarczająco dobre w szerokim tego słowa znaczeniu: wystarczająco tanie, dostępne, niezawodne a często po prostu leżą w szufladzie. Użycie takiego silnika wymaga wyłącznika/przekaźnika i akumulatora. Jeżeli cokolwiek się popsuje to wyjmujesz silnik, czyścisz komutator, doginasz lub wymieniasz szczotki, smarujesz łożyska i jedziesz następne 200 godzin aż wióry lecą.

Z kolei BLDC same siebie są rzeczywiście proste i niezwodne, ale kontroler i driver to już zupełnie inna para kaloszy. Dobry, taki co to umożliwia płynny start od zera rpm wymaga albo silnika oczujnikowanego albo jest skomplikowany i drogi. Przykładowo: silnik DC do karabinka ASG to jakieś 100zł. Podobnej wielkości, troszkę większej mocy, superniezawodny BLDC z wbudowanym kontrolerem to.. 500+. W modelarstwie podobnie: ceny silników 3F spadły do poziomu lub poniżej tych zwykłych, ale licząc z regulatorem wychodzi sporo drożej. Oczywiście nie jest to regułą - wszystko zależy od aplikacji i tak naprawdę skali produkcji masowej. Wybór do prostego urządzenia ogrodowego(?) wcale nie jest oczywisty.

Mam nadzieję, że masz jakiś tymczasowy sprzęt już teraz, bo do roku 2032 ogród bez kosiarki może być już nie do odratowania i potrzebny będzie raczej jakiś harvester z Puszczy Białowieskiej..

 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Utknąłem na powiązaniu ruchu silników z odczytem odległości na czujniku ultradźwiękowym:

program staruje (jedzie do przodu) po wykryciu przeszkody bliżej niż 25cm włącza revers i już tak zostaje (revers + odczyt tej samej, ostatniej wartości odległości)

czyli więźnie w pętli while. Proszę o pomoc i motywację bo trochę się wypaliłem żeby tu dojść 😐

// modyfikacja DualMotorShield.pde
// -*- mode: C++ -*-
//
// Run 2 simultaneous steppers
// with 2 DRV8825
// and the movement is determined by HC SR04 ultrasound sensor
// below 25 cm is reewerse move


#include <AccelStepper.h>

//ultrasonic sensor pins
#define trigPin 8
#define echoPin 9

// The L Stepper pins
#define stepperL_DIR_PIN 3
#define stepperL_STEP_PIN 2
// The R stepper pins
#define stepperR_DIR_PIN 5
#define stepperR_STEP_PIN 4

unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzasPrzeszkody = 0;
unsigned long zapamietanyCzasEcho = 0;
  long czas;
  int minOdleglosc = 25; // odległość włączająca REVERS


// Define some steppers and the pins the will use
AccelStepper stepperL(AccelStepper::DRIVER, stepperL_STEP_PIN, stepperL_DIR_PIN);
AccelStepper stepperR(AccelStepper::DRIVER, stepperR_STEP_PIN, stepperR_DIR_PIN);

void setup()
{  
  pinMode(trigPin, OUTPUT); //Pin - trig jako wyjście
  pinMode(echoPin, INPUT); //Pin -  echo, jako wejście
   Serial.begin (9600);
  
    stepperL.setMaxSpeed(200.0);
    stepperL.setAcceleration(10.0);
   // stepperL.setSpeed(500.0);
 
    
    stepperR.setMaxSpeed(200.0);
    stepperR.setAcceleration(10.0);
   // stepperR.setSpeed(500.0);

}

void loop()
{
     //Pobierz liczbe milisekund od startu
  aktualnyCzas = millis();


  forward(); //jazda do przodu
  //revers();
  
  digitalWrite(trigPin, LOW);
  if (aktualnyCzas - zapamietanyCzasEcho >330UL) // wysyłaj echo 3 razy na sekundę
  {
  zapamietanyCzasEcho = aktualnyCzas; //Zapamietaj czas Echa
  digitalWrite(trigPin, HIGH); // włącz trig
  if (aktualnyCzas - zapamietanyCzasEcho >=0,01UL) //wyłącz trig po 10ms.
  {
  digitalWrite(trigPin, LOW);

  czas = pulseIn(echoPin, HIGH);
  //Serial.println(czas/58);
  }
  }
  
 if ((czas/58 < minOdleglosc) && (czas!=0) ) // włącz revers gdy przeszkoda bliżej niż 25cm i eliminuj błędny odczyt"0"
  {
    //Serial.println(czas/58);
    zapamietanyCzasPrzeszkody = aktualnyCzas; //Zapamietaj czas przeszkody
    while (aktualnyCzas - zapamietanyCzasPrzeszkody < 500UL) //Włącz Revers na 5s,
   {
    Serial.println(czas/58);
    revers();
   }
 /*}
 else
  {
   forward();
 */ }
}
  
 void forward() 
  {
     stepperL.setSpeed(-300.0);
     stepperR.setSpeed(-300.0);
     stepperL.runSpeed();
     stepperR.runSpeed(); //FORWARD silników
   }

  void revers() 
  {
     stepperL.setSpeed(300.0);
     stepperR.setSpeed(300.0);
     stepperL.runSpeed();
     stepperR.runSpeed(); //REWERS silników
  }

Może w ogóle nie tędy droga? Z góry dziękuję za poświęcony czas.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

@wmaker 

zmiana w warunku while parametru aktualnyCzas na millis() ominęła problem choć to w założeniach te same wartości...

while (millis() - zapamietanyCzasPrzeszkody < 1500UL) //Włącz LewyRevers na 1,5s

nie wiem dlaczego ale działa, czy ktoś wytłumaczy dlaczego poprzednia wersja nie działała?

Edytowano przez wmaker

Udostępnij ten post


Link to post
Share on other sites

@wmaker możliwe, że to kwestia optymalizacji kompilatora, chociaż trochę to podejrzane... Pokaż z ciekawości cały, działający program 😉

Udostępnij ten post


Link to post
Share on other sites

Nie, to kwestia wstawienia w warunek while wyrażenia które się nie zmienia 🙂

@wmaker - pomyśl sam:

miałeś wyrażenie:
 

while (aktualnyCzas - zapamietanyCzas < 500UL)  {
	rób_coś();
}
                                      

Ponieważ wartość zmiennej aktualnyCzas jest w tym momencie stała, wartość zapamietanyCzas również - nic dziwnego, że wykonywane było cały czas to samo porównanie...

Kiedy zmieniłeś na millis() wszystko ruszyło - ale to tylko dlatego, że millis() wskazuje na rzeczywisty aktualny czas, a zmienna aktualnyCzas niestety tylko tak się nazywa 😞

 

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites

Wyczaiłem:

// modyfikacja DualMotorShield.pde
// -*- mode: C++ -*-
//
// Run 2 simultaneous steppers
// with 2 DRV8825
// and the movement is determined by HC SR04 ultrasound sensor
// below 25 cm is reewerse move


#include <AccelStepper.h>

//ultrasonic sensor pins
#define trigPin 10
#define echoPin 11



// The L Stepper pins
#define stepperL_DIR_PIN 3
#define stepperL_STEP_PIN 2
// The R stepper pins
#define stepperR_DIR_PIN 5
#define stepperR_STEP_PIN 4

unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzasPrzeszkody = 0;
unsigned long zapamietanyCzasEcho = 0;
long czas = 0;
int minOdleglosc = 25; // odległość włączająca REVERS


// Define some steppers and the pins the will use
AccelStepper stepperL(AccelStepper::DRIVER, stepperL_STEP_PIN, stepperL_DIR_PIN);
AccelStepper stepperR(AccelStepper::DRIVER, stepperR_STEP_PIN, stepperR_DIR_PIN);

void setup()
{  

  pinMode(trigPin, OUTPUT); //Pin - trig jako wyjście
  pinMode(echoPin, INPUT); //Pin -  echo, jako wejście
   Serial.begin (9600);
  
    stepperL.setMaxSpeed(200.0);
    stepperL.setAcceleration(10.0);
   // stepperL.setSpeed(500.0);
 
    
    stepperR.setMaxSpeed(200.0);
    stepperR.setAcceleration(10.0);
   // stepperR.setSpeed(500.0);

}

void loop()
{
    
  forward(); //jazda do przodu
  aktualnyCzas = millis();  //Pobierz liczbe milisekund od startu

  if ((aktualnyCzas - zapamietanyCzasEcho) >330UL) // wysyłaj echo 3 razy na sekundę
  {

  zapamietanyCzasEcho = aktualnyCzas; //Zapamietaj czas Echa
  digitalWrite(trigPin, HIGH); // włącz trig
  if ((aktualnyCzas - zapamietanyCzasEcho) >=0,01UL) //wyłącz trig po 10ms.
  {
  digitalWrite(trigPin, LOW);

  czas = pulseIn(echoPin, HIGH);
    
  Serial.print("pomiar ");
  Serial.println(czas/58);
  }
  }
  
 if ((czas/58 < minOdleglosc) && (czas!=0) ) // włącz revers gdy przeszkoda bliżej niż 25cm i eliminuj błędny odczyt"0"
  {
    //Serial.println(czas/58);
    aktualnyCzas = millis();  //Pobierz liczbe milisekund od startu
    zapamietanyCzasPrzeszkody = aktualnyCzas; //Zapamietaj czas przeszkody
    while ((aktualnyCzas - zapamietanyCzasPrzeszkody) < 1500UL) //Włącz LewyRevers na 1,5s
   {
    //Serial.println(czas/58);
    aktualnyCzas = millis();  //Pobierz liczbe milisekund od startu
    revers();
   }
    aktualnyCzas = millis();  //Pobierz liczbe milisekund od startu
   while ((aktualnyCzas - zapamietanyCzasPrzeszkody) < 5000UL) //Włącz Revers na 5s,
   {
    aktualnyCzas = millis();  //Pobierz liczbe milisekund od startu
    //Serial.println(czas/58);
    Lrevers();
   }
  }
}
  
 void forward() 
  {
     stepperL.setSpeed(-300.0);
     stepperR.setSpeed(-300.0);
     stepperL.runSpeed();
     stepperR.runSpeed(); //FORWARD silników
   }

  void revers() 
  {
     stepperL.setSpeed(300.0);
     stepperR.setSpeed(300.0);
     stepperL.runSpeed();
     stepperR.runSpeed(); //REWERS silników
  }
  
  void Lrevers() 
  {
     stepperL.setSpeed(300.0);
     stepperR.setSpeed(0.0);
     stepperL.runSpeed();
     stepperR.runSpeed(); //REWERS silników
  }
  
  void Rrevers() 
  {
     stepperL.setSpeed(00.0);
     stepperR.setSpeed(300.0);
     stepperL.runSpeed();
     stepperR.runSpeed(); //REWERS silników
  }

brakowało uaktualnienia parametru aktualnyCzas = millis();  wewnątrz pętli while.

Dziękuję - niby proste ale żmudne więc dzięki waszej pomocy/zainteresowaniu idzie lepiej 🙂

Teraz będę zmieniał sensor zbliżeniowy na 4 x IR i rozbuduję gamę reakcji w zależności od kombinacji sygnałów z sensorów.

Do tego dokładam chłodzenie driverów silników krokowych żeby podnieść natężenie zasilania i przechodzę z 12v na 24v - potrzebuję więcej koników pod maską 😉 .

Udostępnij ten post


Link to post
Share on other sites

Wrzucam dla dokumentacji postępów bieżący wygląd całości, taka typowa "platforma eksperymentalna" 😉

1057125461_20190220_133404lite.thumb.jpg.dc4a378174d1b717ca63f8afd1f038a1.jpg20190220_133318 lite.jpg20190220_133427lite.jpg

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@wmaker potężny kawał sklejki 😉 Docelowa konstrukcja będzie taka wielka?

Udostępnij ten post


Link to post
Share on other sites

Docelowy wymiar będzie zbliżony, inspiracją jest Automower

 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Wpis informacyjny...

Nastąpiła pauza na malowanie domu, grypę czyli można by powiedzieć całą serie wymówek gdyby nie twarde lądowanie przy nie przemyślanych ruchach w projekcie. Podniesione napięcie do 24V i natężenie na sterownikach DRV8825 do 3A (teoretycznie wg karty katalogowej silnik ma wziąć do 2A więc był zapas) objawiło się dymem 😐 , no to szybka wymiana na następny driver ( miałem jeden na zapas ) i znowu dym bom go włożył odwrotnie 😂. Teraz nie mam driverów a i Arduino przestało współpracować. Więc cofam się o krok.

Są dni kiedy powinno się robić prostsze rzeczy 😉 np. πqo. 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »

×