Sensores A y B
estos sensores deben de estar desfasados 90º, por tal motivo deberán de estar ubicados correctamente sobre el disco ranurado.
Conversor Frecuencia a Voltaje
con el LM331
con el LM2907
consideraciones: para evitar errores de carga y descarga de los capacitores internos de los conversores, se recomienda adaptar antes la señal que entrara al C F-V para que esta señal tenga cruze por cero. y esto se obtiene con un comparador.
Sentido de Giro
diagrama de tiempos
Layout
simulación aqui
Una vez ensamblado y probado cada bloque, solo resta armar el sistema completo.... y grabar el pic y realizar las pruebas necesarias.
Realize un programa en C para realizar estas pruebas, aca el codigo para CCS con el PIC 16f876a
Titulo: Programa prueba para comprobar en correctofuncionamiento
del circuito armado: pic, C F-V, sentidos de giros, etc
Autor: Americo Alvarez S.
Fecha: 10 diciembre del 2013
Ver.: 2
*/
#include 16f876a.h
#device adc=10
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES RESERVED //Used to set the reserved FUSE bits
#use delay(crystal=20000000) //Cristal Utilizado 20MHz
#byte trisc=0x87
//----------------------variables globales
int16 ana;
float ANA0,ANA1;
//--------------------------------------------------------------------subrutinas
void ADC_RA0 (void) //lectura ADC del canal AN0
{
set_adc_channel(0); //Habilitación canal analogico an0
delay_us(20); //T(ACQ)=caracteristico del micro
ana = read_adc(); //leemos señal analogica 1 = referencia
ANA0= ana*0.73; //adaptamos señal considerando 5v = 750
}
void ADC_RA1 (void) //lectura ADC del canal AN1
{
set_adc_channel(1); //Habilitación canal analogico an1
delay_us(20); //T(ACQ)=caracteristico del micro
ana = read_adc(); //leemos señal analogica 2 = C F-V conversor F-V
ANA1= (1.45*ana)-317.1;//adaptamos señal considerando ofsset y maximo ---->>reducir operaciones
if(ANA1<=0)
{ANA1=0;}
}
//------------------------------------------------------------programa principal
void main(void)
{
setup_adc_ports(AN0_AN1_AN3);
setup_adc(ADC_CLOCK_INTERNAL);
setup_timer_2(T2_DIV_BY_16,249,1); //frecuencia de pwm 1250 Hz aprox 1Kz
setup_ccp1(ccp_pwm);
//definimos variables locales
int16 un;
float e,ctrl;
float Tm=5; //tiempo de muestreo en ms
trisc=0; //puerto c todo en salida
output_low(PIN_C5); //condicion inicial sentido de giro
output_low(PIN_C4); //condicion inicial sentido de giro
set_pwm1_duty(0); //condicion inicial giro
while (true)
{
//-------------------------------------------------------------calculo del error
ADC_RA0(); //leemos canal analogico AN0 ANA0
ADC_RA1(); //leemos canal analogico AN1 ANA1
if(input(PIN_A4)==0)
{e=ANA0-ANA1;} //giro positivo
else
{e=ANA0+ANA1;} //giro negativo
if(e<=0)
{ //giro positivo
output_high(PIN_C4);
output_low(PIN_C5);
}
else
{ //giro negativo
output_high(PIN_C5);
output_low(PIN_C4);
}
//---------------------------------------------------------controlador utilizado
ctrl=1*e; //control proporcional
//---------------------------------------------------------calculo de salida PWM
if(ctrl>=1000) //1000 = 100% = 24v
{ctrl=1000;}
else
{
if(ctrl<=0) //0 = 0% = 0v
{ctrl=0;}
}
un = ctrl;
set_pwm1_duty(un); //750 = 75% = 18v, Referencia maxima
delay_ms(Tm);
}
}