haes17 Napisano Czerwiec 16, 2019 Udostępnij Napisano Czerwiec 16, 2019 Witam. Potrzebuję na wyprowadzeniach Arduino Nano D3 i D11 mieć sygnały PWM o częstotliwości 50Hz oraz jeden z sygnałów musi być odwrócony o 180. Jedyne co mi się udało osiągnąć to odwrócenie sygnału i częstotliwość 30 Hz. KOD: #define PWM1_Pin1 3 #define PWM1_Pin2 11 void setup() { pinMode(PWM1_Pin1, OUTPUT); pinMode(PWM1_Pin2, OUTPUT); TCCR2A = bit (WGM20)| bit (COM2B1) | bit (COM2A0)| bit (COM2A1); TCCR2B = bit(CS22)| bit(CS21)| bit (CS20); OCR2A = 127; OCR2B = 127; } void loop() { } Link do komentarza Share on other sites More sharing options...
marek1707 Czerwiec 17, 2019 Udostępnij Czerwiec 17, 2019 (edytowany) Acha, no to przykre. Zamiast jednak zmuszać nas do dekodowania Twojego programu i zastanawania się co w ogóle zrobiłeś, może napisz otwartym tekstem który tryb timera wykorzystałeś i dlaczego, jakim zegarem go napędzasz, jaki masz zegar CPU i co Ci przeszkadza w uzyskaniu tych upragnionych 50Hz. To dużo ciekawsze niż wgapianie się w czyjś kod. Potem przejrzyj tabelkę z trybami timera 2 i może spróbuj sam sobie odpowiedzieć napytanie: czy jest taki tryb w którym da się uzyskać programowaną długość okresu a nie tylko wypełnienie. Trybów jest kilka - może któryś przypasuje? A jeśli nie, to może czas zmienić timer na bardziej rozbudowany? To prawdopodobnie będzie rozwiązanie Twojego problemu. Edytowano Czerwiec 17, 2019 przez marek1707 Link do komentarza Share on other sites More sharing options...
deshipu Czerwiec 17, 2019 Udostępnij Czerwiec 17, 2019 Tak na marginesie, jak kiedyś potrzebowałem dwa serwa sterowane tym samym sygnałem, ale w przeciwnych kierunkach, to po prostu jedno z nich otworzyłem i pozamieniałem kabelki do silnika i do potencjometru... Link do komentarza Share on other sites More sharing options...
marek1707 Czerwiec 17, 2019 Udostępnij Czerwiec 17, 2019 No, ale odwrócenie sygnału do serwa nic nie da, bo używany tu ciąg PPM jest niesymetryczny. Wypełnienie zmienia się od 2.5 do 7.5%. Jeśli to zwyczajnie zanegujesz dostaniesz sygnał niezrozumiały dla serwa, więc (mam nadzieję) tutejsza zbieżność 50Hz ze sterowaniem serwomechanizmami jest przypadkowa. Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
haes17 Czerwiec 17, 2019 Autor tematu Udostępnij Czerwiec 17, 2019 (edytowany) Taktowanie procesora to : 16Mhz Tryb jaki wybrałem to : WGM20 = 1 0xFF PWM Phase Corrected (zczytane z tabelki) COM2A0=1 COM2A1=1 Inverted mode (LOW at bottom, HIGH on Match) COM2B1=1 None-inverted mode (HIGH at bottom, LOW on Match) Preskaler: CS22=1 CS2=1 CS20= 1 Clock / 1024 (zczytane z tabelki) Słabo operuję jeszcze na rejestrach i też nie do końca wiem czy wybrałem odpowiedni tryb bazowałem trochę na przykładach z innych forów internetowych. PWM potrzebuję do sterowania falownikiem. PWM mają przełączać MOSFETY raz jeden raz drugi dlatego potrzebuje to na dwóch pinach. Dane z jakich korzystałem https://sites.google.com/site/qeewiki/books/avr-guide/pwm-on-the-atmega328 TCCR2A = bit(COM2A0) | bit(COM2B1) | bit(WGM20); TCCR2B = bit(WGM22) | bit(CS22)| bit(CS21)| bit(CS20); OCR2A = 156; OCR2B = 4; Znalazłem również coś takiego lecz w tym przypadku na jednym pinie jest 50Hz natomiast na drugim 25Hz i przy każdej zmianie jest na drugim zmiana o pół. W tym przypadku: Tryb: WGM20 = 1 WGM21 = 0 WGM22=1 OCR0A PWM Phase Corrected Preskaler: CS22=1 CS2=1 CS20= 1 Clock / 1024 COM2A1=0 COM2A0=1 WGM22 = 0: Normal Port Operation, OC2A Disconnected WGM22 = 1: Toggle OC2A on Compare Match COM2B1=1 COM2B0=0 None-inverted mode (HIGH at bottom, LOW on Match) Z czego może wynikać te zmniejszenie o połowę? Edytowano Czerwiec 17, 2019 przez haes17 Link do komentarza Share on other sites More sharing options...
marek1707 Czerwiec 17, 2019 Udostępnij Czerwiec 17, 2019 Żeby mieć dwa sygnały odwrócone w fazie nie potrzebujesz dwóch kanałów PWM. Wystarczy jedno wyjście i bramka lub inwerter. A najlepiej użyć drivera MOSFET z kanałem prostym i odwróconym. Z tego co napisałeś to obawiam się jednak, że nie doceniasz problemu. Czy możesz napisać więcej o tym falowniku? W jakim układzie będzie pracował? Może wrzuć jakiś schemat? O jakich mocach mówimy? Czy myślałeś o czasach martwych dla tranzystorów? Jak to zrobisz? Są specjalne timery robiące takie rzeczy albo drivery rozsuwające sygnały Jak chcesz regulować napięcie/moc falownika mając tylko dwa symetryczne sygnały 50Hz? Czy nie potrzebujesz czasem regulacji współczynnika PWM? Do czego ten falownik? Czy schemat jest gotowcem z sieci, czy sam go wymyśliłeś? itd. itp.. Trochę nie rozumiem jak można napisać program i dopiero wtedy zastanawiać się dlaczego jakieś piny machają tak a nie inaczej. Nie planowałeś tego czy po prostu losowo ustawiasz bity i patrzysz co się stanie? Znalazłeś gdzieś i przeczytałeś opisy rejestrów tego timera i znaczenie bitów COM? To właśnie tam leży odpowiedź dlaczego jeno z wyjść pracuje dwa razy wolniej tzw. tryb toggle). 1 Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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ę »