Skocz do zawartości

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


Pomocna odpowiedź

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);
}

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

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

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

  • 3 tygodnie później...

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 {
 }
}

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?

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

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.

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.

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

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ę,

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