Skocz do zawartości

Pomocna odpowiedź

Napisano

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 😉

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.

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ę

  • 2 lata później...

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

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...