hola, otra vez aqui exponiendo un tema, que para no fallar en la rutina no esta todavia del todo terminado, se trata de un propulsor de motor de ca, que tendra un voltaje de referencia, el cual pasando esta "temperatura" empezara a funcionar, y comforme vaya aumentando la temperatura aumentara la velocidad, con un lm35, he decidido utilizar un amplificador operacional para no tener que utilizar el vref, por que? bueno, se me hacia mas facil y menos procesamiento de datos, ya que el adc esta configurado en 8 bits, o sea que cada 20mV aumenta un bit, justo lo que necesitaba, a la salida del pic deberia ir un triac, o en su caso dos scr, el programa desplegara primero si b1 esta en cero, a que temperatura queremos que empiece a funcionar el motor, esto desplegado por un LCD, cuando ponemo a 1 el bit b1, entonces empieza a checar si el sensor lm35 tiene una temperatura igual a a la del set point (a0), el sensor estara conectado a A1, cuando las dos temperaturas sean iguales, o mayor la del sensor, aumentara su velocidad, tiene 5 velocidades, esto por que asi se planteo, espero que les sirva:
por cierto me gustaria que me dieran tips para quitar los retardos y poner en su lugar alguna funcion que haga lo mismo y no pare al micro, soy todo oidos, bueno, ojos
aqui va el codigo
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#use standard_io(b)
#use standard_io(c)
#include "LCD.C"
int duty;
int contRTCC=0;
int1 flag=0;
int1 flag_extern=0;
int duty2;
int flag2=0;
int next=0;
int valor=0;
int1 flag3=0;
int change;
#int_ext
void int_extern(){
flag_extern=1;
}
#int_rtcc
void interruption(){
set_timer0(61);
++contRTCC;
if(contRTCC==10){
contRTCC=0;
flag=1;
}
}
void toma_adc(void){
set_adc_channel(0);
delay_us(10);
duty= read_adc();
delay_us(10);
set_adc_channel(1);
delay_us(10);
duty2= read_adc();
delay_us(10);
}
void ajusta_tiempo(void);
void calculo(void);
void main()
{
setup_adc_ports(ALL_ANALOG);
setup_adc(ADC_CLOCK_DIV_8);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
setup_timer_1(T1_DIV_BY_8);
setup_timer_2(T2_DISABLED,0x50,1);
setup_comparator(NC_NC_NC_NC);
enable_interrupts(int_ext);
ext_int_edge( L_TO_H );
enable_interrupts(int_timer1);
enable_interrupts(int_rtcc);
enable_interrupts(global);
set_tris_a(0x0B);
set_tris_b(0xFF);
set_tris_c(0x00);
lcd_init();
// TODO: USER CODE!!
lcd_putc("init...");
delay_ms(1000);
do{
toma_adc();
if (input(pin_b1)){
flag2=1;
}else{
flag3=0;
if (flag==1){
printf(lcd_putc,"Temp=%d",duty) ;
flag=0;
}
}
if (flag2==1){
if(flag==1){
//cursor para escribir mensaje
printf(lcd_putc,"Temp=%d",duty2) ; //muestra por pantalla el mensaje
flag=0;
}
if (duty2>=duty){
flag3=1;
output_high(pin_c3);
}else{
output_low(pin_c3);
}
if (flag3==1){
if (flag_extern==1){
flag_extern=0;
++next;
}else{
if(next==1){
delay_us(100);
calculo();
output_high(pin_c0);
delay_us(100);
output_high(PIN_c1);
delay_ms(valor);
output_low(PIN_c1);
delay_ms(change);
delay_us(133);
}
if(next==2){
delay_us(100);
calculo();
output_high(PIN_c0);
delay_us(100);
output_high(PIN_c2);
delay_ms(valor);
output_low(PIN_c2);
delay_ms(change);
delay_us(133);
next=0;
}
}
}
}
}while(true);
}
void ajusta_tiempo(void){
if (duty2<duty){
valor=0;
}
if (duty2==duty){
valor=2;
}
if (duty2==duty+1){
valor=3;
}
if (duty2==duty+2){
valor=5;
}
if (duty2==duty+3){
valor=6;
}
if (duty2==duty+4){
valor=7;
}
}
void calculo(void){
change=8-valor;
}
la funcion de las salidas es conmutar dos scr para controlar el periodo de la fase de AC, esto para variar la velocidad, aqui anexo lo que se hizo en proteus, pero se pone algo lento, las salidas son en c0, c1,c2,c3, mas adelante pongo la etapade potencia , que esta facil, solo dos scr en paralelo en serie con el motor de ac, o un triac, depende que tengas, lo checare hasta el lunes en el laboratorio, para estar mas seguros, ahi tambien esta el cruce por cero