Za mała częst.fali nośnej (przebiegu trójkątnego) ATMEGA16

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
marcobor
-
Posty: 1
Rejestracja: 23 lut 2012, 22:26
Lokalizacja: POLSKA

Za mała częst.fali nośnej (przebiegu trójkątnego) ATMEGA16

Post autor: marcobor » 23 lut 2012, 22:32

Proszę o pomoc w zwiększeniu częstotliwość fali nośnej, którą jest przebieg trójkątny. Mam kod który porównuje dwa przebiegi sinusoidalny i trójkątny, a na wyjściu generuje przebieg prostokątny. Jest to nic innego jak sinusoidalna modulacja szerokości impulsów PWM do sterowania falownikiem trójfazowym. Wszystko jest napisane w C, a procesor jaki użyłem to ATMEGA16.
Jednak po sprawdzeniu na oscyloskopie częstotliwości przebiegu trójkątnego wyszło mi niecałe 2 kHz, a potrzebuję co najmniej 6kHz.
I teraz pytanie do szanownych kolegów, czy da się wyciągnąć coś więcej z tego procesora jeżeli chodzi o ten przebieg czy to jest max??

Poniżej zamieszczam kod. Kod:

Kod: Zaznacz cały

volatile unsigned int t1=0; 
volatile unsigned int t2=20; 
volatile unsigned int t3=8; 
volatile unsigned int T,W, faza,tr,Tp ; 

volatile static const PROGMEM unsigned trojkat []= 

{ 
128, 
144, 
160, 
176, 
192, 
208, 
224, 
240, 
255, 
240, 
224, 
208, 
192, 
176, 
160, 
144, 
128, 
112, 
96, 
80, 
64, 
48, 
32, 
16, 
0, 
16, 
32, 
48, 
64, 
80, 
96, 
112 
}; 

SIGNAL (TIMER2_OVF_vect) 
   { 
   A=amplituda(); 
   W=wypelnienie(); 
   T=okres(); 
    
   if (Tp!=T) 
   { 
   Tp=T; 
   t2=((340/T)%32); //sprawdzamy ile zostanie wykonanych kroków do l2 a następnie normujemy do okresu trójkąta 
   t3=((680/T)%32); //sprawdzamy ile zostanie wykonanych kroków do l3 a następnie normujemy do okresu trójkąta 
   t1=0; 
   l1=0; 
   l2=340; 
   l3=680; 
    
   } 
   else 
   { 
   t1++; 
   t2++; 
   t3++; 
    
   } 
    
    
   if(l1>1020) // okresowość przebiegów 
      { 
      l1=l1-1020; 
      } 
   if(l2>1020) 
      { 
      l2=l2-1020; 
      } 
   if(l3>1020) 
      { 
      l3=l3-1020; 
      } 
   if(t1>31) 
      { 
      t1=t1-32; 
      } 
   if(t2>31) 
      { 
      t2=t2-32; 
      } 
   if(t3>31) 
      { 
      t3=t3-32; 
      } 
    
   tr=pgm_read_word(&trojkat[t1]); 
   sinus=((A*pgm_read_word(&sin[l1]))>>8)+127-(A>>1); 
    
   if (tr>sinus) 
   { 
    PORTB |= _BV(PB0); 
   } 
   else 
   { 
   PORTB &= ~_BV(PB0); 
   } 
    
   tr=pgm_read_word(&trojkat[t2]); 
   sinus=((A*pgm_read_word(&sin[l2]))>>8)+127-(A>>1); 
    
   if (tr>sinus) 
   { 
    PORTB |= _BV(PB1); 
    
   } 
   else 
   { 
   PORTB &= ~_BV(PB1); 
   }    
   tr=pgm_read_word(&trojkat[t3]); 
   sinus=((A*pgm_read_word(&sin[l3]))>>8)+127-(A>>1); 
       
   if (tr>sinus) 
   { 
    PORTB |= _BV(PB2); 

   } 
   else 
   { 
   PORTB &= ~_BV(PB2); 
   } 
      l1=l1+T; 
   l2=l2+T; 
   l3=l3+T;    
    
   } 


Dodam, że zmniejszanie ilości próbkowanie trójkąta już próbowałem i za wiele nie pomogło tylko pojawił się większy błąd pomiarowy.
Dziękuję za każdą pomoc.

keruseykaryu

Post autor: keruseykaryu » 24 lut 2012, 6:22

Gdzie konfiguracja liczników?

ODPOWIEDZ