Ciao a tutti
devo misurare la velocità di rotazione di un albero in giri/min per tarare un variatore di velocità
Sul forum ho trovato questo link
ho costruito il disco con 12 fessure montato sull'albero che permette il passaggio di IR e cablato l'elettronica su una millefori
ho copiato e modificato il software
/*
Author: Chris @ PyroElectro.com
Date: 8/26/2012
Description:
This project is meant to capture interrupt counts from an IR breakbeam circuit
and display them as an RPM number on a 16x2 LCD module.
Full Project Details:
http://www.pyroelectro.com/tutorials/tachometer_rpm_arduino/
*/
#include <LiquidCrystal.h>
LiquidCrystal lcd(3, 5, 9, 10, 11, 12);
volatile float time = 0;
volatile float time_last = 0;
volatile int rpm_array[5] = {0,0,0,0,0};
int rpm = 0;
void setup()
{
//Digital Pin 2 Set As An Interrupt
attachInterrupt(0, fan_interrupt, FALLING);
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("Current RPM:");
}
void loop()
{
while(1){
//Slow Down The LCD Display Updates
delay(400);
//Clear The Bottom Row
lcd.setCursor(0, 1);
lcd.print(" ");
//Update The Rpm Count
lcd.setCursor(0, 1);
lcd.print(rpm);
////lcd.setCursor(4, 1);
////lcd.print(time);
//Update The RPM
if(time > 0)
{
//5 Sample Moving Average To Smooth Out The Data
rpm_array[0] = rpm_array[1];
rpm_array[1] = rpm_array[2];
rpm_array[2] = rpm_array[3];
rpm_array[3] = rpm_array[4];
rpm_array[4] = 60*(1000000/(time*12));
//Last 5 Average RPM Counts Eqauls....
rpm = (rpm_array[0] + rpm_array[1] + rpm_array[2] + rpm_array[3] + rpm_array[4]) / 5;
}
}
}
void fan_interrupt()
{
time = (micros() - time_last);
time_last = micros();
}
Nelle prove pratiche ottengo un valore coerente con la velocità, ma quando fermo il motore per variare la velocità ottengo valori sballati tipo -12769 e anche se riparto alla stessa velocità non riottengo valori coerenti anche premendo reset
Se interrompo l'alimentazione riottengo al primo avvio risultato buono poi sballa.
Il disco che ho preparato ha 12 fessure in maniera che il pin 2 di arduino riceve 12 impulsi a giro e genera 12 interrupt
Però il prg che ho copiato lavora su microsecondi di tra un inpulso e l'altro, se ho capito bene
cosa potri fare?
Franco