Доброго времени суток ВСЕМЪ!!!
Измеряю частоту синусоидального сигнала в диапазоне от 20 до 50Гц. Периодически (примерно один раз на пять замеров) происходит ошибка измерения (отклонение от реальной в 2…3 раза в обе стороны!!!). Инициализация, обработка препывания и расчет частоты приведены ниже:
void timera_init() //Clock source=ACLK //Divider=1 //TIMACLK=32,768KHz //Frequency=258,0Hz ( 3,88mS) { TACTL=0x00; //stop timer //channel0 TACCTL0=0x00; TACCR0=0x7F; //channel1 TACCTL1=0x64;//TAOM1.1,TAOM1.0,TAOUT1 TACCR1=0x7F; //channel2 TACCTL2=0x4110;//TASCS2,TACAP2,TACCIE2 TACCR2=0x00; TAR=0x0000;//clear timer counter TACTL=0x116;//TASSEL.0,TAMC.0,1,TAIE }
#pragma vector=TIMERA1_VECTOR __interrupt void ta_interrupt_routine(void) { if(TACTL&TAIFG)//Если таймер досчитал до 125 { fTimeCounter++;//инкрементируем счетчик таймера. TACTL&=~TAIFG;//Чистим флаг! }
if(TACCTL2&CCIFG)//Если фронт сигнала, { fTime=fTimeCounter;//снимаем количество переполнений ТА. fTime0=fTime1;//состояние ТА на начало процесса. fTime1=TACCR2;//состояние ТА на конец процесса. fTimeCounter=0;//обнуляем счетчик переполнений ТА. TACCTL2&=~CCIFG;//Чистим флаг! } }
void main(void) { … //Определяем частоту: float fFreq=1/(2*(fTime*3.90625e-3+(fTime1-fTime0)*30.517578125e-6)); … }
Также имеются прерывания ADC (неповторяющаяся последовательность каналов, в прерывании перезапуск).
Реализую на MSP430F1122. Тактируюсь от часового кварца (32768Гц). Частота тактирования стабильная.
Пожалуйста посоветуйте, что можно предпринят.
Зарание спасибо всем ответившим!!!
--------------------
Сделал трэш - разбудил Ктулху!!!
|