Bom dia, Estou utilizando estas duas variáveis:

unsigned int contador;
unsigned int frequencia;

Esta primeira é uma variável de incremento e decremento, através de dois botões, a e a segunda é onde quero guarda o valor desta equação "frequência = (1 / contador) * 1000000" para mostrar no monitor serial ou em um lcd, mais somente é mostrado zeros, mais realizando os cálculos manualmente os valores realmente são os que quero mais no monitor serial somente é mostrado zero, esse valor da variável frequência é somente para mostrar no monitor, que seria o valor da frequência, se alguém puder dar um help agradeço, deste modo o primeiro valor que era para ser mostrado seria 1000000 e o ultimo 15, mais não mostra nem um outro número além do zero.

Exibições: 178

Responder esta

Respostas a este tópico

Bom dia TT,

você está usando um número muito grande em uma variável muito pequena:

unsigned int  16 bits, guarda no máximo 0xFFFF  ou seja Decimal = 65.535.

Use ou long,

unsigned long = 32 bits, guarda até 0xFFFFFFFF ou decimal 4.294.967.295

Rui

Não preciso de valores decimais somente inteiros, mas coloquei unsigned long na variavel frequencia e continuou do mesmo modo.

O numero intermediário "1/contador" precisa ser armazenado em um "float" por isso é preciso float.

Uma saída seria mudar a conta para 1000000/contador que deve dar no mesmo.

Ou use float... Depois que vc passa dos 16 bits temo que o calculo em float ou longint demoram o mesmo tempo (não sei, mas como vc só precisaria fazer o calculo 1x por segundo se torna aceitável mesmo q demore).

Ainda, nunca usei mas, existe uma biblioteca feita só pra criar um frequencímetro, procure por: "Frequency counter using arduino".

Problema Resolvido com a ajuda de nossos amigos Celso Eiju ito e Rui Viana:

#include <LiquidCrystal.h>
#include <TimerOne.h>
float frequencia;
unsigned int contadorduty;
unsigned int contadorfrequencia;
float dutycicle;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

float map_double(double x, double in_min, double in_max, double out_min, double out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}  
void setup()
{
  Serial.begin(9600);
  lcd.begin(16,2);
  lcd.print("DUTY CICLE");
  pinMode(A0, INPUT);
  pinMode(A1, INPUT);
  pinMode(A2, INPUT);
  pinMode(A3, INPUT);
  pinMode(9, OUTPUT);
}
void loop()
{
lcd.print ("  ");
lcd.setCursor(0,1);
Timer1.initialize(contadorfrequencia);
Timer1.pwm(9, contadorduty);
delay(100);
if(digitalRead(A2) == HIGH)
{
 contadorfrequencia = contadorfrequencia +10.0;
 frequencia = (1.0 / contadorfrequencia) * 1000000.0;
 Serial.println(frequencia);
}
if(digitalRead(A3)== HIGH)
{
 contadorfrequencia = contadorfrequencia -10.0;
 frequencia = (1.0 / contadorfrequencia) * 1000000.0;
 Serial.println(frequencia);
}
if(digitalRead(A0) == HIGH)
{
contadorduty = contadorduty +1;
contadorduty &= 0x3FF;
dutycicle = map_double(contadorduty,0 ,1023,0, 100);
//Serial.println(dspduty);
}
if(digitalRead(A1) == HIGH)
{  
contadorduty = contadorduty -1;
contadorduty &= 0x3FF;
dutycicle = map_double(contadorduty,0 ,1023,0, 100);
//Serial.println(dspduty);
}    
lcd.print(dutycicle);
lcd.write( B00100101 );
}

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço