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

ATMEGA 328P-AU - sygnał PWM

Boryna95 25 Gru 2016 15:37 954 15
  • #1 25 Gru 2016 15:37
    Boryna95
    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

    0 15
  • #2 25 Gru 2016 18:56
    Eagle
    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.

    0
  • #3 25 Gru 2016 19:13
    Boryna95
    Poziom 8  

    Inkrementuję wartość rejestru OCR0A do określonej wartości, po czym chcę tę wartość wyzerować

    0
  • #4 25 Gru 2016 19:15
    drobok
    Poziom 28  

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

    0
  • #5 25 Gru 2016 19:42
    Boryna95
    Poziom 8  

    Silnik się nie obraca - to mi nie działa :D

    0
  • #6 25 Gru 2016 19:49
    ejcon
    Poziom 13  

    Witam,
    Dopisz bibliotekę #include <avr/interrupt.h>

    0
  • #7 25 Gru 2016 19:58
    Boryna95
    Poziom 8  

    W zasadzie na razie i tak nie wykorzystuję przerwać, to sei() jest tam zbędne.

    0
  • #8 25 Gru 2016 19:58
    drobok
    Poziom 28  

    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.

    0
  • #9 25 Gru 2016 20:09
    Boryna95
    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

    0
  • #10 25 Gru 2016 20:11
    PiotrPitucha
    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

    0
  • #11 25 Gru 2016 20:18
    Eagle
    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.

    0
  • #12 25 Gru 2016 20:26
    Boryna95
    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

    0
  • #13 25 Gru 2016 20:27
    ejcon
    Poziom 13  

    Zerknij na to

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #14 25 Gru 2016 22:49
    Boryna95
    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

    0
  • #16 26 Gru 2016 13:29
    Eagle
    Poziom 23  

    Cytat:
    for(;;); //Pętla nieskończona


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

    0
  Szukaj w 5mln produktów