• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
PWM - piszczenie silnika
#11
(20-02-2018, 10:07)Smaczek napisał(a): Witam,
Zastanawia mnie linijka:   pinMode(3, pot2);
Zwłaszcza drugi argument.
Pozdrawiam,
Tomek.

Z tego co zrozumiałem (może źle) :
 int pot = (analogRead(A0)); przypisz nazwie pot wartości odczytane z analog 0
 int pot2 = (pot/4);              przypisz nazwie pot2 wartość pot podzieloną przez 4
  
      pinMode(3, pot2);         pin wyjściowy 3 równy jest wartości pot2 tj a0/4 (0-1023/4=0-255)
??? dobrze to rozumiem ???
 
Odpowiedź
#12
Witam,
Funkcja pinMode(), według dokumentacji ustawia dany pin jako wejście, podciągnięte wejście albo wyjście. Do wpisywania wartości z zakresu 0-255 służy raczej funkcja analogWrite().
Pozdrawiam,
Tomek.
 
Odpowiedź
#13
https://forbot.pl/blog/wszystko-co-musis...pwm-id5021
Tutaj jest fajnie opisane.
 
Odpowiedź
#14
(21-02-2018, 10:35)OMK napisał(a): https://forbot.pl/blog/wszystko-co-musis...pwm-id5021
Tutaj jest fajnie opisane.

Prawdopodobnie jeszcze będę musiał do tego dorosnąć by zrozumiećSmile Niestety nie potrafię nigdzie poukładać moich linijek, aktualnie pominąłem efekt piszczenia poprzez wyeliminowanie momentu bezwładności zadziałania silnika:

Kod:
    int pot = A0;                                             // pin A0 =analogowe wejscie potencjometr
    int pwm = 3;                                              // pin 3  =sygnału wyjście pwm-a
void setup(){}                                                // funkcje przy załączeniu i resecie
void loop()                                   {               // początek pętli  
    int    potencjometr = analogRead(pot);                    // przypisz do "potencjometr" wartość wejścia analogowego pot(A0)
    int    wypelnienie = map(potencjometr, 10, 1023, 70, 255);// przypisz do "wypełnienie" zmapowaną wartość "potencjometr"
    if (potencjometr > 10)            {                       // jeżeli potencjometr jest więcej niż 10:
      analogWrite(pwm, wypelnienie);   }                      // na wyjściu 3 zasilanie pwm silnika = wypełnienie
    if (potencjometr < 10)  {                                 // jeżeli potencjometr jest mniej niż 10:
      analogWrite(pwm, 0);   }                 }              // na wyjściu 3 zasilanie pwm silnika = 0 //koniec pętli


PS: temat nie jest zakończony gdyż nadal chciałbym ruszyć silnikiem na innej częstotliwości. Chętnego na podanie prostego kodu od początku do końca z użyciem potencjometru który steruje wyjściem PWM z możliwością zmiany częstotliwości do zasilania silnikiem jak najbardziej potrzebuję Smile. Aktualnie w skromnej samoocenie problem piszczenia tylko zatuszowałem :X
 
Odpowiedź
#15
Information 
Nie dawało mi to spokoju, i jednak coś wyszłoSmile

Kod:
#include <PWM.h>                                      //zainklementowana biblioteka
int32_t frequency = 15000;                            //częstotliwość w Hz
void setup ()                        {
  InitTimersSafe ();
  SetPinFrequencySafe(9, frequency); }                //pin 9 nadaj częstotliwość
void loop(){

  int potencjometr = analogRead(A0);                  //nazwie potencjometr nadaj wartosc analog zero
  analogWrite(9, potencjometr / 4);                   //podaj na wyjscie (0-255) warotść potencjometr podzieloną przez 4
  delay(30);}                                         //czekaj 30ms
/* adres do biblioteki
 *  https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/arduino-pwm-frequency-library/Arduino%20PWM%20Frequency%20Library%20v_05.zip
 *  Ja skopiowałem do folderu dokumenty/Arduino/libraries tylko folder pwm i po resecie ardunio IDE program działa
 */

jakby ktoś nie mógł ściągną potrzebnej biblioteki :


Załączone pliki Miniatury
   
 
Odpowiedź
#16
G woli ścisłości dla potomnych, wytłumaczmy sobie działanie programu z poprzedniej strony i dla czego nie robił tego co by autor chciał żeby robił.
Zaznaczyć trzeba, że program robi zawsze to, do czego został napisany.
W naszym przypadku te dziwne zaklęcia w stylu: TCCR2A = _BV(COM2B1) | _BV(WGM21) | _BV(WGM20); włączają dwa kanały timera. Kanał A na 38.4kHz (no nie do końca się zgodzę z autorem), kanał B na połowę kanału A.
Po różnych czarodziejskich wyrażeniach na nogę PIN3 wystawiony zostaje sygnał o częstotliwości kanału A z wypełnieniem 50% (ponieważ B/A=0.5).
Dopiero w funkcji loop(); mamy pinMode(3, pot2);
To znaczy, że jak pot2>0, to PIN3 ustawiony zostaje jako wyjście i otrzymujemy na nim sygnał z zegara.
Silnik nie pracuje na pełnych obrotach jak to napisał bako1987, tylko na 50%.
Potencjometr po prostu włącza i wyłącza sygnał PWM na nodze 3.
Chcąc rozwiązać nasz problem, musimy zacząć sterować wypełnieniem, czyli nomen omen wartością kanału B dla OCR2.
I myślę, że w tym przypadku powinno to wyglądać tak:

void loop(){
int pot = (analogRead(A0));
val = map(val, 0, 1023, 0, 51);
OCR2B=val;
}
Rozwiązanie bako1987 z wykorzystaniem biblioteki PWM, jest dokładnie tym samym co ja tu napisałem, tylko że biblioteka jest opasła ze względu na zawartość wielu niepotrzebnych nam funkcji( niepotrzebnych w tym przypadku)
Dla usprawnienia można jedynie użyć makra digitalPinToTimer.
Pozdrawiam.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#17
Aha i jeszcze jedno.
MOSFET piszczy, ponieważ sygnał kluczujący jest w zakresie częstotliwości słyszalnej.
Dla 39kHz już tego nie słychać.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości