Hola soy estudiante de electricidad, y estoy realizando un proyecto sobre un seguidor solar con 2 servo para mover los ejes, y paneles solares que los usare como entradas al pic para comprar los voltajes y hasi mover los servos a la posición con mayor incidencia solar. la programacion la realice en c y en el programa picC y la pos simulacion en Proteus, a continuacion le mostrare el programa COMPLETO, si alguien me puede dar una opion o ayuda ya que en la simulacion no realiza la comparacion y los servos no se mueven.
(entradas analógicas (1 o 0) al pic A0,A1,A2,A3 , servos ( D0,D1 ) lcd en Puerto b.
\\
#include <16F877a.h>
#device adc = 8 //utilizaremos los 8 pines analogicos del pic
#use delay (clock = 20M) //utilizaremos un crystal de q 4mhz
#fuses XT, NOWDT, NOLVP, NOBROWNOUT, HS, PUT //fusibles crystal, desabilito el perro guardian,
#use rs232 (baud = 9600, xmit = pin_c6, rcv = pin_c7, PARITY = N, BITS =
#use standard_io (D) //este comando nos permite hacer que un pin de un puerto pueda ser salida y entrada a la vez //habilito el lcd para que se encienda en el puerto b
#define use_portb_lcd TRUE
#include <lcd.c> //incluyo la libreria del lcd
#byte port_a = 0x05
#byte port_b = 0x06
#byte port_c = 0x07
#byte port_d = 0x08
#byte port_e = 0x09
UNSIGNED int8 v1, v2, v3, v4; //declaro los voltajes leidos como una variable de punto flotante de 16 bits
UNSIGNED int8 z; //declaro el resultado de la resolucion como una variable de punto flotante de 16 bits
FLOAT p1, p2, p3, p4; //seran p1.2.3.4, las bariables leidas en el adc
float FotoVoltaje (UNSIGNED int8 v){
UNSIGNED int8 z; //declaro z como una variable numerica de 16 bits
z = 1 * v; //formula con la que se obtiene el valor para la resolucion
RETURN z / 50; //obtengo la resolucion
}
VOID main (){
set_tris_c(0);
set_tris_d(0);
port_c=0;
port_d=0;
output_high(pin_c6) ;
delay_ms (1000) ;
output_low(pin_c6) ;
delay_ms (1000) ;
lcd_init () ;
lcd_putc ("SEGUIDOR SOLAR") ;
delay_ms (1000) ;
disable_interrupts (GLOBAL) ;
setup_adc_ports (ALL_ANALOG) ;
setup_adc (ADC_CLOCK_DIV_32) ;
setup_adc (ADC_CLOCK_INTERNAL) ;
delay_ms(500);
while (true){ // Se agrega un ciclo while, y el escaneo a las placasa mostrando el voltaje...!
lcd_putc("\f");
lcd_gotoxy(1,1);
set_adc_channel (0) ;
delay_ms(100);
v1 = read_adc();
v1=v1/51;
p1 = FotoVoltaje (v1);
PRINTF(LCD_PUTC,"Panel=1 Volt=%u\n\r",v1);
delay_ms(1000);
lcd_putc("\f");
set_adc_channel (1) ;
delay_ms(100);
v2 = read_adc();
v2=v2/51;
p2 = FotoVoltaje (v2);
PRINTF(LCD_PUTC,"Panel=2 Volt=%u\n\r",v2);
delay_ms(1000);
lcd_putc("\f");
set_adc_channel (2) ;
delay_ms(100);
v3 = read_adc();
v3=v3/51;
p3 = FotoVoltaje (v3);
PRINTF(LCD_PUTC,"Panel=3 Volt=%u\n\r",v3);
delay_ms(1000);
lcd_putc("\f");
set_adc_channel (3) ;
delay_ms(100);
v4 = read_adc();
v4=v4/51;
p4 = FotoVoltaje (v4);
PRINTF(LCD_PUTC,"Panel=4 Volt=%u\n\r",v4);
delay_ms(1000);
lcd_putc("\f");
if(((v1=v2)&&(v3=v4))){
PRINTF(LCD_PUTC,"PERPENDICULAR");
delay_ms(1000);
lcd_putc("\f");
port_c=0;
output_high(pin_d0);
delay_us(600);
output_low(pin_d0);
delay_us(600);
delay_ms(1);
output_high(pin_d1);
delay_us(600);
output_low(pin_d1);
delay_us(600);
delay_ms(1);
}
if((v1>v2)&&(v1>v3)&&(v1>v4)){ //CASO 1,PRIMER MOVIMIENTO HACIA EL NORTE
//POSIBLE- "IF (v1>max){}...
PRINTF(LCD_PUTC,"DIRECCION NORTE");
delay_ms(1000);
lcd_putc("\f");
port_c=0;
output_high(pin_d0);
delay_us(600);
output_low(pin_d0);
delay_us(600); // 0 grados posicion Horizontal
delay_ms(1);
output_high(pin_d1); // 0 grados posicion vertical
delay_us(600);
output_low(pin_d1); // 0 grados posicion vertical
delay_us(600);
delay_ms(1);
port_d=0;
output_high(pin_d0);
delay_us(1200);
output_low(pin_d0);
delay_us(1200); //direccion NORTE
delay_ms(1);
}
if((v2>v1)&&(v2>v3)&&(v2>v4)){ //CASO 2, SEGUNDO MOVIMIENTO DIRECCION ESTE
PRINTF(LCD_PUTC,"DIRECCION ESTE");
delay_ms(1000);
lcd_putc("\f");
port_c=0;
output_high(pin_d0);
delay_us(600);
output_low(pin_d0);
delay_us(600);
delay_ms(1);
output_high(pin_d1);
delay_us(600);
output_low(pin_d1);
delay_us(600);
delay_ms(1);
output_high(pin_d1);
delay_us(2400);
output_low(pin_d1);
delay_us(2400); //direccion ESTE
delay_ms(1);
output_high(pin_d0);
delay_us(1200);
output_low(pin_d0);
delay_us(1200); //DERECHA
delay_ms(1);//DERECHA
}
if((v3>v1)&&(v3>v2)&&(v3>v4)){ //CASO 3, SEGUNDO MOVIMIENTO DIRECCION SUR
PRINTF(LCD_PUTC,"DIRECCION SUR");
delay_ms(1000);
lcd_putc("\f");
port_c=0;
output_high(pin_d0);
delay_us(600);
output_low(pin_d0);
delay_us(600);
delay_ms(1);
output_high(pin_d1);
delay_us(600);
output_low(pin_d1);
delay_us(600);
delay_ms(1);
output_high(pin_d0);
delay_us(-1200);
output_low(pin_d0);
delay_us(-1200);
delay_ms(1); }
if((v4>v1)&&(v4>v2)&&(v4>v3)){ //CASO 4, SEGUNDO MOVIMIENTO DIRECCION OESTE
PRINTF(LCD_PUTC,"DIRECCION OESTE");
delay_ms(1000);
lcd_putc("\f");
port_c=0;
output_high(pin_d0);
delay_us(600);
output_low(pin_d0);
delay_us(600); // 0 grados posicion Horizontal
delay_ms(1);
output_high(pin_d1);
delay_us(600);
output_low(pin_d1);
delay_us(600);
delay_ms(1);
output_high(pin_d1);
delay_us(1200);
output_low(pin_d1);
delay_us(1200); //direccion OESTE
delay_ms(1);
output_high(pin_d0);
delay_us(1200);
output_low(pin_d0);
delay_us(1200);//DERECHA
delay_ms(1);
}
}
}
\\