Точность измерения
- Войдите на сайт для отправки комментариев
Чт, 19/05/2016 - 23:14
Делаю диностенд, но сталкнулся с точностью измерения оборотов (rpm), показывает примерно +-50об/мин, но нужна точность хотя бы раза в два-три выше, в идеале точность до 10 об/мин
Время всх расчётов и измерений желательно тоже не слишком большую, так как резальтат надо смотреть в режиме "онлайн" без особо больших задержек.
Пробывали подставлять в формулу микросекунды, но ардуина такое уже не тянет похоже, значения скачут вплоть до отрицательных значений.
Есть ли вариант решения это проблемы, или ардуина на большее не способна?
// LCD5110_NumberFonts // Copyright (C)2015 Rinky-Dink Electronics, Henning Karlsen. All right reserved // web: http://www.RinkyDinkElectronics.com/ // // This program is a demo of the included number-fonts, // and how to use them. // // This program requires a Nokia 5110 LCD module. // // It is assumed that the LCD module is connected to // the following pins using a levelshifter to get the // correct voltage to the module. // SCK - Pin 8 // MOSI - Pin 9 // DC - Pin 10 // RST - Pin 11 // CS - Pin 12 // #include <LCD5110_Basic.h> int pot=A0; float value=0; int percent; float rev=0; int rpm; int oldtime=0; int time; float watt; float mom; float ts=1500; void isr() //interrupt service routine { rev++; } LCD5110 myGLCD(8,9,10,11,12); extern uint8_t SmallFont[]; extern uint8_t MediumNumbers[]; void setup() { myGLCD.InitLCD(63); attachInterrupt(0,isr,RISING); //attaching the interrupt Serial.begin(9600); } void loop() { myGLCD.clrScr(); myGLCD.setFont(MediumNumbers); myGLCD.printNumF(watt, 2, LEFT, 0); myGLCD.printNumI(rpm, 0, 16); myGLCD.printNumF(mom, 2, 0, 32); attachInterrupt(0,isr,RISING); delay(1000); detachInterrupt(0); //detaches the interrupt time=millis()-oldtime; //finds the time rpm=(rev/time)*60000; //calculates rpm mom=ts/367+0.225+rpm*0.00011; watt=0.00105*rpm*mom; oldtime=millis(); //saves the current time rev=0; value=analogRead(pot); attachInterrupt(0,isr,RISING); Serial.println(rpm); }
Дык вы пока считаете, используя числа с плавающей точкой - у вас прерывание не работает. Как минимум - строку 72 переместить после 67, строку 75 переместить после перемещённой строки 72.
Как максимум - отказываться от float и делать на целочисленной арифметике.
Сделал, но совершенно ничего не дало.
От чисел с запятой отказатся скорее всего невозможно, учитывая что данные надо с точностью до сотой.
Может считать не время между импульсами, а их число? допустим за пол секунды, а датчик сделать с большим числом импульсов на оборот, допустим 12.
От чисел с запятой отказатся скорее всего невозможно, учитывая что данные надо с точностью до сотой.
умножь на 100 и работай с целыми.