19-07-2018, 22:06
Tak jak es2 napisał, dla trybu phase correct, można bardzo dokładnie ustawić częstotliwość PWM.
Ja zrobiłem to tak, że dałem ICR1=400 dla preskalera = 1.
Dla kryształu 16MHz wychodzi równiutko 20kHz.
Wykorzystałem dwa kanały timera 1, przy czym TCCR1B ustawiłem w przeciwnej fazie.
W setupie ustawiamy zegar:
Napisałem sobie taką funkcję ustawiająca wypełnienie.
Wypełnienie jest mapowane 100 --> 400, żeby podawać je do funkcji w procentach, ale jak ktoś chce, to można to wywalić i wysyłać od 0 do 400. Będzie precyzyjniej.
Kod spełnia oczekiwania autora wątku, przynajmniej tak wnioskuję z załączonej grafiki.
Ja zrobiłem to tak, że dałem ICR1=400 dla preskalera = 1.
Dla kryształu 16MHz wychodzi równiutko 20kHz.
Wykorzystałem dwa kanały timera 1, przy czym TCCR1B ustawiłem w przeciwnej fazie.
W setupie ustawiamy zegar:
Kod:
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
TCCR1A = (1<<COM1A1) | (1<<COM1B1) | (1<<COM1B0) | (1<<WGM11);
TCCR1B = (1<<WGM13) | (1<<CS10);
ICR1 = 400;
pinMode( 9, OUTPUT);
pinMode(10, OUTPUT);
Kod:
void PWM(int wypelnienie) //od 0% do 100%
{
wypelnienie = map (wypelnienie, 0, 100, 0, 400);
OCR1A = wypelnienie; // pin9
OCR1B = 400-wypelnienie; // pin 10
}
Wypełnienie jest mapowane 100 --> 400, żeby podawać je do funkcji w procentach, ale jak ktoś chce, to można to wywalić i wysyłać od 0 do 400. Będzie precyzyjniej.
Kod spełnia oczekiwania autora wątku, przynajmniej tak wnioskuję z załączonej grafiki.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.