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;
}
Dziękuję za każdą pomoc.