Gente:
Ha llegado a mis manos un sensor lineal inductivo al cual quiero sacarle provecho, por ejemplo para medir posicionamiento de cualquier cosa ( piston, nivel de agua en un tanque ) lo que se pueda ocurrir. El tema es que estoy teniendo problemas con la lectura de el mismo ya que no esta muy estable, es decir por ejemplo dejo el iman en una posicion sin tocarlo y cuando leo la entrada analogica este no me muestra siempre el mismo valor sino que me va tirando el valor correcto y erroneamente me muestra otros valores ( si por ejemplo esta en la posicion 234, ademas de ese valor puede ser que me tire 234,233,235,236 ). Igualmente les paso el programa que hice para leerlo el cual no creo que tenga problemas. Yo estoy pensando que el problema esta en que no lo estoy adaptando electricamente bien cuando lo conecto directo al PIC. Si alguno puede ayudarme les agradezco dado que estoy hace un tiempo con el y no loe encuentro la vuelta. Hice dos programas, uno que saca el promedio del maximo y otro que no pero no hay caso. Les adjunto la hoja de datos del sensor que baje de internet.
Cabe aclarar como veran que lo que leo lo envio por MAX232 a una hiperterminal
PROGRAMA CON PROMEDIO DE LA MEDIDA
#include <18f4525.h>
#fuses HS, NOWDT, NOPROTECT, NOLVP, NOBROWNOUT, PUT
#use delay(clock=20000000)
#use rs232(baud=57600, xmit=PIN_C4, rcv=PIN_C5)
#include <STDLIB.H>
#define Delay 5
float LeoSensor(int Sensor)
{
int i = 0;
float max, maxii;
float min,minii;
float ant = 0;
float suma = 0;
max = maxii = 0;
min = minii = 255;
set_adc_channel(Sensor);
for (i=1;i<11;i++)
{
delay_us(10);
ant = read_adc();
if (ant>max)
max = ant;
if (ant<min)
min = ant;
suma+=ant;
}
ant = (suma - max - min)/8;
return ant;
}
void main(void)
{
int MinA, MaxA, sentidoA;
int MinB, MaxB, sentidoB;
long PosicionA,PosicionB;
long i;
boolean on = true;
sentidoA = 1;
MaxA = MaxB = 0;
MinA = MinB = 255;
set_tris_c(0x00);
set_tris_b(0x00);
set_tris_a(0xFF);
i = 0;
setup_adc_ports(AN0_TO_AN1);
setup_adc(ADC_CLOCK_DIV_16);
while(on)
{
PosicionA = LeoSensor(0);
printf("%Lu \n", PosicionA);
}
}
AHORA LES PASO EL PROGRAMA SIN EL PROMEDIO
#include <18f4525.h>
#fuses HS, NOWDT, NOPROTECT, NOLVP, NOBROWNOUT, PUT
#use delay(clock=20000000)
#use rs232(baud=57600, xmit=PIN_C4, rcv=PIN_C5)
#include <STDLIB.H>
#define Delay 5
float LeoSensor(int Sensor)
{
float ant = 0;
set_adc_channel(Sensor);
delay_us(10);
ant = read_adc();
return ant;
}
void main(void)
{
int MinA, MaxA, sentidoA;
int MinB, MaxB, sentidoB;
long PosicionA,PosicionB;
long i;
boolean on = true;
sentidoA = sentidoB = 1;
MaxA = MaxB = 0;
MinA = MinB = 255;
set_tris_c(0x00);
set_tris_b(0x00);
set_tris_a(0xFF);
setup_adc_ports(AN0_TO_AN1);
setup_adc(ADC_CLOCK_DIV_16);
while(on)
{
PosicionA = LeoSensor(0);
printf("%Lu \n", PosicionA);
}
}
ARACTERITICAS DEL SENSOR
Auf dem Schuffel 9, D-58513 Lüdenscheid, Germany
Postfach 8130 D-58489 Lüdenscheid, Germany
Tel: + 49.2351.95870
Fax: + 49.2351.56491
www.mtssensor.deJAPAN
Linearity error -0.3 mm ≤ EL ≤ 0.3 mm
Repeatability error -25µm ≤ ER ≤ 25µm
Hysteresis error -25µm ≤ EH ≤ 25µm
Temperature Drift -10µm/°K ≤ ETPWM≤ 10µm/°K
-20µm/°K ≤ ETvoltage≤ 20µm/°K
Current consumption 20mA ≤ Is ≤ 40mA
Operating temperature Operating temperature range:
-30°C ≤ AR ≤ 115°C
Power supply voltage 4.75V ≤ Vs ≤ 5.50V
Output load The PWM push-pull output is designed to
sink and source 1mA. Therefore, the
minimum impedance of the input side to
ground and /or + 5V should be the value of:
5000Ω ≤ RL
The capacity to ground is defined to:
CL ≤ 100pF
The load resistor for the voltage output
should be connected to the sensors ground
with a value of:
6kΩ ≤ RL
The capacity to ground is defined to:
CL < 100pF
Magnet The sensor is designed for use with magnet
part number
Package CSPI IP67