Skocz do zawartości

[C] Konfiguracja PWM dla mostka, Atmega8


Slawus

Pomocna odpowiedź

witam,

to mój pierwszy post, więc WITAM 😉

... i od razu proszę o pomoc.

Może ktoś z was wpadnie na pomysł dlaczego ten kod (tylko część PWM) nie działa? (LED działa tak jak powinien).

#define F_CPU 1000000L
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#define LED_PIN (1<<PD6)
#define LED_ON PORTD |= LED_PIN
#define LED_OFF PORTD &= ~LED_PIN

int main(void)
{
DDRB |= (1<<1)|(1<<2);	
DDRD |= LED_PIN;

TCCR1A |= (1<<WGM10);
TCCR1B |= (1<<WGM12);

TCCR1A |= (1<<COM1A1);
TCCR1A |= (1<<COM1B1);

TCCR1B |= (1<<CS10);
TCCR1B |= (1<<CS12);

OCR1A = 0;
OCR1B = 0;

   for(;;)
   {
	LED_ON;
	OCR1A = 127;
	OCR1B = 127;
   }
}

uC to atmega8a, dwa silniki pololu, mostek H - l293d.

Robot budowany na tej podstawie: https://www.forbot.pl/forum/topics20/dla-poczatkujacych-przepis-na-robota-w-pelni-programowalny-line-follower-vt2356,325.htm

Dodam, że z kodem Bascoma silniki działają bez zarzutu!

__________

Komentarz dodany przez: Treker

Poprawiłem temat.

Link do komentarza
Share on other sites

DDRB |= (1<<1)|(1<<2);  

Ten zapis jest nieczytelny, powinieneś pisać coś w stylu:

DDRB |= (1<<PB1)|(1<<PB2);  

^ zależnie od tego co chcesz otrzymać.

Brakuje mi tutaj trochę rzeczy. Sprawdź czy na pewno wszystkie odpowiednie porty łączące się z mostkiem masz skonfigurowane jako wyjścia i podajesz na niej odpowiednie sygnał, bo chyba nie 🙂

Pisz sobie komentarze przy każdej linijce konfiguracji, bo później ciężko to analizować.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Tak jest, nie miałem skonfigurowanych wszystkich potrzebnych portów jako wyjść.

Teraz kod wygląda tak:

#define F_CPU 1000000L
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#define LED_PIN (1<<PD6)
#define LED_ON PORTD |= LED_PIN
#define LED_OFF PORTD &= ~LED_PIN

int main(void)
{
DDRB |= (1<<PB1)|(1<<PB2);
DDRD |= LED_PIN;
DDRD |= (1<<PD0)|(1<<PD1)|(1<<PD2)|(1<<PD3);

TCCR1A |= (1<<WGM10);
TCCR1B |= (1<<WGM12);

TCCR1A |= (1<<COM1A1);
TCCR1A |= (1<<COM1B1);

TCCR1B |= (1<<CS10);
TCCR1B |= (1<<CS12);

OCR1A = 0;
OCR1B = 0;

PORTD |= (1<<PD1)|(1<<PD3);
PORTD &= ~(1<<PD0);
PORTD &= ~(1<<PD2);

   for(;;)
   {
	LED_ON;
	OCR1A = 50;
	OCR1B = 50;
   }
}

Teraz problemem jest resetowanie się procka... dioda mruga, a silniki chodzą skokowo.

Link do komentarza
Share on other sites

Skoro działa to na Bascomie to tutaj też powinno.

Dla testu wyzeruj jeden PWM i sprawdź czy wtedy też się wiesza, postaraj się, aby nic nie blokowało silnika. Przed pętlą nieskończoną wrzuć jakiegoś delay-a 2sec, będziesz mógł się zorientować czy to na pewno reset 🙂

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

TCCR1B |= (1<<CS10);
TCCR1B |= (1<<CS12);

(preskaler - 1024)

zmieniłem na

TCCR1B |= (1<<CS11);

(preskaler - 8)

Silniki skakały przez zbyt duży preskaler...

Działa 😉

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.