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.
Tags:
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 );
}
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por