Цитата(BVU @ Sep 2 2005, 08:16)
Да просто вычисляйте среднее значение своих измерений и ничего мудрить не надо. Я делал такие вещи, на практике достаточно брать пять значений что бы получить хорошее сглаживание:
Aср = (a'1 + a'2 + a'3 + a'4 + a'5) / 5.
А интервал показаний установите кратный двум или пяти, тогда и цифорки скакать не будут!
Я так понял, что Вы пересчитываете импульсы с датчика Холла перемноженного на некий коэффициент?
Большое спасибо всем ответившим. В настоящий момент работает вот такой алгоритм соотв. подпрограммы:
/********************************************************************************
****/
// программа расчета N, N[об/мин] = (30*Fbq)/(T1Div*TTAX)
void GetTaxData() {
unsigned char i,SkoSummaPlusCnt=0,SkoSummaMinusCnt=0;
unsigned int DatMin,DatMax,DatNew;
unsigned long DatSumma=0,SkoSummaPlus=0,SkoSummaMinus=0;
float Sko;
// если новые данные готовы,разрешить их обработку
if (TaxNew != 0) {
// безопасное быстрое копирование обновленного буфера для обработки
CLRBIT(GICR,INT1); // запретить изменение буфера
for (i=0;i<TaxBufSize;i++) DatBuf[i] = TaxBuf[i];
DatNew = TaxNew;
SETBIT(GICR,INT1); // разрешить изменение буфера
// если новый отсчет как старые,принять старые значения
// иначе,полный перерасчет с учетом нового отсчета
DatMin = DatSr - DatMinus;
DatMax = DatSr + DatPlus;
if ((DatNew < DatMin) || (DatNew > DatMax)) {
// перерасчет среднего значения в DatBuf[]
for (i=0;i<TaxBufSize;i++) DatSumma += DatBuf[i];
DatSr = DatSumma / TaxBufSize;
// среднеквадратическое отклонение вверх и вниз
for (i=0;i<TaxBufSize;i++) {
if (DatBuf[i] > DatSr) {
SkoSummaPlus += (DatBuf[i] - DatSr)*(DatBuf[i] - DatSr);
SkoSummaPlusCnt++;
}
if (DatBuf[i] < DatSr) {
SkoSummaMinus += (DatSr - DatBuf[i])*(DatSr - DatBuf[i]);
SkoSummaMinusCnt++;
}
}
Sko = sqrt((SkoSummaPlus+SkoSummaMinus)/(SkoSummaPlusCnt+SkoSummaMinusCnt-1));
DatPlus = Sko + 1;
DatMinus = Sko + 1;
// получение и отображение N
if ((DatSr > 0) && (DatSr < 0xFFFF)) {
TaxResult = Const/DatSr;// unsigned long __flash Const = 30*Fbq/T1Div;
TaxSko = TaxResult - Const/(DatSr+DatPlus);
}
}
TaxNew = 0;// запретить повторную обработку отсчета
}
}
/********************************************************************************
****/
И все же с приходом нового "нетипового" отсчета содержимое TaxResult изменяется весьма значительно, что вообще говоря ожидаемо - этот алгоритм несовершенен и задачу сглаживания не решает.
Если просто считать среднее от пяти значений, то:
"...А интервал показаний установите кратный двум или пяти, тогда и цифорки скакать не будут!..."
Никак в толк не возьму, почему? Отсчеты поступают непериодично (движок ведь работает неравномерно). Вы предлагаете обновлять показания на индикаторе только в моменты, когда полностью обновится пятиэлементный буфер?
Статистика: прогретый движок Москвича-2140 по вышеприведенному алгоритму показал среднюю неравномерность вращения коленвала около 100 об/мин.