Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

ATMEGA 328P-AU - sygnał PWM

25 Gru 2016 15:37 1308 15
  • Poziom 8  
    Zaczynam przygodę z programowaniem AVRów, chciałbym zakręcić silniczkiem DC przy użyciu sygnału PWM na pinie PD6 (ATMEGA 328P-AU). Na razie w ramach testu chciałem wypróbować timer FAST PWM. Napisałem parę linijek kodu, które wydaje mi się, powinny działać, jednak coś nie gra. Czy ktoś byłby w stanie mnie naprowadzić na błąd, który popełniam? Poniżej kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 23  
    Cytat:
    Napisałem parę linijek kodu, które wydaje mi się, powinny działać,


    Programowanie jest jak opis czegoś. Niektóre opisy są nie zrozumiałe.
    Wystarczy, że opiszesz co robi pętla while, tylko nie opisuj linia po linii, tylko bardziej abstrakcyjnie, w jednym zdaniu co się dzieje w tej pętli.
  • Poziom 8  
    Inkrementuję wartość rejestru OCR0A do określonej wartości, po czym chcę tę wartość wyzerować
  • Poziom 31  
    Zacznij od tego, że przypisując wartość do zmiennej przed pętlą nie zmieniasz jej w pętli przy zmianie wartości zmiennej z której przypisujesz.

    A teraz pytanie, co ci nie działa ? :)

    Dodano po 1 [minuty]:

    PS. zarówno #define F_CPU 16000000UL jak biblioteka delay - to zło którego nie powinieneś nigdy używać.
  • Poziom 8  
    Silnik się nie obraca - to mi nie działa :D
  • Poziom 13  
    Witam,
    Dopisz bibliotekę #include <avr/interrupt.h>
  • Poziom 8  
    W zasadzie na razie i tak nie wykorzystuję przerwać, to sei() jest tam zbędne.
  • Poziom 31  
    Daj schemat i zdjęcie połączenia.

    Ogólnie rzecz ujmując ustawiając wypełnienie jako 100% i tryb jako low masz 0 na wyjściu i jako że później tego wypełnienia nie zmieniasz (twoja pętla nic nie robi - patrz mój post wyżej) nie zmieniasz nic na wyjściu.
    Weź poprawkę, że zmienna podwójnej precyzji nie bardzo się nadaje do tego celu. Zamiast double test=0; napisz np char test=100; na początku i wtedy napisz czy ci to działa.
  • Poziom 8  
    Jeżeli chodzi o schemat to jest to wytrawiona płytka, na schemacie mam wyprowadzenie z pinu PD6.

    Zmieniłem na coś takiego, jednak nadal bez zmian:

    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 33  
    Witam
    Nie wiem co to za silnik, ale trudno będzie zaobserwować cokolwiek jak traktujesz silnik dość szybkozmiennym przebiegiem piłokształtnym ( wartość test zmienia się 10 razy na sekundę ) jak na typowe bezwładności silników.
    Nie wnikam czy delay jest cool w programach, ale jak zwiększysz delay do 1000 to może coś zauważysz.
    Druga sprawa to Fast PWM, szacowałeś jaka będzie częstotliwość? może się okazać że jak będzie to bardzo dużo to sygnał zdechnie na indukcyjnościach....
    Podłącz jakiś element niskoindukcyjny o małej bezwładności ( żarówka ? ) to zauważysz efekt nawet dla delay 100.
    Pozdrawiam
  • Poziom 23  
    Cytat:
    Wystarczy, że opiszesz co robi pętla while


    Cytat:
    Inkrementuję wartość rejestru OCR0A(...)


    Nawet po zmianie, zwiększasz zmienną test a nie wartość rejestru OCR0A, Zmienną test, której wartość nigdzie nie używasz.
  • Poziom 8  
    No tak, zauważyłem właśnie, że nic z tym rejestrem nie robię... Jednak obecnie również bez zmian:

    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 13  
    Zerknij na to
    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 8  
    Mam 4 piny z PWMem wykorzystane w układzie, teraz próbuję na PB1, nieco przerobiłem kod, natomiast ten silnik również się nie obraca. Czy nadal coś robię źle?

    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 23  
    Cytat:
    for(;;); //Pętla nieskończona


    Jaki świąteczny akcent. Może jednak warto, używać znaczników code.