¿"Enable1-2" en lugar de "Input 1" e "Input 2" del driver L293D para usar PWM?

Hola miembros del foro, estoy realizando un proyecto en el cual debo subir y bajar un objeto, para esta seccion del circuito estoy usando:
-PIC18F4520
-Driver L293D
-Motor de 12v
-Fuente de 12v
-Regulador LM7805 (para PIC, enable´s y otros)
Bueno, para poder tener un ascenso y descenso menos violento, suave y seguro estoy implementando el uso de PWM para controlar la velocidad de estos en diferentes velocidades. Mi duda surge sobre si ¿en lugar de conectar los puertos del PIC de CCP1 y CCP2 a Input1 e Input2 puedo solamente conectar CCP1 a Enable1-2 para variar la velocidad y los puertos Input1 e Input2 solamente estarian recibiendo HIGH o LOW del PIC? Esto me permitiria usar el CCP2 para controlar la velociad de otro motor en paralelo.
Un saludo a todos y felices fiestas :*). ...
 
Hola participantes, estoy realizando una maqueta de un porton manejado por Bluetooth, he probado el modulo y todo de maravilla con el bluetooth, el abrir y cerrar el porton mediante el celular y todo funciona, pero se volvio evidente un problema, si el usuario se le olvida cerrar el porton, este no cerrara hasta que el usuario lo cierre manualmente por medio de su celular, entonces pense en usar un retardo configurable por el usuario ya sea de x minutos para que despues de ese tiempo, se cierre de manera automatica o de forma manual, lo que pase primero. Pense en usar \'delay\', pero lo descarte de manera inmediata ya que durante el retardo, el usuario no podra cerrar el porton de manera manual ya que el PIC no respondera a las instrucciones del bluetooth hasta que haya pasado x minutos, entonces he investigado y encontre algo sobre interrupciones, timer0 y que este tiene varias configuraciones, pero ha sido muy confuso el tema para mi. Espero que me puedan explicar como debo realizar este \'temporizador\' mientras espera instrucciones del bluetooth, su estructura y explicarme cual es la funcion de cada linea de codigo para aprender a configurarlo por mi mismo.
Estoy usando MikroC y PIC18F4520 (aunque el PIC en sí no supone algún problema).

Gracias por su atencion y felices fiestas proximas :*) ...
 
No se complique con retardos en un espabilar se entran los malandros, al igual pasa con sensores de alejamiento o de obstáculos, donde fallen por algún obstáculo diferente a un automotor ni le cuento.

Es mas sencillo de resolver, yo construí uno para un conjunto residencial no use un PIC use un Atmega, un HC06, un modulo relay, una App que diseñe con MIT App inventor y buala.

El caso es que para que no olvidaran el cierre de la puerta como buen Colombiano:LOL:, el dispositivo envía una señal de alerta al SmartPhone intermitente, tipo recordatorio de que esta abierta la puerta, hasta que no se pulse el cierre no se desactivará sodicha alerta. En mi caso no le puse alerta pulsante de bit, con un bucle y una voz femenina sensual:LOL: le recuerda cerrar la puerta amablemente y viera como hacen caso:LOL:

Pasa igual que con una alarma despertador hasta que no se levante no lo deja en paz:LOL:
 
Última edición:
No sé si esto es un post unificado o que, pero sin diagramas, código o algo que nos ayude mejor, va a ser imposible ayudarte.

PHP:
// LCD conexion del modulo LCD
sbit LCD_RS at RD4_bit;
sbit LCD_EN at RD5_bit;
sbit LCD_D4 at RD0_bit;
sbit LCD_D5 at RD1_bit;
sbit LCD_D6 at RD2_bit;
sbit LCD_D7 at RD3_bit;

sbit LCD_RS_Direction at TRISD4_bit;
sbit LCD_EN_Direction at TRISD5_bit;
sbit LCD_D4_Direction at TRISD0_bit;
sbit LCD_D5_Direction at TRISD1_bit;
sbit LCD_D6_Direction at TRISD2_bit;
sbit LCD_D7_Direction at TRISD3_bit;

char inst = 0;
int ciclo = 0;

void main(){
    TRISC=0x80;
    PORTC=0x10;
    TRISD=0x00;
    PORTD=0x00;
    TRISD.F6=1;                                                 //Final de carrera superior
    TRISD.F7=1;                                                 //Final de carrera inferior
    UART1_Init(9600);                                           //Iniciar modulo UART (comunicacion serial Bluetooth hc-06)
    delay_ms(100);
    UART1_WRITE_TEXT("AT+NAMEPORTON PARTICULAR");
    delay_ms(100);
    UART1_WRITE_TEXT("AT+PIN2017");
    delay_ms(100);
    Lcd_Init();                                                           //Iniciar modulo LCD
    delay_ms(100);
    Lcd_Cmd(_LCD_CURSOR_OFF);
    delay_ms(100);
    PWM1_Init(5000);                                                      //Iniciar modulo PWM
    delay_ms(100);
    
    while(1){
        if(PORTD.F6 == 1){
            Lcd_Out(1,1,"Porton abierto");
        }
        if(PORTD.F7 == 1){
            Lcd_Out(1,1,"Esperando");
            Lcd_Out(2,1,"instruccion");
        }
        PWM1_Set_Duty(0);
        PWM1_Start();
        ciclo = 0;
        inst = 0;
        PORTC.RC0 = 0;
        PORTC.RC1 = 0;
        PORTC.RC3 = 0;
        if((PORTD.F7 == 0) && (PORTD.F6 == 0)){                           //En caso de existir alguna falla de cierre o iniciacion del porton se cierra
            Lcd_Out(1,1,"Anomalia en");
            Lcd_Out(2,1,"porton detectada");
            delay_ms(3000);
            Lcd_Cmd(_LCD_CLEAR);
            Lcd_Out(1,1,"Cerrando en 5");
            delay_ms(1000);
            PORTC.RC3 = 1;
            Lcd_Out(1,13,"4");
            delay_ms(1000);
            PORTC.RC3 = 0;
            Lcd_Out(1,13,"3");
            delay_ms(1000);
            PORTC.RC3 = 1;
            Lcd_Out(1,13,"2");
            delay_ms(1000);
            PORTC.RC3 = 0;
            Lcd_Out(1,13,"1");
            delay_ms(1000);
            PWM1_Set_Duty(255);
            PORTC.RC0 = 0;
            PORTC.RC1 = 1;
            PORTC.RC3 = 1;
            Lcd_Cmd(_LCD_CLEAR);
            Lcd_Out(1,1,"Cerrando porton");
            while(PORTD.F7 == 0){                                         //Girara hasta cerrar
            }
                Lcd_Cmd(_LCD_CLEAR);
                PWM1_Set_Duty(0);
                PORTC.RC0 = 0;
                PORTC.RC1 = 0;
                PORTC.RC3 = 0;
                Lcd_Out(1,1,"Porton cerrado");
                delay_ms(2000);
                Lcd_Cmd(_LCD_CLEAR);
        }
        if(Uart1_Data_Ready()){                                           //Ejecuta en caso de recibir datos del hc-06
            inst = Uart1_read();
            Uart1_Write(inst);
            Lcd_Cmd(_LCD_CLEAR);
            if(inst == 'b'){                                              //Alterna el uso de buzzer
                PORTC.RC4 = ~PORTC.RC4;
                if(PORTC.RC4 == 0){
                    Lcd_Out(1,1,"Alarma apagada");
                }
                if(PORTC.RC4 == 1){
                    Lcd_Out(1,1,"Alarma encendida");
                }
                delay_ms(2000);
                Lcd_Cmd(_LCD_CLEAR);
            }
            if((inst == 'a') && (PORTD.F7 == 1) && (ciclo == 0)){         //Abre el porton
                Lcd_Out(1,1,"Abriendo porton");
                PWM1_Set_Duty(255);
                PORTC.RC0 = 1;
                PORTC.RC1 = 0;
                PORTC.RC3 = 1;
                while(PORTD.F6 == 0){
                    ciclo = 1;
                }
                Lcd_Cmd(_LCD_CLEAR);
            }
            if((inst == 'a') && (PORTD.F6 = 1) && (ciclo == 0)){          //Cierra el porton
                Lcd_Out(1,1,"Cerrando porton");
                PWM1_Set_Duty(255);
                PORTC.RC0 = 0;
                PORTC.RC1 = 1;
                PORTC.RC3 = 1;
                while(PORTD.F7 == 0){
                    ciclo = 1;
                }
                Lcd_Cmd(_LCD_CLEAR);
                PWM1_Set_Duty(0);
                PORTC.RC0 = 0;
                PORTC.RC1 = 0;
                PORTC.RC3 = 0;
                Lcd_Out(1,1,"Porton cerrado");
                delay_ms(2000);
                Lcd_Cmd(_LCD_CLEAR);
            }
        }
    }
}

Hasta ahora todo bien, pero me gustaría usar una interrupción u otro método para cerrar de manera automática después de cierto tiempo desde el PIC, porque si el usuario está lejos del portón, por mas que el celular recuerde o envíe una señal de manera automática, pues este no la recibirá.

Post Data: perdón por el código largo y sin usar las funciones fuera de main para acortar.
 

Adjuntos

  • porton.zip
    102 KB · Visitas: 2
Última edición por un moderador:
Mmm. Fíjate que una manera sana de deshacerte de un delay "los delay vuelven monotarea los programas"
Un delay hace parpadear un led cada segundo si queremos que un led 2 prenda cada 0.5s y otro que prenda cada 2 segundos. ¿Cómo le harías?

Para quitar los delays, podemos usar un timer de una interrupción.

PHP:
interrupcion cada 100ms
{

contador++;
segundo++;
segundo2++;
}

void main()
{

// prender un led cada 0.5s
if( contador>= 5)
{
led^=1; // hacemos un toggle cada 0.5s
contador=0;
}


//parpadeamos un led cada 1 segundos
if(segundo >= 10)
{
led2^=1;
segundo=0;
}


//parpadeamos un led cada 2 segundos
if(segundo2 >= 20)
{
led3^=1;
segundo2=0;
}



}
 
Última edición por un moderador:
yo utilizaría la interrupción serial del micro,ademas para los delay largos si en caso no tendrías otra opción para que no espere tanto para recibir datos se seria así:
FOR i = 1 TO 1000
pause 1
NEXT i

esta en BASIC pero lo adaptas a tu compilador,asi solo espera 1ms antes de recibir datos pero al final se tardar el delay largo que quieres
 
Atrás
Arriba