Construyendo un Inductometro USB (PBP,PROTEUS,VB)

Saludos Amigos.

Estoy construyendo un inductometro por USB, el esquema que estoy utilizando es el siguiente:
sch.JPG
Tecnicamente es el que ronda por la red, a excepción de unos pequeñisimos cambios, la idea consiste en medir la frecuencia con el timer0 usando el timer3 y el comparador.

el circuito funciona pero no me da el valor correcto y no se que estoy haciendo mal.

la formula que utilizo es:
Lx= (((1/(2*pi*f))^2)*(1/L))-C
donde C=0.000000001=1nF y L es 0.0001=100uH

el desborde del timer3 es cada 40mS para la toma del muestreo de la frecuencia y la multipico por 25 para que sea 1seg

el codigo en PBP es este:
Código:
@ __config _CONFIG1L, _PLLDIV_5_1L & _CPUDIV_OSC1_PLL2_1L & _USBDIV_2_1L
@ __config _CONFIG1H, _FOSC_HSPLL_HS_1H & _FCMEN_OFF_1H & _IESO_OFF_1H
@ __config _CONFIG2L, _PWRT_OFF_2L & _BOR_OFF_2L & _BORV_3_2L & _VREGEN_ON_2L    
@ __config _CONFIG2H, _WDT_OFF_2H & _WDTPS_1_2H
@ __config _CONFIG3H, _MCLRE_ON_3H & _LPT1OSC_OFF_3H & _PBADEN_OFF_3H & _CCP2MX_OFF_3H  
@ __config _CONFIG4L, _STVREN_OFF_4L & _LVP_OFF_4L & _ICPRT_OFF_4L &_XINST_OFF_4L & _DEBUG_OFF_4L
@ __config _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L 
@ __config _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H      
@ __config _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L       
@ __config _CONFIG6H, _WRTB_OFF_6H & _WRTC_OFF_6H & _WRTD_OFF_6H     
@ __config _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L      
@ __config _CONFIG7H, _EBTRB_OFF_7H  

DEFINE OSC 20          
data $3C,$B0

USBBuffer        Var Byte[2] 
USBBufferCount   Var Byte 
Freq             var word 
TS               Var Word
Led1             Var PortA.1
Led2             Var PortA.2
Cal              Var PortA.5

ADCON1=%00001111
CMCON=%00000001    
T0CON=%00101000    
T3CON=%10110000    
INTCON2.7=1	      

TrisA=%00001001    
TrisB=%11111111
TrisC=%11111111

read 0,TS.highbyte
read 1,ts.lowbyte

gosub cali_freq

usbinit
Main: 
 gosub DoUSBIn
 if usbbuffer[0]=1 then 
  low Led1:toggle Led2
  gosub Calc_Freq
  usbbuffer[0]=Freq.lowbyte
  usbbuffer[1]=Freq.highbyte
  gosub DoUSBOut
 endif
 USBService                                    
goto Main 

Cali_Freq:
 High Led1:Low Led2
 low cal
 High cal
 Gosub calc_freq
' while (freq<2000 or freq>2100)
'  if freq<2000 then ts=ts+1
'  if freq>2100 then Ts=Ts-1
'  Gosub calc_freq
' wend
 write 0,ts.highbyte:pause 10
 write 1,ts.lowbyte :pause 10
 low cal
 pause 1000
 Low Led1:low Led2
Return

Calc_Freq:
 IntCON.7=0
 IntCON.6=0
 T0CON.7=1
 T3CON.0=1
 PIR2.1=0
 TMR0H=0
 TMR0L=0
 TMR3H=TS.HighByte
 TMR3L=TS.LowByte
 while PIR2.1=0:wend
 Freq.lowbyte=TMR0L
 Freq.highbyte=TMR0H
 T0CON.7=0
 T3CON.0=0
 INTCON.7=1
 INTCON.6=1
return

DoUSBIn:
   USBBufferCount = 1        
   USBService                                
   USBIn 1, USBBuffer, USBBufferCount, DoUSBIn   
   return

DoUSBOut:
   USBBufferCount = 2              
   USBService                                    
   USBOut 1, USBBuffer, USBBufferCount, DoUSBOut 
   return
* la rutina de calibracion no esta habilitada.

bueno el problema es que si mide "Algo" pero no es el valor correcto, creo que estoy mal en las formulas o algo asi por lo que me gustaria que me dieran una ayudada en lo que podria estar mal.

cualquier pregunta que tengan respecto al proyecto no duden en hacerla .

anexo archivos del proyecto.
 

Adjuntos

  • LMeter.zip
    250.6 KB · Visitas: 19
Última edición:
muy buen proyecto!

estoy intentando desde hace tiempo hacer lo mismo,lograste algun avance?

voy a armar el proyecto para ver si puedo hacer que funcione :D.
 
el principio de ese proyecto no funciona con esa formula, tienes que tomar una muestra sin conectar nada y al resultado le das el nombre de F1 (frecuencia 1) despues tomas otra muestra con un capacitor de 1000pF y le das el nombre de F2, (frecuencia 2), despues conectas el capacitor o inductor a medir y le das el nombre de F3(frecuencia 3).

despues de tener las tres mediciones utilizas la formula Lx o Cx de la siguiente figura:

Eqs.JPG


el principal problema que veo en el codigo es que tomas las muestras con el while:wend y eso creo que haria que se pierda la conexion del USB, necesitas utilizar el USBSERVICE pero creo que eso afectaria la toma del muestreo :unsure: ahi esta el reto XD
 
Última edición:
Prueba este codigo que es para muestrear en un periodo de 10mS la frecuencia:
*tome 10mS porque es lo maximo que se puede estar sin usar el usbservice, el resultado lo multiplicas por 100

Código:
#config 
 config PLLDIV=5,CPUDIV=OSC1_PLL2,USBDIV = 2
 config FOSC=HSPLL_HS,FCMEN=OFF,IESO=OFF 
 config PWRT=ON,BOR=OFF,BORV=3,VREGEN=ON
 config WDT=OFF,WDTPS=1
 config MCLRE=ON,LPT1OSC=OFF,PBADEN=OFF,CCP2MX=OFF 
 config STVREN=OFF,LVP=OFF,XINST=OFF,DEBUG=OFF 
 config CP0=OFF,CP1=OFF,CP2=OFF,CP3=OFF
 config CPB=OFF,CPD=OFF
 config WRT0=OFF,WRT1=OFF,WRT2=OFF,WRT3=OFF
 config WRTB=OFF,WRTC=OFF,WRTD=OFF
 config EBTR0=OFF,EBTR1=OFF,EBTR2=OFF,EBTR3=OFF
 config EBTRB=OFF
#endconfig    

DEFINE OSC 48
include	"DESCLCMeter.bas"

USBBuffer        Var Byte[8] 
USBBufferCount   Var Byte 
Fq               var word

CMCON=%1
T0CON =%00101000
T3CON =%10110001
TRISA=%001001
TRISB=%0

usbinit
  
main:
 T0CON.7=1
 pir2.1=0
 TMR0H=$00
 TMR0L=$00
 TMR3H=$C5
 TMR3L=$68
 while pir2.1=0
 wend 
 T0CON.7=0
 usbservice
 fq.byte0=TMR0L
 fq.byte1=TMR0H

 usbbuffer[0]=fq.byte0
 usbbuffer[1]=fq.byte1
 gosub DoUSBOut
Goto MAin 

DoUSBIn:
 USBBufferCount = 8              
 USBService                                  
 USBIn 1, USBBuffer, USBBufferCount, DoUSBIn   
return
    
DoUSBOut:
 USBBufferCount = 8            
 USBService                                    
 USBOut 1, USBBuffer, USBBufferCount, DoUSBOut 
return
 
Última edición:
Atrás
Arriba