witam, potrzebuję pomocy przy rozgryzieniu PWM dla atmega32 (16MHz) docelowo jest to potrzebne do sterowania prędkością silników z wykorzystaniem mostka H. Chciałbym to napisać w C, mam gotowy kod w bascomie z ks ekspert, ale w żaden sposób nie mogę przenieść tego do C. Tak w ogóle to dopiero zaczynam moją przygodę z elektroniką i programowaniem, poprzeglądałem już kilka kodów źródłowych w których był stosowany pwm, ale nie mogę wyciągnąć żadnego wspólnego mianownika. Widziałem źródła programów w których cały pwm miescił sie w 4 krótkich linijkach, a były też kobyły które ciągnęły się jak makaron do spaghetti. Mój układzik wygląda tak:
http://www.wynajem-maszyn.pl/poligon/sumo/sumo.gif
a kod źródłowy który na razie udało mi się do tego stworzyć prezentuje się tak:
void lkp() { cbi(PORTB,7); sbi(PORTB,6); sbi(PORTD,5); } // lewe koło przód
void lkt() { sbi(PORTB,7); cbi(PORTB,6); sbi(PORTD,5); } // lewe koło tył
void lks() { cbi(PORTB,7); cbi(PORTB,6); cbi(PORTD,5); } // lewe koło stop
void pkt() { sbi(PORTB,5); cbi(PORTB,4); sbi(PORTD,4); } // prawe koło tył
void pkp() { cbi(PORTB,5); sbi(PORTB,4); sbi(PORTD,4); } // prawe koło przód
void pks() { cbi(PORTB,5); cbi(PORTB,4); sbi(PORTD,4); } // prawe koło stop
//sterowanie jazdą
void przod() { lkp(); pkp(); } // jazda do przodu
void tyl() { lkt(); pkt(); } // jazda do tyłu
void lewo() { lkt(); pkp(); } // skręt w lewo
void prawo() { lkp(); pkp(); } // skręt w prawo
void stop() { lks(); pks(); } // wyłącz silniki
int main(void)
{
DDRD = 0xff; // port D jako wyjscie
DDRB = 0xff; // port B jako wyjscie
//lcd_init(LCD_DISP_ON);
przod(); // jedz do przodu
//lcd_puts("Przod");
delay_ms(2000); // przez 2 sekundy
stop(); // stop
delay_ms(2000); // przez 2 sekundy
lewo(); // skret w lewo
delay_ms(2000); // przez 2 sekundy
prawo(); // skret w prawo
delay_ms(2000); // przez 2 sekundy
tyl();
stop(); // zatrzymaj silniki
}
To są moje początki w C także wszelkie optymalizacje mile widziane, ten kod powyżej nie jest do końca mojego autorstwa, jest wypadkową kilku rozwiązań jakie udało mi się znaleźć. Obszerne komentarze do ewentualnego kodu mile widziane
abxyz Expert programowanie Pomógł: 16 razy Posty: 158 Otrzymał 26 piw(a) Skąd: zza winkla
Uwaga, ten programik nie był sprawdzany z atmega32 16MHz, tak na oko, to powinien działać, ale nie musi, licho nie śpi. Jak znajdę gdzieś kwarc 16MHz, to program sprawdzę.
_________________ Nie powie ci nawet wiedźma Pleple, czego się dowiesz wprost z Google_
wydaje mi sie ze masz malutki blad przy funkcji do skretu w prawo, bedzie wtedy jechal do przodu bo masz wpisane lkp i pkp.
faktycznie
dzięki abxyz za kod,wstępnie w proteusie coś tam się kręci próbuję rozgryźć jak to działa, na razie znalazłem takie coś:
Generating PWM signals using Timers in the ATMega chip myślę ze z pomocą Twojego kodu i tej strony jakoś sobie poradzę
Nie możesz pisać nowych tematów Nie możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach Nie możesz załączać plików na tym forum Możesz ściągać załączniki na tym forum