Точность измерения

motorist828
Offline
Зарегистрирован: 12.07.2014

Делаю диностенд, но сталкнулся с точностью измерения оборотов (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);
  
}

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Дык вы пока считаете, используя числа с плавающей точкой - у вас прерывание не работает. Как минимум - строку 72 переместить после 67, строку 75 переместить после перемещённой строки 72.

Как максимум - отказываться от float и делать на целочисленной арифметике.

motorist828
Offline
Зарегистрирован: 12.07.2014

Сделал, но совершенно ничего не дало.

От чисел с запятой отказатся скорее всего невозможно, учитывая что данные надо с точностью до сотой.

Может считать не время между импульсами, а их число? допустим за пол секунды, а датчик сделать с большим числом импульсов на оборот, допустим 12.

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

motorist828 пишет:

От чисел с запятой отказатся скорее всего невозможно, учитывая что данные надо с точностью до сотой.

умножь на 100 и работай с целыми.