Skocz do zawartości

Sodar

Użytkownicy
  • Zawartość

    13
  • Rejestracja

  • Ostatnio

Reputacja

0 Neutralna

O Sodar

  • Ranga
    2/10
  • Urodziny 22.08.1984

Informacje

  • Płeć
    Mężczyzna
  • Lokalizacja
    Torzym
  • Zainteresowania
    Technika, Kosmos, Nagisa
  1. Macie może doświadczenia z konstruowaniem filtrów RC dla silników w takim układzie? Mam średniej wielkości silnik DC zasilany 12 V z układu L298N sterowanego arduino. Częstotliwość PWM ustawiona na 122 Hz. Chciałbym zmniejszyć drgania silnika przy niskich wypełnieniach impulsu.
  2. Zależy jaki silnik. Ale chyba tylko takie małe jak w tanich wiatraczkach usb mogą być zasilane bateriami. Ja w projekcie z silnikiem od drukarki używałem akumulatora żelowego 12V 5Ah :p.
  3. Dziękuję za pomoc. Coś to pomogło ale nadal wyniki są bardzo niestabilne. Pewnie masz racje że sygnał ma poszarpane zbocza i łapie na zakłóceniach przerwania. Niestety oscyloskopu nie mam ale tak to wygląda.
  4. No właśnie nie bardzo wiem jak synchronizować inkrementacje zmiennej rpm z wykonywaniem programu. Może zmienię counts na byte a czas zliczania ograniczę na tyle aby nie "wychodziło" ponad 255? Co to pracy w zamkniętej pętli - tak ma być, wypisanie prędkości obrotowej to tylko bajer. Choć planuję zrobić jakieś zabezpieczenie np. spowolnienie turbiny po przekroczeniu pewnej prędkości lub ostrzeżenie (np dioda) przy zbyt małej prędkości (zatkanie wylotu). Turbina nie jest sterowana bezpośrednio poprzez PWM ale sygnał podawany jest do elektroniki silnika i to on steruje.
  5. Witam Wykombinowałem sobie takie małe urządzonko. Jest to wentylator odśrodkowy z chłodzenia serwera, arduino zaś robi za kontroler obrotów poprzez generowanie sygnału PWM. Kontrola PWM działa bez problemu. Co prawda turbiny nie da się spowolnić do zera bo ma własną elektronikę - układ soft-start. PROBLEM: Niebieski przewód zdaje się że generuje sygnał obrotowy, podłączyłem go wg zaleceń w jednym z tutoriali. Teoretycznie działa ale im szybciej pracuje turbina tym bardziej niewiarygodna jest wartość, którą podaje. Przy maksymalnej prędkości w ogóle się coś zawiesza na stałej wartości, ok 1500 (ale czego to nie wiem). Dla mnie w ogóle dziwne jest że przy oknie zliczania na ok 0,5s podaje prawie 5000 impulsów.. Jak to w ogóle możliwe? Coś mi się wydaje że czujnik prędkości w tej turbinie to coś innego niż spotykany na ogół sensor Halla. Oczywiście dokumentacji dokładnie do tej wersji turbiny nie znalazłem, więc trochę błądzę po omacku . Turbina: Delta Electronics BFB1012VH-5D84 Arduino Uno R3, dekoder I2C Zasilacz od dekodera polsatu 12V 2,3A Zdjęcie jej i schematu w załącznikach. Niebieski obwód to właśnie ten kabel czujnika obrotów. Żółty zaś to PWM. Kod: #include <Wire.h> #include <TimerOne.h> #include <LiquidCrystal_I2C.h> // pobrany lib od I2C #define btnUp 4 #define btnDown 5 #define ctrlPwm 3 #define sensePin 2 // LCD na 0x3F LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6 ,7, 3, POSITIVE); // speed unsigned int ctrl; unsigned int pwm; unsigned int rpm; unsigned int counts; void licznik() { counts++; } void pomiarRPM() { Timer1.detachInterrupt(); rpm = counts; counts=0; Timer1.attachInterrupt(pomiarRPM); } void bar() { switch (ctrl){ case 1: lcd.setCursor(5,0); lcd.print("[ ]"); break; case 2: lcd.print("[# ]"); break; case 3: lcd.print("[## ]"); break; case 4: lcd.print("[### ]"); break; case 5: lcd.print("[#### ]"); break; case 6: lcd.print("[##### ]"); break; case 7: lcd.print("[###### ]"); break; case 8: lcd.print("[####### ]"); break; case 9: lcd.print("[######## ]"); break; case 10: lcd.print("[#########]"); break; } } void sterowanie() { while(digitalRead(btnUp) == LOW){ if(ctrl < 10){ ctrl++; lcd.setCursor(5,0); bar(); delay(200); } else { lcd.setCursor(5,0); lcd.print("[ - MAX - ]"); delay(200); } } while(digitalRead(btnDown) == LOW){ if(ctrl > 1){ --ctrl; lcd.setCursor(5,0); bar(); delay(200); } else { lcd.setCursor(5,0); lcd.print("[ - MIN - ]"); delay(200); } } } void regulacja() { unsigned int spd; spd = ctrl*20+55; // sprawdzenie czy za wolno if(pwm < spd){ for (pwm; pwm < spd; pwm++) { analogWrite(ctrlPwm, pwm); delay(50); lcd.setCursor(3,1); lcd.print((pwm/10)*4); lcd.print("%"); } } else { } // sprawdzenie czy za szybko if(pwm > spd){ for (pwm; pwm > spd; --pwm) { analogWrite(ctrlPwm, pwm); delay(50); lcd.setCursor(3,1); lcd.print((pwm/10)*4); lcd.print("%"); } } else { } lcd.clear(); } void setup() { // sterowanie (przyciski) pinMode(btnUp, INPUT_PULLUP); pinMode(btnDown, INPUT_PULLUP); pinMode(ctrlPwm, OUTPUT); // pomiar pinMode(sensePin, INPUT); Timer1.initialize(500000); // 0,5 sekund attachInterrupt(digitalPinToInterrupt(sensePin), licznik, RISING); Timer1.attachInterrupt(pomiarRPM); // reset zmiennych ctrl = 1; pwm = 0; // wyswietlacz lcd.begin(16,2); lcd.clear(); lcd.setCursor(0,0); lcd.print("REG: "); lcd.setCursor(0,1); lcd.print("P: "); lcd.setCursor(8,1); lcd.print("R: "); } void loop() { unsigned int spd; spd = ctrl*20+55; // czytanie przyciskow sterowanie(); // uruchomienie if(pwm == 0){ analogWrite(ctrlPwm, 75); pwm = 75; } else { } // sprawdzanie if(pwm != spd){ regulacja(); } else { lcd.setCursor(0,0); lcd.print("REG: "); bar(); lcd.setCursor(0,1); lcd.print("P: "); lcd.print((pwm/10)*4); lcd.print("%"); } lcd.setCursor(8,1); lcd.print("R: "); lcd.print(rpm); delay(25); //koniec }
  6. To zależy od konstrukcji płytki z mostkiem. Gdzieś trafiłem na opis płytki gdzie takie stany pinów oznaczały zwarcie. Może błąd w projekcie . Ale nie dotyczy to układu mostka tutaj użytego. Błędna interpretacja, trochę jest tych płytek z mostkami do silników. Tak, wyjścia 5V możesz zasilić arduino jeśli zasilanie mostka nie jest większe niż 12V i zworka jest na miejscu. Mostek zawiera przeksztaltnik liniowy podobny do tego w Arduino więc zasady są takie same - im większe napięcie do zmiany tym mniejszy prąd dozwolony. Jaka jest wydajność zasilania 5V na tym mostku to nie mam pojęcia. Spotkałem się z określeniem "wydajne"
  7. Tak wyczytałem w "dokumentacji" tego mostka (mam taki sam). Nie zamierzam testować. A masz rację - mój błąd, stan taki sam na obu pinach sterujących odpowiada za hamowanie silnika.
  8. Tam jest taka zworka z tyłu. Łączy dwa piny. Można zamiast niej wsadzić rezystor i w ten sposób zmniejszyć jasność podświetlenia. Podejrzewam że pod jeden z tych pinów (ten bliżej napisu LED) można także podłączyć sygnał z arduino. Oczywiście także za pośrednictwem rezystora (dioda na pewno nie jest 5V).
  9. Widzę że lubicie pomagać . Oto co ja zauważyłem ze zdjęcia: - brak połączenia między GND mostka a GND arduino, musisz je dodać (skręc razem z kabelkiem minus zasilacza) - masz podłączone dwa silniki DC a tylko do ENB jest podłączenie, na drugim jest zworka do silników krokowych. Podłącz pod ENA pwm dla tego silnika po lewej... I pamiętaj że zworkę do zasilania przetwornicy 5V należy wyjąć pow. 12V zasilania silników. Zaś gdy nie jest wyjęta obok wejść 12V i GND masz... wyjście 5V do zasilenia np arduino, lcd itp (aczkolwiek nie wiem jaka jest wydajnośc przetwornicy w tym układzie..) digitalWrite(7,HIGH); digitalWrite(8,LOW); Uważaj na te stany, jeśli przypadkiem pojawi sie na obu HIGH - zwarcie mostka i do kosza...
  10. 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ę,
  11. 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.
  12. 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?
  13. 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 { } }
×
×
  • Utwórz nowe...