Skocz do zawartości

Częstotliwość PWM


Pomocna odpowiedź

Napisano

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++;


}

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.

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