jogurt_wisniowy Napisano Luty 15, 2008 Udostępnij Napisano Luty 15, 2008 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: #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include <avr/signal.h> #include <stdlib.h> #include "lcd.c" #define cbi(sfr, b) (sfr &= ~(1<<b)) // bit 0 na pin portu #define sbi(sfr, b) (sfr |= (1<<b)) // bit 1 na pin portu // lewe kolo PortB 7,6 // prawe kolo PortB 4,5 // lewe kolo enable PORTD 5 // prawe kolo enable PORTD 4 long i2=0; void delay_ms(uint16_t ms) { while(ms) { _delay_ms(1); ms--; } } // sterowanie kolami 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 😉 Cytuj Link do komentarza Share on other sites More sharing options...
abxyz Luty 16, 2008 Udostępnij Luty 16, 2008 http://abxyz.eu.interia.pl/pwm/main.c http://abxyz.eu.interia.pl/pwm/main.hex 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ę. Cytuj Link do komentarza Share on other sites More sharing options...
yuuichi Luty 16, 2008 Udostępnij Luty 16, 2008 witam wydaje mi sie ze masz malutki blad przy funkcji do skretu w prawo, bedzie wtedy jechal do przodu bo masz wpisane lkp i pkp. Cytuj Link do komentarza Share on other sites More sharing options...
jogurt_wisniowy Luty 17, 2008 Autor tematu Udostępnij Luty 17, 2008 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ę Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
Mateusz Maj 9, 2010 Udostępnij Maj 9, 2010 Hej. Ehh już mam dość tego PWM 😋 bez oscyloskopu ciężko testować czy ustawiło się go dobrze. Mam pytanie, jaki tryb wybrać aby PWM miał o określoną częstotliwości i zmienne wypełnienie? Chodzi mi o sterowanie serwami, czyli około 50Hz i wypełnienie od 1ms do 2ms. Hmm i trochę odkopałem stary temat widzę 😃 Cytuj Link do komentarza Share on other sites More sharing options...
Nawyk Maj 10, 2010 Udostępnij Maj 10, 2010 atmega 32 serwa <- w google. I proszę: http://www.elektroda.pl/rtvforum/topic815122.html Temat niemal identyczny Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!