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

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ę »
×
×
  • 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.