Skocz do zawartości

[Atmega16][C++] Okres i wypełnienie w 16bitowym PWM


nsmarcin

Pomocna odpowiedź

Witam,

Napisałem pewien kod, chodzi konkretnie o to, żeby używając sprzętowego PWM z Timera1 czyli 16bitowego sterować diodą LED tak, żeby przez sekundę się świeciła, a przez następną sekundę nie. Czyli okres 2sek i wypełnienie 50%. Chodzi o takie konkretne zastosowanie koniecznie sprzętowego PWM i niczego innego.

Po załadowaniu tego kodu okres wynosi jakieś 12 sekund zamiast 2sekund jak by wychodziło ze wzoru, a wypełnienie 50%.

Oto kod:

/*
AVR ATMEGA 16 (8MHz)
*/
#define F_CPU 8000000L
#include <avr/io.h>
#include <util/delay.h>



int main(void)
{


// Konfiguracja portów we/wy
DDRD = 0xFF; // OC1A i OC1B wyjścia m.in PWM

/* Ustawienie sprzętowego PWM */
/* ATmeta16 8MHz, PWM 0.5Hz */
ICR1 = 0xFFFF; // =65535

TCCR1A|=((1<<COM1A1)|(1<<COM1A0)|(1<<WGM11));
/* Preskaler 256 */
TCCR1B|=((1<<WGM13)|(1<<WGM12)|(1<<CS12));

while(1)
{

OCR1A = 0x7FFF; //wypełnienie 50% = 65536/2

}
}
Link do komentarza
Share on other sites

Ustaw OCR1A przed whilem. Nieustanne nadpisywanie tej wartości w pętli głównej nie jest szczęśliwym rozwiązaniem. Sprawdź też taktowanie samego procka (fuse bity). Te 12 sekund nie daje żadnej sensownej wielokrotności teoretycznych wyliczeń. Sprawdziłem i niby rejestry masz prawidłowo ustawione.

  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

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

OCR1A zmieniłem już tzn dałem przed while, natomiast jest jeszcze jedna rzecz mianowicie czy dobrze rozumiem, że w trybie 14 PWM wartość ICR1 służy do ustawienia maksymalnej wartości licznika, a OCR1A do ustalenia wartości przy której ma się zmieniać stan wyjścia (nie wiem czy dobrze rozumiem ale w datasheetcie ta wartość przy której zmienia się stan wyjścia to TOP)? Bo z dokumentacji wynika, że to właśnie ICR1 służy do ustawienia wartości TOP.

A jak to działa w trybie 15? Bo tam z kolei jest OCR1A do ustawienia wartości TOP i już mi się miesza bo niby działa w trybie 14 ale TOP jest ustawiane nie za pomocą ICR1 tylko OCR1A. Chyba, że w ogóle źle rozumiem ten fragment dokumentacji.

[ Dodano: 17-07-2011, 22:58 ]

Rzeczywiście problem tkwi w częstotliwości uC, która wynosi 1MHz, a nie jak myślałem 8MHz. Jako, że nie wiem jak to zmienić tzn nie bardzo wiem jak dostać się do fuse bitów to zostawiłem 1MHz i preskaler 64 i mam okres 4 sekundy, ale mniej więcej mój problem został rozwiązany. Jeśli ktoś mógłby w przystępny sposób nakierować mniej jak zmienić te fuse bity to byłbym wdzięczny.

Link do komentarza
Share on other sites

Ale maksymalna wartość licznika to chyba właśnie jest 2^16 czyli 65536 (w tym przypadku 65535 bo liczy od 0)

Sorki miało być 6 razy mniej. 6 razy mniej, więc licznik będzie pracował z 6 razy większą częstotliwością. 65536/6 to około 10992. Do OCR1A wpisujesz wartość o połowę mniejszą niż ICP1 więc 10992/2 to 5496.

PS maksymalnie, ustawione na stałe 65536, tylko w trybie normal.

Link do komentarza
Share on other sites

nsmarcin, twój cały temat powinien wylądować w koszu. Widzę, że na elektrodzie założyłeś identyczny temat. Niestety nie ma on w moim mniemaniu żadnego związku z tematyką forum.

Link do komentarza
Share on other sites

A czy fuse bity można ustawiać bezpośrednio w kodzie programu? Bo PonyProg mi nie działa tzn nie może połączyć się z programatorem.

Sabre mój temat chyba w odpowiednim dziale, jest związany z programowaniem mikrokontrolerów i to jak widać początkującym

Link do komentarza
Share on other sites

Tak, masz rację ale nie w celu uzyskania mrygadełka. Bądźmy poważni, na tym forum budujemy roboty a nie mrugamy diodami. Jak chcesz sobie pomrugać diodą, to elektroda jest właściwym miejscem.

Link do komentarza
Share on other sites

Moim zdaniem Sabre zbyt ostro egzekwujesz związek tematów z tematyką forum (z resztą innych też to się tyczy). Rozumiem, że może cię irytować jeśli ktoś zakłada taki sam temat tutaj i na elektrodzie i pyta się o coś co było tłumaczone milion razy. Jednak weź pod uwagę, że to dział programowania dla początkujących i żeby poprawnie sterować silnikiem za pomocą PWMów jednak najpierw każdy musiał się nauczyć mrugać tą diodą. Moim zdaniem więc temat jest we właściwym miejscu. Tym bardziej, że bardzo dużo tematów w tym dziale nie dotyczy bezpośrednio budowy robotów tylko właśnie obsługi peryferiów, użycia programatora, fusebitów itp.

Link do komentarza
Share on other sites

GAndaLF, gdyby to dotyczyło PWMu dla silników to nawet bym się nie odezwał, ale widać i jest to dla mnie jasne, że nie dotyczy. Pomigać diodami każdy może, o ile to ma sens i związek z tematyką forum, a nie miganie dla migania.

Link do komentarza
Share on other sites

Moim zdaniem zakładanie takich samych tematów na RÓŻNYCH forach nie jest niczym złym. Inni forumowicze, inne podejście. Osobiście od momentu zarejestrowania się tutaj stawiam diode poniżej elektrody (odnoszę się do zawartości,którą widzę a nie forumowiczów, których nie znam)- tutaj jest naprawdę sporo pytań, na które odpowiedzi są o wiele bardziej pod ręką w porównaniu z elektrodą, po prostu poziom merytoryczny dla mnie jest wyższy.

Kolejne moje osobiste spostrzeżenie to to, że początkujące osoby które tutaj zadają pytania za dużo pozostawiają osobom doświadczonym a za mało próbują samemu rozwiązać problem lub poszukać odpowiedzi w necie.

Bardziej wracając do tematu- cóż to za różnica Sabre jaki masz odbiornik w ramach tego samego sygnału sterującego- czy to dioda z rezystorem czy baza tranzystora? Poziom merytoryczny taki sam wg mnie. Lepiej się uczyć na prostym odbiorniku niż później palić klucze/procki.

Link do komentarza
Share on other sites

no właśnie chodzi mi o to samo co Barto. Jak ktoś nigdy wcześniej nie miał do czynienia z PWMem to najpierw miga na diodzie a jak mu to wychodzi to dopiero zmienia sprzęt. Nie ma co się tak burzyć to całkowicie normalne a tak tylko zniechęcasz początkujących 😋

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.