Strona Główna
FAQFAQ  SzukajSzukaj  UżytkownicyUżytkownicy RegulaminRegulamin  GrupyGrupy
RejestracjaRejestracja  ZalogujZaloguj






Przyszłość jest w naszych rękach...
...bo przyszłość to robotyka.





Poprzedni temat «» Następny temat
Przesunięty przez: daniel93
25 Cze 08 01:29
PWM na atmega32 w C
Autor Wiadomość
jogurt_wisniowy 


Posty: 10
Skąd: Mysłowice
Wysłany: 15 Lut 08 02:11   PWM na atmega32 w C

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:
Kod:
#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 ;)
Postaw piwo autorowi tego posta
 
 
abxyz 
Expert programowanie


Pomógł: 16 razy
Posty: 158
Otrzymał 26 piw(a)
Skąd: zza winkla
Wysłany: 16 Lut 08 11:23   

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ę.
_________________
Nie powie ci nawet wiedźma Pleple, czego się dowiesz wprost z Google_
Postaw piwo autorowi tego posta
 
 
yuuichi 


Posty: 1
Skąd: Stalowa Wola
Wysłany: 16 Lut 08 09:45   

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.
Postaw piwo autorowi tego posta
 
 
jogurt_wisniowy 


Posty: 10
Skąd: Mysłowice
Wysłany: 17 Lut 08 11:02   

yuuichi napisał/a:
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ę
Postaw piwo autorowi tego posta
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
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
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  


website uptime

Powered by phpBB modified by Przemo © 2003 phpBB Group
kredyt przez internet

Love and Light Dominik Peh kosmetyki nero BearShare taniec nowoczesny Warszawa taniec z gwiazdami Porównywarka cen elektroniki