Skocz do zawartości

[C] Sterowanie silnikami przez PWM


ps19

Pomocna odpowiedź

Montaż jest, jakby to powiedzieć, niechlujny (nie wiem czy to wynika z braku narzędzi, czy lenistwa). Prawdopodobnie to jest pierwszy najbardziej rażący błąd w konstrukcji. Według pierwszego schematu (wnioskuję, że jest to schemat tego samego robota) miałeś źle podłączone mostki. Jeśli w drugiej wersji, tak po prostu połączyłeś te kanały (nie przecinając wcześniejszych połączeń), to nie ma się co dziwić, że są problemy...

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

Nie wiem dlaczego, ale nadal na wyjściu OC1B nie jest generowane PWM,działa tylko OC1A.

	TCCR1A |= (1<<WGM10); //Fast PWM 8bit
TCCR1B |= (1<<WGM10); //Fast PWM 8bit
TCCR1B |= (1<<CS10); //Preskaler 64
TCCR1A |= (1<<COM1A1) | (1<<COM1B1); //Clear down
TCCR1B |= (1<<COM1A0) | (1<<COM1B0); //Clear down
TCCR1A |= (1<<FOC1A) | (1<<FOC1B);

OCR1A = 200;
OCR1B = 200;

Co do estetyki to gdzieś w połowie wakacji będę wysyłał poprawioną wersję płytki do Satlandu.Wtedy nie będzie już drucików zamiast ścieżek.

Jak na razie musi mi wystarczyć ta wersja płytki - brak finansów.

Link do komentarza
Share on other sites

Tyle, że właśnie nie wiem co pokręciłem z bitami.

To jest wg. noty i też nie działa:

int main(void)
{
DDRB |= _BV(PB0) | _BV(PB1);
DDRC |= _BV(PC5) | _BV(PC7);
DDRD |= _BV(PD4) | _BV(PD5);

TCCR1A |= (1<<WGM10) | (1<<CS10); //Fast PWM 8bit
TCCR1B |= (1<<WGM12) | (1<<WGM11) | (1<<CS10); //Fast PWM 8bit
TCCR1A |= (1<<COM1A1) | (1<<COM1B1); //Clear down
//TCCR1A |= (1<<FOC1A) | (1<<FOC1B);

OCR1A = 200;
OCR1B = 200;

while(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

No to jak nie wiesz, to się nad tym zatrzymaj zamiast pokazywać w panice jakieś kody "wg. noty". Po co szukasz w notach aplikacyjnych skoro nie rozumiesz znaczenia (tak to wygląda) bitów i ich rozmieszcznienia w rejestrach? Chcesz to zrozumieć czy czekasz na gotowca?

Otwórz dane katalogowe tego procesora na rozdziale dot. timera 1. Znajdź rozpisane na bity rejestry TCCR1A oraz 1B (dla ułatwienia: kilka stron dalej) i napisz czego nie rozumiesz. Odpowiedź: "wszystkiego" jest nieakceptowalna. Próby udowodnienia, że przecież wszystko robisz dobrze i pewnie masz zepsuty procesor - także. Byłoby miło, gdybyś swoje konkretne wątpliwości wyraził w formie np. osobnych punktów.

EDIT: Przepraszam, pisaliśmy razem na ten sam temat.

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

Już działa - wystarczyło dodać zmianę stanu na wybrany pinie.

Kopia zapasowa:

	int main(void)
{
//DDRB |= _BV(PB0) | _BV(PB1);
//DDRC |= _BV(PC5) | _BV(PC7);
DDRD |= _BV(PD4) | _BV(PD5);

TCCR1A |= (1<<WGM10); //Fast PWM 8bit
TCCR1B |= (1<<WGM12); //Fast PWM 8bit
TCCR1B |= (1<<CS10) | (1<<CS11); //Preskaler 64
TCCR1A |= (1<<COM1A1) | (1<<COM1B1); //Clear down

OCR1A = 200;
OCR1B = 200;

	while(1){
LEWY_PRZOD;
PRAWY_PRZOD;
}

}
Link do komentarza
Share on other sites

ps19, przecież to co podałeś jako sprawną wersje do dokładnie mój kod jaki umieściłem już na samym początku dyskusji. Podmieniłeś go teraz, a nawet nie wiesz co zmieniłeś... Jakie pull-up'y, na wyjściach?

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Treker, Twój kod, ale i tak muszę zmienić preskaler i tryb bo silnik wydaje odgłosy jak stary traktor, także jak skończę pisać wstępne sterowanie to wtedy usunę powtórkę kodu.

marek1707, Chodzilo mi o zmianę stanu nie wiem dlaczego napisałem pull-up 😋

Link do komentarza
Share on other sites

o zmianę stanu

To również tutaj nie pasuję... Nie rozumiem o co Ci chodzi, przecież po prostu miałeś złe wartość wpisane w rejestry, nie ma to związku z żadnymi I/O.

Link do komentarza
Share on other sites

Możliwe.Nie będę się sprzeczał bo nie pamiętam wszystkiego co wyprawiałem z tym PWM`em i moja wiedza jest jeszcze trochę skromna.

Link do komentarza
Share on other sites

Może zasntanowisz się nad zastosowaniem bibliotek ASF, Przykładowo uzyskanie PWM:

struct pwm_config pwm_cfg;

pwm_init(&pwm_cfg, PWM_TCE0, PWM_CH_A, 500); // czestotliwosc 500hz

pwm_start(&pwm_cfg, 50); // wypelnienie 50%

Na początek, czy li tylko dla proof of concept - bardzo dobrze się sprawdza (imho!)

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.