Skocz do zawartości
Komentator

Kurs Arduino - #8 - Sterowanie silnikami DC, pętla for

Pomocna odpowiedź

Chodzi o baterię 9V, za mała wydajność prądowa (i mała pojemność).

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Zadanie 8.1

#define firstMotorPWM 10
#define firstMotorDirectionPinOne 2
#define firstMotorDirectionPinTwo 3

#define secondMotorPWM 11
#define secondMotorDirectionPinOne 4
#define secondMotorDirectionPinTwo 5

void setup() 
{
 pinMode(firstMotorPWM, OUTPUT);
 pinMode(firstMotorDirectionPinOne, OUTPUT);
 pinMode(firstMotorDirectionPinTwo, OUTPUT);

 pinMode(secondMotorPWM, OUTPUT);
 pinMode(secondMotorDirectionPinOne, OUTPUT);
 pinMode(secondMotorDirectionPinTwo, OUTPUT);

 digitalWrite(firstMotorPWM, HIGH);
 digitalWrite(secondMotorPWM, HIGH);
}

void loop() 
{
 motorsAhead();
 delay(3000);
 motorsDifferentDirections();
 delay(3000);
 motorsBack();
 delay(3000);
}

void motorsAhead()
{
 digitalWrite(firstMotorDirectionPinOne, LOW);
 digitalWrite(firstMotorDirectionPinTwo, HIGH);
 digitalWrite(secondMotorDirectionPinOne, LOW);
 digitalWrite(secondMotorDirectionPinTwo, HIGH);
}

void motorsDifferentDirections()
{
 digitalWrite(firstMotorDirectionPinOne, HIGH);
 digitalWrite(firstMotorDirectionPinTwo, LOW);
 digitalWrite(secondMotorDirectionPinOne, LOW);
 digitalWrite(secondMotorDirectionPinTwo, HIGH);
}

void motorsBack()
{
 digitalWrite(firstMotorDirectionPinOne, HIGH);
 digitalWrite(firstMotorDirectionPinTwo, LOW);
 digitalWrite(secondMotorDirectionPinOne, HIGH);
 digitalWrite(secondMotorDirectionPinTwo, LOW);
}

Udostępnij ten post


Link to post
Share on other sites

MaciejBurchardt, dodaj komentarze do kodu - inaczej za jakiś czas będziesz sam się zastanawiał, co robi dany fragment kodu 😉 To naprawdę dobra praktyka!

Udostępnij ten post


Link to post
Share on other sites

Uncle Bob twierdzi, że prawie każdy komentarz w kodzie powinien zmusić nas do refleksji, czy nie da się go usunąć. Nie korzystam z komentarzy celowo, w zamian staram się tworzyć krótkie i czytelne funkcje (zupełnie osobną kwestią jest czy mi się to udaje - jeśli nie to chętnie przyjmę każdą krytykę).

Brak komentarzy jest u mnie świadomy i powołuję się tutaj na rozdział na rozdział 4 książki "Czysty Kod" Roberta C. Martina

Udostępnij ten post


Link to post
Share on other sites
powołuję się tutaj na rozdział na rozdział 4 książki "Czysty Kod" Roberta C. Martina

Super. A udało Ci się dotrzeć do rozdziału opisującego jak nazywać funkcje? Najczęstszą konwencją jest że nazwa funkcji zawiera czasownik, u Ciebie nic takiego nie widać.

Udostępnij ten post


Link to post
Share on other sites

Witam. Wykonuję pewien projekt związany z kontrolą prędkości silnika DC. Wykorzystuję silnik DC od starej drukarki i układ oparty na mostku L398N (coś takiego - http://cdn3.bigcommerce.com/s-vt19phz/product_images/uploaded_images/l298n-motor-driver-from-tronixlabs-australia.png ). Mostek zasilany osobno 12V. Motor startuje przy PWM ok 130. Problem że generuje takie "warczenie", dośc nieprzyjemne. Oczywiście przy pwm 255 znika. Przy niskich obrotach widać że jego praca jest bardzo nierówna.

Jak można się tego pozbyć? Można zastosować kondensator jako filtr? Silnik pobiera ok 120mA - 200mA przy 12V i pwm 255.

Kod:

#include <Wire.h>
#include <LiquidCrystal_I2C.h> // pobrany lib od I2C

#define enA 6
#define in1 9
#define in2 8

#define conFast 3
#define conSlow 2

// LCD na 0x3F
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6 ,7, 3, POSITIVE);

// speed
int spd;
int ctrl;

void spdup();
void spddown();

void setup() {
 spd = 0;
 ctrl = 0;
 // wyswietlacz
 lcd.begin(16,2);
 lcd.setCursor(0,0);
 lcd.print("Motor PWM - ");
 lcd.print(ctrl);
 lcd.setCursor(0,1);
 lcd.print("Zadane - ");
 lcd.print(spd);
 // silniki
 pinMode(enA, OUTPUT);
 pinMode(in1, OUTPUT);
 pinMode(in2, OUTPUT);
 digitalWrite(in1, LOW);
 digitalWrite(in2, HIGH);  
 // sterowanie (przerwania)
 pinMode(conFast, INPUT_PULLUP);
 pinMode(conSlow, INPUT_PULLUP);
 attachInterrupt(digitalPinToInterrupt(conFast), spdup, RISING);
 attachInterrupt(digitalPinToInterrupt(conSlow), spddown, RISING);
}

void loop() {
 // wyswietlenie
 lcd.clear();
 lcd.setCursor(0,0);
 lcd.print("Motor PWM - ");
 lcd.print(ctrl);
 lcd.setCursor(0,1);
 lcd.print("Zadane - ");
 lcd.print(spd);
 // sprawdzenie czy za wolno
 if(ctrl < spd){
   for (ctrl; ctrl < spd; ctrl++) {
   analogWrite(enA, ctrl);
   delay(50);
   }
 } else {
 delay(25);
 }
// sprawdzenie czy za szybko
 if(ctrl > spd){
   for (ctrl; ctrl > spd; --ctrl) {
   analogWrite(enA, ctrl);
   delay(50);
   }
 } else {
 delay(25);
 }
//koniec
}

void spdup() {
 if(spd <= 255){
 spd = spd + 15;
 } else {
 }
}

void spddown() {
 if(spd >= 15){
 spd = spd - 15;
 } else {
 }
}

Udostępnij ten post


Link to post
Share on other sites

Jaką częstotliwość ma stosowany przebieg PWM?

Udostępnij ten post


Link to post
Share on other sites

Częstotliwości bazowe Arduino. Nie zmieniałem ich, zresztą widać to w kodzie. Wiem że jest to ok 490Hz. Czytałem że można je zmieniać ale wolę się na razie tym nie bawić, za cienki na razie jestem 🙂.

Jeszcze mam dodatkowe pytanie, związane z pomiarem prędkości silnika. Mam czujnik FC-03 taki jak tutaj http://i58.tinypic.com/sotohu.jpg . Rozumiem że skoro czujnik bazuje na podczerwieni to muszę w tarczce wyciąć dziury (mam jakąś tarczke od drukarki ale jest tylko malowana)? Ma on wyjścia D0 i A0 oprócz zasilania. Gdy natrafi na dziurę podaje sygnał HIGH na porcie D0 tak?

Udostępnij ten post


Link to post
Share on other sites

Jedynym znanym mi sposobem pozbycia się dźwięku wynikającego ze stosowania PWM jest zwiększenie częstotliwości przebiegu ponad częstotliwości słyszalne przed człowieka. Pomijam tutaj to czy zastosowany mostek będzie zadowolony z takiej częstotliwości.

Edit: a to co słyszysz to właśnie częstotliwość PWM + pewnie harmoniczne

Udostępnij ten post


Link to post
Share on other sites

A zastosowanie kondensatora nie powinno nieco wygładzić fali? Wrażenia dźwiękowe to akurat mało mnie interesują. Ważniejsze aby silnik kręcił się stabilnie i pomiar z czujnika się nie sypał.

Szczerze mówiąc myślałem że przy 490Hz to już nie bedzie odczuwalne dla niezbyt małego silnika. Dzwięk brzmi raczej jak 50-100Hz, troche to dziwne.

Udostępnij ten post


Link to post
Share on other sites

No tak, prawie 500Hz to już miłe buczenio-piszczenie. Może masz jakiś problem z zasilaniem? Jakieś tętnienia 50Hz na szynie zasilania mostka lub niestabilność zasilacza? Z czego to napędzasz? Duży kondensator na wyjściu mostka jest wykluczony, zapomnij.

Udostępnij ten post


Link to post
Share on other sites

Możliwe, ale spróbuj oszacować jakiej pojemności kondensatora potrzebowalbyś żeby dał odpowiedni efekt.

Udostępnij ten post


Link to post
Share on other sites

Na razie zasilam z zasilacza testowego Aps3005s, ustawiony na równo 12V. Na zasilaczu bezpośrednio silnik chodzi równo. Po zamontowaniu urzadzenia będzie wykorzystany zasilacz impulsowy 12V 2,3A od dekodera cyfrowego polsatu 😋.

Czytałem że przy większych silnikach pomaga czasem obniżenia częstotliwości aż się trafi na odpowiednią, może tego spróbuję,

Udostępnij ten post


Link to post
Share on other sites

Fajne fajne, podobają mi się takie zabawy z takimi zabawkami 🙂

Udostępnij ten post


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!

Gość
Napisz odpowiedź...

×   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...