Skocz do zawartości

Częstotliwość PWM


RybaSG

Pomocna odpowiedź

Cześć,
Napisałem kod do testów PWM i spotkałem problemy z ustalaniem częstotliwości :

1. Jak SPRZĘTOWO ustalić częstotliwość? Wiem, że można za pomocą preskalerów osiągnąć kilka wartości częstotliwości wynikających z podziału, ale zakładając, że takie częstotliwości mnie nie zadowalają chciałbym ustalić swoje wartości.

2. Programowy PWM : procka taktuję zegarem 1MHz, chciałem osiągnąć PWM 1kHz wykorzystując tryb CNC. Nie bardzo mam pomysł jak zaingerować w częstotliwość uzyskanego sygnału, umiem tylko wyznaczyć częstotliwość przerwań.

Używam ATmega 16A.

#include <avr/io.h>		// dołączenie głównego systemowego  pliku nagłówkowego
#include <avr/interrupt.h>
#include <util/delay.h>

volatile uint8_t pwm;

int main()
{

DDRB |= (1<<PB3); // kierunek wyjściowy dla OC0

// konfiguracja fast PWM
TCCR0 |= (1<<WGM01) | (1<<WGM00); // tryb fast PWM
TCCR0 |= (1<<COM01); 			  // clear OC0 on compare match
TCCR0 |= (1<<CS00); 			  // preskaler na 1 (3.9kHz)
OCR0 = 127;					  // wypełnienie około 50%

// programowy PWM
DDRA |= (1<<PA0); // wyjście PWM

TCCR2 |= (1<<WGM21); // tryb CTC
TCCR2 |= (1<<CS21)|(1<<CS21); // preskaler 256
OCR2 = 3; // ustalenie częstotliwości (~1kHz)
TIMSK |= (1<<OCIE2); // zezwolenie na Compare Match Interrupt




sei();
while(1)
{
pwm = 127;
}

//uint8_t i;

/*while(1)
{
	// pętla rozjaśniająca
	for( i = 0 ; i<255; i++)
	{
		OCR0 = i;
		_delay_ms(3);
	}
	// pętla gasząca
	for( i = 255; i > 0; i--)
	{
		OCR0 = i;
		_delay_ms(3);
	}

}*/

}

ISR ( TIMER2_COMP_vect )
{
static uint8_t counter;

if(counter>=pwm)
{
	//PORTA |= (1<<PA0);
	PORTA &= ~(1<<PA0);
}
else
{
	//PORTA &= ~(1<<PA0);
	PORTA |= (1<<PA0);
}

counter++;


}
Link do komentarza
Share on other sites

Idea jest prosta: preskaler mówi jak często są tyknięcia, licznik te tyknięcia liczy, a ty ustalasz przy ilu ma się timer restartować. Oczywiście do tego musisz go ustawić w odpowiednim trybie — tak zwanym CTC, czyli "clear timer compare". No i wówczas ustawiasz jak najmniejszy podzielnik przy którym jeszcze twój okres się mieści w liczniku i ustawiasz próg na taką wartość, żeby mieć dokładnie taki okres jak potrzebujesz. Im mniejszy podzielnik, tym masz większą precyzję, ale mniejszy zakres.

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.