Деление чисел

Monster
Offline
Зарегистрирован: 18.06.2012

В ходе работ выяснилось, что операции деления ОЧЕНЬ гадят в адекватность работы устройства.

Проблема с следующем...

Ногой одного Наны (9) Таймером1 генерируем частоту = 1000 Гц.

Сигнал с оной пущен на пару ног второго Наны (7 и 8).  На этих ногах висит обработчик прерывания, связанного с ними, который кидает флаги, что событие для данной ноги (digitalRead) произошло, а далее в цикле (loop) происходит обработка флагов - идет расчет интервалов входящих сигналов (в данном случае они одинаковы, т.к. у них один источник).

Далее, рассчитывается средняя частота для обрабатываемых сигналов (ActiveAxleInterval):

ActiveAxleInterval  = (2*ActiveLeft_Pin_In_Interval*ActiveRight_Pin_In_Interval)/(ActiveLeft_Pin_In_Interval+ActiveRight_Pin_In_Interval);

где ActiveLeft_Pin_In_Interval и ActiveRight_Pin_In_Interval - соответственно интервалы входящей пары сигналов.

Как результат - генерируем Таймером1 на 10 ногу второго Наны сигнал с частотой = средней от частоты входящей пары.

НО!  Если ее генерировать используя период = ActiveLeft_Pin_In_Interval или ActiveRight_Pin_In_Interval, то разброс частот - на уровне погрешности.  Если же в качестве периода использовать ActiveAxleInterval, то разброс вырастает в разы.

Количество исполняемых операций при этом одинаково - разница лишь в выборе параметра, задающего период.

Помогите, пожалуйста, найти ошибку. :(

maksim
Offline
Зарегистрирован: 12.02.2012

А типы переменных  ActiveLeft_Pin_In_Interval и ActiveRight_Pin_In_Interval какие?

Monster
Offline
Зарегистрирован: 18.06.2012

Все = unsigned long, но переполнения по значению нету.

maksim
Offline
Зарегистрирован: 12.02.2012

Попробуте так

ActiveAxleInterval  = (2*ActiveLeft_Pin_In_Interval*ActiveRight_Pin_In_Interval)/((ActiveLeft_Pin_In_Interval+ActiveRight_Pin_In_Interval)*1.0);

 

Monster
Offline
Зарегистрирован: 18.06.2012

maksim пишет:

Попробуте так

ActiveAxleInterval  = (2*ActiveLeft_Pin_In_Interval*ActiveRight_Pin_In_Interval)/((ActiveLeft_Pin_In_Interval+ActiveRight_Pin_In_Interval)*1.0);

 

Это ничего не поменяло. :(

maksim
Offline
Зарегистрирован: 12.02.2012

Или так
 

ActiveAxleInterval  = (2.0*ActiveLeft_Pin_In_Interval*ActiveRight_Pin_In_Interval)/(ActiveLeft_Pin_In_Interval+ActiveRight_Pin_In_Interval);

 

Monster
Offline
Зарегистрирован: 18.06.2012

Пардон, ошибку нашел - был закомментирован расчет средней.  А уже было желание разбить нану апстену. :)