Skocz do zawartości

TCCR3 - nie działa tryb PWM


frozzins

Pomocna odpowiedź

Witam,

Taki dziwny problem napotkaliśmy.

Nasz procek to ATMega 128A. Używamy trybu Fast PWM do sterowania dwóch silników.

Nasz problem jest taki, że pozornie identyczne pary rejestrów: TCCR1A oraz TCCR3A, a także TCCR1B oraz TCCR3B nie działają identycznie.

Otóz rejestry TCCR1A i TCCR1B pieknie sterują silnikiema te same ustawienia na TCCR3 niestety nie...

Używamy sterownika silników L293D.

Oto jak wygląda nasz kod:

/*
* motor controller inputs connected to ATmega 128A outputs: PB5(OC1A) I PB6(0C1B)
*/ 

#define F_CPU 16000000 
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
DDRE = 0b11111111;
DDRD = 0b11111111;
DDRB = 0b11111111;	 


//COM1A1 COM1A0 COM1B1 COM1B0 COM1C1 COM1C0 WGM11 WGM10         TCCR1A	
//ICNC1 ICES1 – WGM13 WGM12 CS12 CS11 CS10                      TCCR1B


TCCR1A = 0b10101001; //Clear OCnA/OCnB/OCnC on compare match, set OCnA/OCnB/OCnC at BOTTOM, (non-inverting mode), fAST pwm 8-bit
TCCR1B = 0b00000010; //8 PRESCALER

TCCR3A = 0b00100000; //Clear OCnA/OCnB/OCnC on compare match, set OCnA/OCnB/OCnC at BOTTOM, (non-inverting mode), fAST pwm 8-bit
TCCR3B = 0b00000010; //8 PRESCALER	

   while(1)
   {

       OCR1A = 240; 
       OCR1B = 0; 
       OCR3A = 240;    // to nie dziala
       OCR3C = 0;		// to nie dziala
	_delay_ms(4000);


       OCR1A = 100;
       OCR1B = 0;
       _delay_ms(4000);		


	OCR1A = 0;
	OCR1B = 240;
	_delay_ms(4000);
	PORTD |= (1<<PORTD0);   // drive PD1 high
   }


}
Link do komentarza
Share on other sites

Nie rozumiem tego, czy Wy tylko piszecie programy, czy czasem je również czytacie? Jak możesz wysyłać na Forum kod którego nawet nie widziałeś (bo chyba nie robisz sobie żartów, prawda?). Piszesz, że "..pozornie identyczne pary rejestrów: bla bla bla nie działają identycznie". Działają tak, gdy wpisze się do nich te same wartości.

Kiedyś była taka zabawa dla dzieci pt. "Znajdź różnice na obrazkach". To co, spróbujesz swych sił czy mam Ci pokazać palcem:

    TCCR1A = 0b10101001; 
   TCCR1B = 0b00000010; 

   TCCR3A = 0b00100000; 
   TCCR3B = 0b00000010; 

  • Lubię! 2
Link do komentarza
Share on other sites

Przepraszam. Wkleiłem kod, który juz próbowałem zmieniać.

Oryginalnie rejestry TCCR1A i TCCR1B są identyczne dla obu timerów.

Na razie zastępczo używam innych timerów ale ten (Timer03) tez będzie potrzebny

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.