Moderadores: andre_luis, 51, guest2003, Renie
brasilma escreveu:Aqueles links que enviei na primeira página indicam caminhos!
Deivid Roza escreveu:Bom vamos lá. Eu procurei meu professor de fidica i ele me passou as seguintes informaçoes:
Se temos 6000rpm temos 100rps e temos 0.1 rpms.
Logo a frequencia é 100hz pois temos 100rps.
Sabendo a frequencia podemos saber o periudo de tempo que existe entre uma rotaçao e outra com o seguinte calculo.
T= 1/f
Logo temos:
0,01= 1/100
Oque pensei é em contar o tempo entre um pulso e o outro e fazer o calculo inverso para chegar em RPM logo nao preciso esperar todooooo aquele tempo de ciclos para saber o rpm. Isso seria praticamente instantaneo.
Alguem que manja de fisica pode me ajudar a fazer essa inversao?
Enviado de meu LG-E415f usando Tapatalk
#include <LiquidCrystal.h> // inclui a biblioteca para funcionar o display
LiquidCrystal lcd(10, 9, 8, 7, 6, 5); // define a pinagem do display
int rps=0; // armazena valor RPS
int rpm=0; // armazena valor RPM
int rpms=0; // armazena valor RPMS
int t=0; // armazena o valor de t
unsigned char flagHIGH=0;
unsigned long temp1;
unsigned long temp2;
unsigned long tempab;
// exemplo de valores
// rpm 6000
// rps 100
// f 100
// rpms 0,1
// T 0,01
// exemplo de valores
const int bobina = 12; // variável a guardar o pino do tip da bobina.
const int pulso = 11; // variável a guardar o pino de entrada do pulso da bobina
int bobinaled;
void setup() {
Serial.begin(9600);
pinMode(bobina, OUTPUT);
pinMode(pulso, INPUT);
pinMode(2, INPUT);
digitalWrite(2, HIGH);
digitalWrite(bobina, HIGH);
digitalWrite(pulso, LOW);
lcd.begin(16, 2);
attachInterrupt(0, sinal_crono, FALLING);
}
void loop() {
attachInterrupt(0, sinal_crono, FALLING);
lcd.setCursor(0, 0);
lcd.print("RPM:");
lcd.print(rpm);
lcd.print(" ");
// inicio dos calculos
rpm = rps*60;
rps = 1/t
// fim dos calculos
// inicio da funcao
if(digitalRead(pulso)==HIGH && flagHIGH == 0)
{
temp1=millis();
flagHIGH=1;
}
if(digitalRead(pulso)==LOW && flagHIGH==1)
{
temp2=millis();
tempHL=(temp2-temp1);
flagHIGH=0;
t=tempHL
}
// fim da funcao
//==============================================
// funcao corte de rpm
if (rpm > 2000)
{
digitalWrite(bobina, LOW);
(bobinaled = 0);
}
if (rpm < 1900)
{
digitalWrite(bobina, HIGH);
(bobinaled = 1);
}
//==============================================
}
void sinal_crono() //funcao chamada a cada interrupçao
{
// imprime na serial (funcao antiga usada como datalogger do resultado)
Serial.println("======== Novo Valor ========");
Serial.print("T:");
Serial.println((t));
Serial.print("RPMS:");
Serial.println((rpms));
Serial.print("RPS:");
Serial.println((rps));
Serial.print("RPM:");
Serial.println((rpm));
Serial.print("Bobina:");
Serial.println((bobinaled));
Serial.println("=========== FIM ============");
// imprime na serial
}
loop()
principal, e dentro da interrupção voce estaria apenas lidando com a captura do conteúdo do timer, e nada mais.if(digitalRead(pulso)== HIGH && estado == 0) // se pulso HIGH e estado anterior 0 (aguarda primeiro pulso HIGH para iniciar a leitura)
{
estado=1; // define estado como 1 (flagHIGH=1 libera as funções abaixo para fazer a leitura do intervalo)
}
if(digitalRead(pulso)== LOW && estado == 1) // se pulso LOW e estado anterior 1
{
temp1=millis(); // define temp1=millis()
tempHL=(temp1-temp2); // define tempHL como temp2 - temp1
}
if(digitalRead(pulso)== HIGH && estado == 1) // se pulso HIGH e estado anterior 1
{
temp2=millis(); // define temp2=millis()
t=tempHL; // T IGUAL A TEMPHL pega valor de TEMPHL e armazena em T para ser usado pelo loop para calcular o RPM final.
}
#include <LiquidCrystal.h> // inclui a biblioteca para funcionar o display
LiquidCrystal lcd(10, 9, 8, 7, 6, 5); // define a pinagem do display
int rps=0; // armazena valor RPS
int rpm=0; // armazena valor RPM
int t=0; // armazena o valor de t
int estado=0;
unsigned long temp1; // tempo 1
unsigned long temp2; // tempo 2
unsigned long tempHL; // tempo entre HIGH e LOW
const int bobina = 12; // variável a guardar o pino do tip da bobina.
const int pulso = 2; // variável a guardar o pino de entrada do pulso da bobina
void setup() {
pinMode(bobina, OUTPUT);
pinMode(pulso, INPUT);
digitalWrite(bobina, HIGH);
digitalWrite(pulso, LOW);
lcd.begin(20, 4);
}
void loop() {
lcd.setCursor(0, 0);
lcd.print("RPM:");
lcd.print(rpm);
lcd.print(" "); // area vazia para n precisar limpar display -> evita delay
lcd.setCursor(0, 1);
lcd.print("RPS:");
lcd.print(rps);
lcd.print(" "); // area vazia para n precisar limpar display -> evita delay
lcd.setCursor(10, 3);
lcd.print("HL:");
lcd.print(tempHL);
lcd.print(" "); // area vazia para n precisar limpar display -> evita delay
lcd.setCursor(10, 2);
lcd.print("TH:");
lcd.print(temp2);
lcd.print(" "); // area vazia para n precisar limpar display -> evita delay
lcd.setCursor(10, 1);
lcd.print("TL:");
lcd.print(temp1);
lcd.print(" "); // area vazia para n precisar limpar display -> evita delay
lcd.setCursor(11, 0);
lcd.print("T:");
lcd.print(t);
lcd.print(" "); // area vazia para n precisar limpar display -> evita delay
// inicio dos calculos
rpm = rps*60; // RPM IGUAL A RPS*60
rps = 1/t; // RPS IGUAL A 1/T
// fim dos calculos
// =======================================================================================
if(digitalRead(pulso)== HIGH && estado == 0) // se pulso HIGH e estado anterior 0 (aguarda primeiro pulso HIGH para iniciar a leitura)
{
estado=1; // define estado como 1 (flagHIGH=1 libera as funções abaixo para fazer a leitura do intervalo)
}
// =======================================================================================
if(digitalRead(pulso)== LOW && estado == 1) // se pulso LOW e estado anterior 1
{
temp1=millis(); // define temp1=millis()
tempHL=(temp1-temp2); // define tempHL como temp2 - temp1
}
//========================================================================================
if(digitalRead(pulso)== HIGH && estado == 1) // se pulso HIGH e estado anterior 1
{
temp2=millis(); // define temp2=millis()
t=tempHL; // T IGUAL A TEMPHL
}
// =======================================================================================
}
/* EXEPLO DE VALORES EM 6000 RPM
// rpm: 6000
// rps: 100
// rpms: 0,1
// f: 100
// T: 0,01
*/
N/1000 ≅
( N x ( 8 x 1/213 ) )
( ( N x 8 ) >> 13 )
N x ( 1 / 1024.5 )
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante