Skocz do zawartości

Piszczące silniki DC, brak ruchu robota


Pomocna odpowiedź

Witam mam problem z silnikiem dc. Chciałem zrobić zdalnie sterowane auto które będzie kontrolowane przez aplikację na moim telefonie poprzez Bluetooth. Na początku miałem silniki od drukarki dla testów. Napisałem cały program i zrobiłem układ za pomocą przetwornicy, mostka H, arduino nano i modułu Bluetooth . Wszystko  działo i prędkość sterowałem pwm. Arduino ma wyjścia pwm 8 bitowe . Potem kupiłem silniki modelarskie które miały działać od 3 do 6 V lecz po podłączeniu piszczą. Po lekkim popchnięciu zaczynają działać lecz działają słabo. Próbowałem użyć perskalera bo myślałem że chodzi o częstotliwość. Najpierw ustawiłem perskaler na 8 żeby po podziale 16 MHz wyszło mi około 8 Khz. Lecz efekt był taki sam. Potem przeczytałem że lepiej użyć częstotliwości mniejszych bo prąd wyprzedza napięcie i moc jest za mała. I ustawiłem perskaler na 256 , 512 i 1024 lecz efekt był taki sam. Chcę dodać że mierzyłem na oscyloskopie częstotliwość i wychodziła taka jak powinna. Wie ktoś może jak rozwiązać ten problem  ? 

Link to post
Share on other sites
  • Treker zmienił tytuł na: Piszczące silniki DC, brak ruchu robota

@kiker212 witam na forum 🙂

Jakie dokładnie silniki modelarskie zakupiłeś? Jeśli są to same silniki, bez żadnej przekładni to może zwyczajnie są zbyt słabe, aby poruszyć robota. Silniki DC mają stosunkowo wysokie obroty i niski moment, aby mogły napędzać robota najczęściej potrzebują przekładnię, która obniży prędkość i zmniejszy moment obrotowy. Stąd podczas budowy robotów najczęściej korzysta się z gotowych napędów, które składają się z silnika DC oraz przekładni - np. 20:1, 200:1 itd.

  • Lubię! 2
Link to post
Share on other sites
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

#include <avr/io.h> 
#define MOTOR1_PWM 6  //D6
#define MOTOR1_PWM_COR 0
#define MOTOR1_IN1 14 //A0
#define MOTOR1_IN2 15 //A1
#define MOTOR2_PWM 5  //D5
#define MOTOR2_PWM_COR 0
#define MOTOR2_IN1 16 //A2
#define MOTOR2_IN2 17 //A3
#define DIODA1_R 18 //A4
#define DIODA1_G 4 //D4
#define DIODA1_B 2 //D2
#define DIODA2_R 10 //D10
#define DIODA2_G 11 //D11
#define DIODA2_B 12 //D12

char lastCode = ' ';
int pwmSpeed = 0;

void setup() {
  Serial.begin(9600);
  
TCCR0A = _BV(WGM01) | _BV(WGM00);
TCCR0B = _BV(CS01) | _BV(CS00);

OCR0A = 100; 
OCR0B = 100;
  
  pinMode(MOTOR1_PWM, OUTPUT);
  digitalWrite(MOTOR1_PWM, HIGH);

  pinMode(MOTOR1_IN1, OUTPUT);
  pinMode(MOTOR1_IN2, OUTPUT);

  pinMode(MOTOR2_PWM, OUTPUT);
  digitalWrite(MOTOR2_PWM, HIGH);

  pinMode(MOTOR2_IN1, OUTPUT);
  pinMode(MOTOR2_IN2, OUTPUT);
  lightOff();
  stop();
}

void loop() {
  analogWrite(MOTOR1_PWM, pwmSpeed);
  analogWrite(MOTOR2_PWM, pwmSpeed);

  if (Serial.available() > 0) {
    char code = Serial.read();

    if (code == 'F') {
      front();
    } else if (code == 'L') {
      left();
    } else if (code == 'R') {
      right();
    } else if (code == 'B') {
      back();
    }
    else if (code == 'S') {
      stop();
    }
    else if (code == '0') {
      setSpeed(0);
    }
    else if (code == '1') {
      setSpeed(1);
    }
    else if (code == '2') {
      setSpeed(2);
    }
    else if (code == '3') {
      setSpeed(3);
    }
    else if (code == '4') {
      setSpeed(4);
    }
    else if (code == '5') {
      setSpeed(5);
    }
    else if (code == '6') {
      setSpeed(6);
    }
    else if (code == '7') {
      setSpeed(7);
    }
    else if (code == '8') {
      setSpeed(8);
    }
    else if (code == '9') {
      setSpeed(9);
    }
    else if (code == 'q') {
      setSpeed(10);
    }
    else if (code == 'W') {
      lightOn();
    }
    else if (code == 'w'){
      lightOff();
    }
    lastCode = code;

    Serial.print("LastCode: ");
    Serial.println(lastCode);
  }

  if(lastCode == ' ') {
    stop();
  }
}

void left() {
  Serial.println("left");
        
  digitalWrite(MOTOR1_IN1, LOW);
  digitalWrite(MOTOR1_IN2, HIGH);

  digitalWrite(MOTOR2_IN1, HIGH);
  digitalWrite(MOTOR2_IN2, LOW);
}

void right() {
  Serial.println("righ");
        
  digitalWrite(MOTOR2_IN1, LOW);
  digitalWrite(MOTOR2_IN2, HIGH);

  digitalWrite(MOTOR1_IN1, HIGH);
  digitalWrite(MOTOR1_IN2, LOW);
}

void back() {
  Serial.println("back");
  
  digitalWrite(MOTOR1_IN1, HIGH);
  digitalWrite(MOTOR1_IN2, LOW);

  digitalWrite(MOTOR2_IN1, HIGH);
  digitalWrite(MOTOR2_IN2, LOW);
}

void front() {
  Serial.println("front");
  
  digitalWrite(MOTOR2_IN1, LOW);
  digitalWrite(MOTOR2_IN2, HIGH);

  digitalWrite(MOTOR1_IN1, LOW);
  digitalWrite(MOTOR1_IN2, HIGH);
}

void stop() {
  Serial.println("stop");
  
  digitalWrite(MOTOR2_IN1, LOW);
  digitalWrite(MOTOR2_IN2, LOW);

  digitalWrite(MOTOR1_IN1, LOW);
  digitalWrite(MOTOR1_IN2, LOW);
}

void setSpeed(int speed) {
  pwmSpeed =      100 + speed * 15 ;
}


void lightOn() {
 light1(LOW);
 light2(LOW);
}

void lightOff() {
 light1(HIGH);
 light2(HIGH);
}

void light1(int status){
 pinMode(DIODA1_R, OUTPUT);
 digitalWrite(DIODA1_R, status);
  
 pinMode(DIODA1_G, OUTPUT);
 digitalWrite(DIODA1_G, status);
  
 pinMode(DIODA1_B, OUTPUT);
 digitalWrite(DIODA1_B, status);
}

 void light2(int status){

  pinMode(DIODA2_R, OUTPUT);
  digitalWrite(DIODA2_R, status);
  
  pinMode(DIODA2_G, OUTPUT);
  digitalWrite(DIODA2_G, status);
  
  pinMode(DIODA2_B, OUTPUT);
  digitalWrite(DIODA2_B, status);
 }
  

A to jest program 

Link to post
Share on other sites

Jak dlubiesz po rejestrach to nie uzywasz wtedy bibliotecznej funkcji analogWrite()...nie wiem ktorego trybu pwm uzywasz, ale tam sie "podpina" piny sprzetowe i dalej sie nie martwisz, piny same zmieniaja stan...kolejna sprawa to do rejestrow OCRA/OCRB wpisujesz wartosc wypelnienia (0-255/8bit)...sprawdz te silniki tylko na analogWrite()..

  • Pomogłeś! 1
Link to post
Share on other sites
(edytowany)

Chodzi ci o to?

TCCR0A = _BV(WGM01) | _BV(WGM00);
TCCR0B = _BV(CS01) | _BV(CS00);

OCR0A = 100; 
OCR0B = 100;

Jeśli się nie korzysta  funkcji analogWrite() to z jakiej? Używam trybu Fast Pwm. Z góry dziękuję.

Edytowano przez kiker212
Link to post
Share on other sites
(edytowany)

Jeśli chodzi o rejestry OCRA/OCRB to wpisywałem cały zakres wypełnienia i to też nic nie dawało.

 

Edytowano przez kiker212
Link to post
Share on other sites
17 minut temu, kiker212 napisał:

Chodzi ci o to?


TCCR0A = _BV(WGM01) | _BV(WGM00);
TCCR0B = _BV(CS01) | _BV(CS00);

OCR0A = 100; 
OCR0B = 100;

Jeśli się nie korzysta  funkcji analogWrite() to z jakiej? Używam trybu Fast Pwm. Z góry dziękuję.

Jesli nie korzystasz z analogWrite() tylko rejestrow to albo uruchamiasz piny sprzetowe dla danego timera i zmiany stanu odbywaja sie juz "same", lub uruchamiasz odpowiedni wektor przerwania ISR i w nim manipulujesz dowolnym pinem/pinami...

Jesli silnik bez obciazenia piszczy i nie kreci, lub prawie nie kreci na funkcji analogWrite() w calym zakresie to na sto procent nie jest to wina pwm/czestotliwosci...bardziej szukal bym winy w zasilaniu/mostku 

Czym zasilasz? Jaki mostek?(sterownik)

 

  • Lubię! 1
Link to post
Share on other sites
(edytowany)

Mostek to L298N a zasilam go akumulatorem 1000mAh 20-30C discharge i myślałem że może być to wina przewodów ponieważ kiedy uruchamiałem układ to czasami przewody się dymiły więc chcę też spróbować z innymi przewodami bo  są słabe i mają słabą izolację.

Edytowano przez kiker212
Link to post
Share on other sites
1 minutę temu, kiker212 napisał:

 ponieważ kiedy uruchamiałem układ to czasami przewody się dymiły więc chcę też spróbować z innymi przewodami.

Oj joj...to nie dobrze, nie powinno byc zadnego dymu czy ciepla podczas wlaczania, nie wazne jak cienkie przewody by byly...(inna sprawa podczas krecenia silnika) 

Hmm..nie uzywalem tego mostka wiec nie doradze za wiele...no a spruboj ten silnik uruchomic bezposrednio z tego ogniwa...rozumiem ze to 1S (3.7v nominal)

Link to post
Share on other sites
(edytowany)

Kiedy podłączam akumulator do silnika to normalnie się kręci więc może to przewody nie dają rady.

Edytowano przez kiker212
Link to post
Share on other sites
(edytowany)

Jest to akumulator 2S(7.4V nominal).Nie wiem czy z zdjęciem da radę bo przewodów jest za dużo i nic przez to nie widać.

Edytowano przez kiker212
Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.