Skocz do zawartości

[C] Ruszenie kołami - PWM


sidek92

Pomocna odpowiedź

Witam, staram się ruszyć dwoma kołami. Niestety gdzieś popełniam błąd i koła te się nie ruszają. W atmel studio zrobiłem symulacje i okazuje się, że podczas użycia funkcji PWM (kod poniżej) uaktywnia się się rejesr PIND, który moim zdaniem nie powinien zostać ustawiony. Czy ktoś widzi gdzie popełniam błąd? Mikrokontroler to atmega328p

#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 1000000UL
#define MOTOR_LEWY_PRZOD PORTD |= (1<<PD7)
#define MOTOR_PRAWY_PRZOD PORTD |= (1<<PD2)
#define MOTOR_LEWY_PWM OCR1A
#define MOTOR_PRAWY_PWM OCR1B

void PWM(int LEWY, int PRAWY)
{
if(LEWY>=0)
{
	if (LEWY>255)
	LEWY=255;
	MOTOR_LEWY_PRZOD;
}
if (PRAWY>=0)
{
	if (PRAWY>255)
	PRAWY=255;
	MOTOR_PRAWY_PRZOD;
}
MOTOR_LEWY_PWM = LEWY;
MOTOR_PRAWY_PWM = PRAWY;
}

int main(void)
{

TCCR1A |= (1<<COM1A1) | (1<<COM1B1) | (1<<WGM10);		
TCCR1B |= (1<<WGM12) | (1<<CS10);
	DDRB |= (1<<0) | (1<<1) | (1<<2);		//USTAWIENIE PB0/1/2 JAKO WYJSCIA
	DDRD |= (1<<2) | (1<<3) | (1<<7);		//USTAWIENIE PD2/3/7 JAKO WYJSCIA

int i;
for(i=0; i<10; i++)
{
PWM(30,5);
_delay_us(1000);
PWM(5,30);
_delay_us(1000);
PWM(0,0);
}
}
Link do komentarza
Share on other sites

Nie wniknąłem w ustawienia timera itd, ale czy możesz pokazać (np. przez megaszybkie mrugnięcie powieką) ile to jest 1000us? Bo nawet jeśli Twój program coś robi, to wykonanie całej pętli zajmie mu 20ms czyli 1/50s. A po jej zakończeniu oba PWM są wyzerowane i silniki stoją. Nie napracowały się, prawda?

I co to znaczy "uaktywnia się się rejestr PIND"?

Link do komentarza
Share on other sites

A wiesz co w tym rejestrze jest? Przecież jeśli coś wystawiasz na piny (PORTx), to w odpowiednim PINx widzisz nie tylko wejścia, ale i wystawione właśnie wyjścia, nieprawdaż?

A programy pisz wolniej i uruchamiaj po kolei. Nie działa cały kod? To napisz prostszy. Bez żadnych timerów, PWMów itp. gadżetów wystaw na odpowiednie piny stany 1 i 0 i sprawdź czy jeden silnik się obraca i czy umiesz go zatrzymać. Potem czy drugi robi to samo przy statycznym sterowaniu jego pinami. Nie? To szukasz miernikiem/woltomierzem przerw lub zwarć. Potem zamieniasz sterowanie wyjściem z trywialnego, programowego 0-1 na sprzętowy PWM przez włączenie timera. Jeśli nie działa to szukasz w timerze, bo już wiesz, że hardware jest OK - zawsze bazuj kolejne testy na już sprawdzonych elementach. A jak już PWM działa i możesz zmieniać prędkości i kierunki, zaczynasz z tego korzystać pisząc coraz bardziej skomplikowane algorytmy i funkcje.

Jeśli teraz, w tak prostym kodzie (a może w sprzęcie?) nie umiesz znaleźć błędu, to co da pokazanie tego miejsca? Za chwilę przyjedziesz z następnym. Masz robota na biurku, masz multimetr, masz kompilator. Teraz wystarczy już tylko odrobina cierpliwości i pomysłowości. Pamiętaj: zaczynaj od zera i małe kroczki - to działa. Zrobiłeś za duży i wpadłeś w błoto.

  • Pomogłeś! 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

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.