Vous êtes sur la page 1sur 8

char readbuff[64],writebuff[64], Tecla, buffer, adc1_Ltx, adc1_Htx, adc2_Ltx, ad

c2_Htx, adc3_Ltx, adc3_Htx, adc4_Ltx, adc4_Htx;


float voltaje4=0, voltaje3=0, voltaje2=0, voltaje1=0, resistencia1=0, resistenci
a2=0, resistencia3=0, resistencia4=0;
unsigned adc_valor, adc_valor2, adc_valor3 , adc_valor4, adc1_U, adc2_U, adc3_U,
adc4_U;
unsigned short alta=0,baja=0;
long cuadratura_baja=0, cuadratura_alta=0, pv=0, valor_actual=0, valor_anterior=
0;
float recorrido;
int i, ver, flag=0, m=0, contador=0, bandera=0, f2=0, f3=0;
int vueltas, cont2=0;
void InitMCU()
{
//CONFIGURACION DEL PLL PARA ALCANZAR UNA VELOCIDAD DE 30MHZ
PLLFBD = 58; //M = 60
CLKDIVbits.PLLPOST= 0; // N1 = 2
CLKDIVbits.PLLPRE= 0; // N2 = 2
OSCTUN = 0;
OSCCON=0x0301;
while(OSCCONbits.COSC!= 0x3);
//CONFIGURACION DEL PLL AUXILIAR PARA EL USB
//SE REQUIEREN 48MHZ
ACLKCON3 = 0x24C0;
ACLKDIV3 = 0x7;
ACLKCON3bits.ENAPLL = 1;
while(ACLKCON3bits.APLLCK != 1);
}
void USB1Interrupt() iv IVT_ADDR_USB1INTERRUPT
{
USB_Interrupt_Proc();
}
void ADC1ConvertDone() org 0X002E
{
adc_valor=ADC1BUF0;
adc_valor2=ADC1BUF4;
adc_valor3=ADC1BUF8;
adc_valor4=ADC1BUFC;
IFS0bits.AD1IF=0;
}
void fin_de_linea()
{ strcpy(writebuff," ");
writebuff[0]=13;
//CR
writebuff[1]=10;
//LF
writebuff[2]='\0';
while(!HID_Write(&writebuff,64));
delay_ms(500);
}
void enviar_texto(char enviar[64])
{
strcpy(writebuff,enviar);
while(!HID_Write(&writebuff,64));
fin_de_linea();
}
void enviar_texto2(char enviar[64])
{

strcpy(writebuff,enviar);
while(!HID_Write(&writebuff,64));
}
//void enviar(int envio)
//{
//alta=envio>>8;
//baja=envio&0xFF;
//UART1_Write(alta);
//Delay_ms(50);
//UART1_Write(baja);
//Delay_ms(50);
//}
//int recibir_16bit()
//{ int temp;
//while(UART1_Data_Ready()==0);
//alta=UART1_Read();
//while(UART1_Data_Ready()==0);
//baja=UART1_Read();
//temp=alta;
//temp=(temp<<8)+baja;
//return(temp);
//}
void main()
{
ANSELC=0x0000; //Configuracionde E/S digitales
ANSELD=0x0000; //Configuracionde E/S digitales
ANSELE=0x0000; //RE6 como entrada analogica
CORCONbits.IPL3=0; //la interrupcin de la CPU es de nivel 7 o menor
SRbits.IPL=0; //interrupcin de la CPU es de nivel 0
INTCON1bits.NSTDIS=0; //interrupcin anidadas activada
INTCON2bits.GIE=1; //interrupciones habilitadas
InitMCU();
HID_Enable(&readbuff,&writebuff); //inicializamos en mdulo usbhid
delay_ms(2000);
//SPI1
TRISDbits.TRISD8=1;//PIN42 CONF COMO ENTRADA PARA SDI MAESTRO
TRISDbits.TRISD0=0;//PIN46 CONF COMO SALIDA PARA SDO MAESTRO
TRISFbits.TRISF3=0;//PIN33 CONF COMO SALIDA PARA SCK MAESTRO
SPI1_Init_Advanced(_SPI_MASTER,_SPI_16_BIT,_SPI_PRESCALE_SEC_8,_SPI_PRESCAL
E_PRI_64,_SPI_SS_DISABLE,_SPI_DATA_SAMPLE_MIDDLE,_SPI_CLK_IDLE_LOW,_SPI_ACTIVE_2
_IDLE);
RPOR0bits.RP64R=5; //Serial Salida de Datos SDO1 EN EL PIN 46
RPOR8bits.RP99R=6; // CAMBIO DE ENTRADA O DE SALIDA DE RELOJ SCK1 EN EL PIN
46
RPINR20bits.SDI1R=72; //SDI1 SERIAL ENTRADA DE DATOS PIN 42
//TRISCbits.TRISC14=1;
//TRISDbits.TRISD1=0;
//RPOR0bits.RP65R=1; //U1TX EN EL PIN 49
//RPINR18bits.U1RXR=0X003E; //U1RX EN EL PIN 48
//UART1_Init(9600);
// CONFIGURANDO EL ADC
IEC0bits.AD1IE=1;
//HABILITACION DE INTERRUPCION
IFS0bits.AD1IF=0;
//BANDERA DE INTERRUPCION ADC
ANSELB=0x1F00; // RB8-RB11 analogicos

AD1CON1=0x004C; // Habilita modo 10-bit, conversion activa tmr3


AD1CON2=0x060C; // Vdd y vss referencias,
AD1CON3=0x0F0F; // Muestrea para un tiempo de conversion de 15*TAD
AD1CON4=0x0000; // Desactivo la Dma
AD1CSSH=0x0000; // no selecciono entradas superiores de escaneo
AD1CSSL = 0x1B00; // entrada para el escaneo CH8-CH11 va a escanear estos
TMR3=0;
T3con=0;
// inicializo timer prescaler 1:1 off
pr3=1000;
// periodo de conversion
TRISCbits.TRISC15=1;
TRISCbits.TRISC12=1;
/////generar valores///////
CVRCONbits.VREFSEL=0;//voltajes generados por la red de resistencias
CVRCONbits.CVREN=1; //voltaje de referencia del comparador esta encendido
CVRCONbits.CVROE=1; //Bit de Habilitacin de salida de voltaje de referencia
del comparador = Nivel de voltaje (CVREFIN) se emite en la salida del pin CVREF
CVRCONbits.CVRSS=0; //fuente de voltaje de referencia para el comparador e
s la misma fuente para alimentar el micro
CVRCONbits.CVRR=0; //seleccionamos con este bit una de las dos gamas del v
oltaje en la tabla de la escalera de resistencias
CVRCONbits.CVR=0; //selector de la red de voltajes (ver tabla)
/////Para comparar/////
CM1CONbits.CON=1;
CM1CONbits.COE=0;
CM1CONbits.CPOL=0;
CM1CONbits.EVPOL=0;
CM1CONbits.CREF=1;
CVrefin
CM1CONbits.CCH=0;
n C1IN2CM1FLTRbits.CFLTREN=0;
ANSELBbits.ANSB4=1;

//comparador habilitado
//salida interna del comparador
//salida no invertida sera c1out=1 cuando V+ >V//interrupcion deshabilitada
//Entrada Vin+ se conecta internamente al Voltaje de
//Pin de entrada VIN- del comparador se conecta a pi
//filtro digital
//PIN 12 DEL DSPIC ENTRADA ANALOGICA

CM2CONbits.CON=1;
//comparador habilitado
CM2CONbits.COE=0;
//salida interna del comparador
CM2CONbits.CPOL=0;
//salida no invertida sera c1out=1 cuando V+ >VCM2CONbits.EVPOL=0; //interrupcion deshabilitada
CM2CONbits.CREF=1;
//Entrada Vin+ se conecta internamente al Voltaje de
CVrefin
CM2CONbits.CCH=0;
//Pin de entrada VIN- del comparador se conecta a pin
C2IN2CM2FLTRbits.CFLTREN=0;
ANSELBbits.ANSB2=1; //PIN 14 DEL DSPIC ENTRADA ANALOGICA
CM3CONbits.CON=1;
CM3CONbits.COE=0;
CM3CONbits.CPOL=0;
CM3CONbits.EVPOL=0;
CM3CONbits.CREF=1;

//comparador habilitado
//salida interna del comparador
//salida no invertida sera c1out=1 cuando V+ >V//interrupcion deshabilitada
//Entrada Vin+ se conecta internamente al Voltaje de CV

refin
CM3CONbits.CCH=0;

//Pin de entrada VIN- del comparador se conecta a pin C

3IN2CM3FLTRbits.CFLTREN=0;
ANSELDbits.ANSD6=1;// PIN 54 DEL DSPIC ENTRADA ANALOGICA
cont2=0;

while(1)
{
MENU:
enviar_texto("###################");
enviar_texto("MENU");
enviar_texto("1.MOTORES");
enviar_texto("2.EJE MANUAL");
enviar_texto("3.POTENCIOMETROS Y ALARMA");
enviar_texto("4.VALOR ANALOGICO POR PC");
enviar_texto("####################");
//enviar();
T3conbits.TON=0;
delay_ms(20);
AD1CON1bits.ADON =0;
flag=0;
vueltas=0;
valor_anterior=0;
valor_actual=0;
recorrido=0;
while(!HID_Read()); //Espero una cadena por el hiperterminal
delay_ms(1000);
Tecla=readbuff[0];
switch(Tecla)
{
case 49:
T3CONbits.TON=1;
// TMR3 ON
Delay_ms(10);
AD1CON1bits.ADON=1; // ON ADC
enviar_texto("CONTROL DE MOTORES POR POTENCIOMETROS ")
;
enviar_texto("PRESIONE S PARA SALIR ");
while (!HID_Read())
{
Tecla=readbuff[0];
delay_ms(1000);
//ADC 1
adc1_U= adc_valor;
SPI1_Write(adc1_U);
delay_ms(100);
//ADC 2
adc2_U= adc_valor2;
SPI1_Write(adc2_U);
delay_ms(100);
//ADC 3
adc3_U= adc_valor3;
SPI1_Write(adc3_U);
delay_ms(100);
adc4_U= adc_valor4;
SPI1_Write(adc4_U);
delay_ms(100);

if(Tecla==83)
{
goto MENU;
Delay_ms(1000);
}
}
break;
case 50:
T3CONbits.TON=1;
// TMR3 ON
Delay_ms(10);
AD1CON1bits.ADON=1; // ON ADC
enviar_texto("DATOS DEL MOTOR ");
while (!HID_Read())
{
Tecla=readbuff[0];
adc1_U= adc_valor;
adc2_U= adc_valor2;
adc3_U= adc_valor3;
adc4_U= adc_valor4;
SPI1_Write(adc1_U);
delay_ms(100);
SPI1_Write(adc2_U);
delay_ms(100);
SPI1_Write(adc3_U);
delay_ms(100);
SPI1_Write(adc4_U);
delay_ms(100);
if(cont2=0)
{
cuadratura_alta=SPI1_Read(buffer);
valor_actual=cuadratura_alta;
delay_ms(100);
CONT2=1;
cuadratura_baja = SPI1_Read(buffer);
valor_actual= (valor_actual<<16) + cuadratura_baja;
contador=0;
}
if (cont2=1)
{
pv=SPI1_Read(buffer);
delay_ms(100);
cont2=0;
}
vueltas=pv;
valor_actual=cuadratura_alta;
valor_actual=(valor_actual<<16)+cuadratura_baja;

recorrido=valor_actual;
recorrido=recorrido*2.35619; //se divide el poscnt entre
4
//luego se multiplica por (2.pi.r)/4
enviar_texto2("DIST:");
sprintf(writebuff,"%10.3f",recorrido);
enviar_texto2(writebuff);
enviar_texto2(" VUELTAS:");
inttostr(vueltas,writebuff);
enviar_texto(writebuff);
enviar_texto2("SENTIDO:");
if(valor_anterior<valor_actual)
{
enviar_texto("DERECHA ");
}
if(valor_anterior>valor_actual)
{
enviar_texto("IZQUIERDA ");
}
valor_anterior=valor_actual;
Delay_ms(1000);
enviar_texto("PRESIONE S PARA SALIR ");
if(Tecla==83)
{
goto MENU;
Delay_ms(1000);
}
}
break;
case 51:
T3conbits.TON=1;
delay_ms(20);
AD1CON1bits.ADON =1;
while (!HID_Read())
{
Tecla=readbuff[0];
delay_ms(1000);
voltaje1 = adc_valor*0.003225806;
voltaje2 = adc_valor2*0.003225806;
voltaje3 = adc_valor3*0.003225806;
voltaje4 = adc_valor4*0.003225806;
resistencia1 = (adc_valor*19.5503421309872
9)/1000;
resistencia2 = (adc_valor2*19.550342130987
29)/1000;
resistencia3 = (adc_valor3*19.550342130987
29)/1000;
resistencia4= (adc_valor4*19.5503421309872
9)/1000;
if (CMSTATbits.C1OUT==0)enviar_texto("POTEN
1: NIVEL SUPERADO");

else enviar_texto("POTEN 1: NIVEL NO SUPERA


DO");
if (CMSTATbits.C2OUT==0)enviar_texto("POTEN
2: NIVEL SUPERADO");
else enviar_texto("POTEN 2: NIVEL NO SUPERA
DO");
if (CMSTATbits.C3OUT==0)enviar_texto("POTEN
3: NIVEL SUPERADO");
else enviar_texto("POTEN 3: NIVEL NO SUPERA
DO");
enviar_texto2("VOLT1 (V):");
sprintf(writebuff,"%-10.3f",voltaje1);
enviar_texto2(writebuff);
enviar_texto2("POT1 (KOHM):");
sprintf(writebuff,"%-10.3f",resistencia1);
enviar_texto(writebuff);
enviar_texto2("VOLT2 (V):");
sprintf(writebuff,"%-10.3f",voltaje2);
enviar_texto2(writebuff);
enviar_texto2("POT2 (KOHM):");
sprintf(writebuff,"%-10.3f",resistencia2);
enviar_texto(writebuff);
enviar_texto2("VOLT3 (V):");
sprintf(writebuff,"%-10.3f",voltaje3);
enviar_texto2(writebuff);
enviar_texto2("POT3 (KOHM):");
sprintf(writebuff,"%-10.3f",resistencia3);
enviar_texto(writebuff);
if(Tecla==83)
{
goto MENU;
Delay_ms(1000);
}
}
break;
case 52:
enviar_texto("SELECCIONE UNA DE LAS SIGUIENTES TECLAS:"
);
enviar_texto("A: 0.83V | B: 0.93V | C: 1.03V | D=1.13V
| E: 1.24V");
enviar_texto("F: 1.34V | G: 1.44V | H: 1.55V | I=1.65V
| J: 1.75V");
enviar_texto("K: 1.86V | L: 1.96V | M: 2.06V | N=2.17V
| O: 2.27V");
enviar_texto("P: 2.37V");
enviar_texto("PRESIONE S PARA SALIR ");
T3conbits.TON=0;// APAGA EL TIMER DEL CONVERTIDOR ADC
delay_ms(20);
AD1CON1bits.ADON =0;// APAGA EL ADC
while(1)
{
while(!HID_Read()); //Espero una cadena p

or el hiperterminal
delay_ms(1000);
Tecla=readbuff[0]; //CARGAMOS EL BUFFER
DE ESCRITURA EN TECLA
if(Tecla<65 || Tecla>80)
{
if(Tecla==83) // SI TECLA ES IGUAL A "S"
VOLVEMOS AL MENU
{
goto MENU;
Delay_ms(1000);
}
else
{
enviar_texto("TECLA INVALIDA");
}
}
else
{
CVRCONbits.CVR=Tecla-64;
}
}
break;
default:
enviar_texto("TECLA INVALIDA");
Delay_ms(1000);
break;
}
}
}

Vous aimerez peut-être aussi