Skocz do zawartości

Sterowanie silnikiem krokowym


Pomocna odpowiedź

Dokładności tutaj nie ma za dużej, po prostu silnik ma kręcić nie wiem tak pi razy drzwi 2 obroty na sekundę i potem ma zwalniać do dość minimalnych obrotów na sekundę. Cała filozofia. Jeszcze mi się takie coś przypomniało że jak się bawiłem ustawieniami hx711 to dość mocno wszystko zwalniało gdy się dało za dużo sampli (jeszcze kiedy nie używałem silnika krokowego) więc najprawdopodobniej to jest winowajca.

57 minut temu, kellyq napisał:

Dokładności tutaj nie ma za dużej, po prostu silnik ma kręcić nie wiem tak pi razy drzwi 2 obroty na sekundę i potem ma zwalniać do dość minimalnych obrotów na sekundę.

Mowiac o dokladnosci mialem oczywiscie na mysli obroty na sekunde...no tak niestety wynika ze np. 10000(przerwanie co 100us) /637(krokow/s) = 15,69...czyli trzeba zaokraglic do 15 i co 15 przerwanie wywolac krok...czyli blad +/- 4-5%...oczywiscie ilosc krokow taka jaka zadano a jedynie zamiast np 3,18 obrotu/s wyszlo by 3,03 obrotu/s (tak pi razy drzwi)...no ja bym sie zastanowil nad tym timerem...mozesz tez dodac drugi procek..to juz zalezy od tego co uwazasz za szybsze/tansze/lepsze rozwiazanie...

Wiesz -jeśli w programie masz delay(100) to znaczy, że szybkość nie jest ważna.

Poza ty sugerowałbym wykorzystanie dwurdzeniowego mikrokontrolera (RPi Pico, ESP32) wtedy komunikacja między rdzeniami będzie naprawdę szybka.

Inna sprawa że to wszystko można rozwiązać programowo na atmedze... tylko trzeba chcieć.

  • Lubię! 1

Możesz też za 6.5zł kupić Atmega3208 (tu) i użyć DMA. Nie masz wtedy problemu z portowaniem kodu. 

16 minut temu, kellyq napisał:

nie wiem który sposób komunikacji będzie szybszy po uart czy I2C

A ta różnica prędkości ma znaczenie w praktyce w Twoim przypadku? 

(edytowany)

W pętli loop odpowiedzialnej za ważenie i kręcenie silnikiem nie mam ani jedego delay, w innych częściach kodu owszem ale wtedy silnik i ogólnie ważenie jest odłączane. Wg mnie problemem jest próbkowanie przetwornika hx711, chcąc w miarę dokładny wynik wywołuje się więcej od niego próbek i to moim zdaniem zamula, widać to szczególnie na wyświetlaczu. Ma on refresh co 100ms a przy dużym próbkowaniu waga skak klatkuje niemiłosiernie. 

Najważniejsze żeby w prędkośći komunikacji było to żeby zatrzymanie silnika następywało dość szybko

Edytowano przez kellyq
3 minuty temu, kellyq napisał:

chcąc w miarę dokładny wynik wywołuje się więcej od niego próbek

#define ILOSC_PROBEK 64
  
int probka()
{
  static int ilosc_probek = 0;
  static int suma = 0;
  suma += pobierz_probke();
  ilosc_probek++;
  if (ilosc_probek < ILOSC_PROBEK) return -1; // na przykład
  ilosc_probek = 0;
  int rc = suma / ILOSC_PROBEK;
  suma = 0;
  return rc;
}

void loop()
{
  int wartosc = probka();
  if (wartosc != -1) {
    // robimy coś z wartością
  }
  // dalej kod 
}

  
  

 

Wszystko ładnie tylko że u mnie jest już minimalna ilość próbek, jak dobrze pamiętam wywołuje chyba 5

float waga = scale.get_units(probkowanie);

potem to idzie do tablicy celem uśrednienia i wyeliminowania skoków, nie wspominając o hardwerowym modzie zmieniającym standardowe 10Hz na 80Hz samplowania.

Wiecie już mi się nie chce w tym grzebać za bardzo dam drugi mikrokontroler połączę po uart, zrobię też na wszelki wypadek połączenie po I2C. Nie mam już starego sterownika i całej maszyny także muszę robić drugi pod ten krokowiec, nie mam więc nawet jak testować na razie. Ale wydaje mi się że powinno to działać na 2 mikrokontrolery. Przesyłałbym do tego drugiego tylko wartość prędkości obrotowej jaką ma mieć silnik

8 godzin temu, kellyq napisał:

Chyba postawie na drugi mikrokontroler, łatwiejsze rozwiązanie

No nie bardzo...drugi procek to druga para kabli do zasilania, kable do komunikacji i do tego trzeba ten procek miec...a program dalej trzeba dopisywac/modyfikowac..nabazgralem takie cos..(nie to ze taki dobrodziej jestem i napisalem specjalnie dla Ciebie😉, poprostu mialem akurat silnik pod reka i poczulem nieodparta pokuse patrzenia sie, jak sie kreci (ta slodko to wyglada😍)) wiec wrzucam kod..zawsze mozesz sprawdzic bo to tylko pare minut klikania w klawiature..

#include <util/atomic.h>

int skala = 0;
int krok = 0;
int podzial = 0;
bool stop = 0;
bool flaga = 0;


void setup() {
   TCCR2B &= 0x00;
   TCCR2A &= 0x00;
   TCCR2A |= (1<<WGM21);     //CTC                            
   TCCR2B |= (1<<CS22);      //preskaler na 64
   TIMSK2 |= (1<<OCIE2A);    //wlaczenie przerwania porownanie
   OCR2A = 25;  //255 max        
   sei();                    // przerwania globalne wlacz
   
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
digitalWrite(3, LOW);
}
 
void loop() {
 
 skala = map(analogRead(A0), 0, 1023, 1, 1000); // skala = ilosc krokow na sekunde
 skala = 10000 / skala;
   ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
  {
    podzial = skala;
    }
    delay(3000);
 // stop = 1;          // zatrzymanie silnika
 // stop = 0;           // silnik kreci
}



 ISR(TIMER2_COMPA_vect)
{ 
  if (stop) {
    return;
  }
  if (flaga) {
      digitalWrite(2, LOW);
      flaga = 0;
  }   
if (!krok) {
  digitalWrite(2, HIGH);
  krok = podzial;
  flaga = 1;
}
 else {
  krok--;
 }
 
 }

sprawdzalem z delay'em i dziala tka jak dzialac ma..czyli nic nie blokuje, kilka rzeczy do zmiany jak np. digitale na rejestry itp. ale to jak juz uznasz ze jednak ma to sens...

Taki pro jeszcze nie jestem niestety

Postawiłem jednak na drugi procek, zmieniły się też założenia projektu, będzie do obsłużenia drugi silnik krokowy do wysypywania z kosza wagowego. Do przesyłu danych między kontrolerami wybrałem I2C. Pasuje mi przesłać dwie wartości: aktualne obroty/s pierwszego silnika oraz obroty z jakimi się będzie obracał drugi silnik podczas wysypywania. Dajmy na to że te wartości będą w przedziale 0-10000. Aktualnie do testów konwertuje te liczby na przedziały 0-255 zapisuję w komórki tablicy i przesyłam całą tablicę. Tylko że tutaj napotykam kolejny problem mianowicie mało to dokładne ustawianie prędkości. Szukam aktualnie jak przesłać te dwie wartości jako int 

6 minut temu, kellyq napisał:

Postawiłem jednak na drugi procek

A dlaczego nie chcesz dwurdzeniowca? Odpada problem komunikacji między prockami, a cenowo wychodzi podobnie.

Bo płytki robię od podstaw i te mikrokontrolery które wymieniłeś wcześniej po prostu są za małe i miał bym problemy z lutowaniem, a chyba nie ma ich wersji  DIP

16 minut temu, kellyq napisał:

zmieniły się też założenia projektu, będzie do obsłużenia drugi silnik krokowy 

Tym programem powyzej i drugi i trzeci i nawet czwarty silnik bys obsluzyl...😉 no ale ja nie namawiam, nie zmuszam...😇

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ę »
×
×
  • Utwórz nowe...