Skocz do zawartości

PWM na atmega32 w C


jogurt_wisniowy

Pomocna odpowiedź

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 😉

Link do komentarza
Share on other sites

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ę

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

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ę 😃

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.