Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Неточность в вычислениях на ATmega324P

Отправлено gluck35533 (82.204.231.26) 09 июня 2010, г. 00:40


Пишу на CodeVisionAVR програму которая подсчитывает число статистически распределенных импульсов за единицу времени.
Импульсы подаются на счетный вход таймера1 (16-bit) и регистрируются по фронту.Максимальная частота следования импульсов 5 кГц.Минимальная пауза между импульсами 200 мкс.Подсчитываю интенсивность за 1 сек и пересчитываю ее в попугаи.
Временной интервал в 1 сек. формируется таймером2 работающим от внешнего часового кварца (асинхронно).
В подпрограмме прерывания, которое происходит 1 раз в сек. по переполнению таймера2 производится считывание счетного регистра таймера1 и производятся вычисления.
Вот кусок кода (подпрограмма обработчика прерывания):

// Timer 2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{

// Reinitialize Timer 2 value
TCNT2=0x80;
// Place your code here
if (POWER==0) goto exit;
xren1=0;
xren=0;
Sn=TCNT1L;
Sn=Sn+(TCNT1H<<8);
S=S+Sn;
t++;
I=(float)(S/((t-tnach)-(dead_t*S)));
Igamma=(float)(I/gamma_sens);
Ibeta=(float)(((I*60)/7)/beta_sens);
Ialfa=(float)(((I*60)/7)/alfa_sens);
deltaS=sqrt(S);
deltaI=(float)(deltaS/((t-tnach)-(dead_t*S)));
if (I==0) {
percent=100;
goto x;
}
percent=(float)(100*(deltaI/I));
x:
In=(float)Sn;
del=labs(In-I);
deltaSn=sqrt(Sn+1);
if (I>90) {S=0; TCNT1H=0; TCNT1L=0; tnach=t; goto y;};
if ((del<(long)deltaI)||(del<(long)3*deltaSn)) {TCNT1H=0; TCNT1L=0;}
else {S=0; TCNT1H=0; TCNT1L=0; tnach=t;}
y:
doza=doza+Igamma;
doza1=(float)(doza/3600);
doza2=(float)(doza/360000);
if ((hour==23)&&(minute==59)&&(second==55)) jornal ();
light_timer++;
link_timer++;
pclink();
if ((light_mode==3)&&(light_timer>=31)) LIGHT=0;
exit:
RTC ();
conv_coplete=1;
}

Проблема в том, что если мега работает на частоте 8 Мгц, то все вычисляется правльно, если предделителем тактовой частоты снижаешь ее до 2 МГц ради экономии электричества то появляется ошибка.Результат вычесления становится меньше процентов на 10.
В чем может быть проблема?


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
что получится, если сложить 4 и 4 ?

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru