Control de motores

Hola!

Hace poco realize el control de 2 motores DC de 5 volts, este control tiene la capacidad de invertir el giro y controlar la velocidad con dos datos nada mas.
Por ejemplo:

enviamos -50 el motor giro inverso a una velocidad de 50% si enviamos 50 este gira hacia adelante con una velocidad de 50%
esto quiere decir que enviando solo un valor de tipo signed int (char) podemos invertir el giro y dar una velocidad.


VIDEO
http://www.youtube.com/watch?v=exOUbz0AB3E&feature=youtu.be

Código:
/*
 * File:   main.c
 * Author: george
 *
 * Created on May 27, 2012, 10:38 AM
 */

#include <htc.h>
#include  "../include/stdlib.h"
__CONFIG(FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_ON & LVP_OFF & BOREN_OFF & CP_OFF);
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//UNPROTECT	= Codigo no Potegido
//WDTDIS	= Watch Dog Timer Desactivado
//PWRTEN	= Power Activado
//FOSC_HS	= Osiclador externo
//MCLREN	= Activamos Master Clear
//LVPDIS	= Low Voltage Porgramming Desactivado
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#define _XTAL_FREQ 20000000 //Oscilador Interno de 20MHZ
#include  "libUSART/usartdr.h"
#include  "timer1/timer1dr.h"
/*DEFINICIONES*/
#define STOP_MOTORS RB7
/*VARIABLES Y ESTRUCTURAS*/
unsigned int ARRAY_TICK_HIGH[2]={65000,65000};
unsigned int ARRAY_TICK_LOW[2]={65000,65000};
unsigned int tick;
unsigned char dir_motor[2];
signed char MOTOR_PWM_LEFT=0;
signed char MOTOR_PWM_RIGHT=0;
unsigned char var;

struct{
    unsigned forw : 1;
    unsigned bakw : 1;
    unsigned recif: 1;
    unsigned change:1;
    unsigned dumy: 4;
}flags=0x00;
/////////////////////////////////////////////////
//Funcion de interrupcion
//Si no se usa simplemente no hacemos nada...
//Esto sirve para direccionar lo los datos
//en un lugar muy cercano al Inicio de la memoria
//de datos
////////////////////////////////////////////////
static void interrupt isr(void){
    /*Interrupcion por recepcion rs232*/
    if(RCIF && !TMR1IF){
        MOTOR_PWM_LEFT=getch();
        MOTOR_PWM_RIGHT=getch();
        RCIF=0;
        flags.recif=1;
    }
    /*Interrupcion Por Timer 1*/
    if(TMR1IF){
        if(flags.change==0){ //High Pulse
            PORTB=(PORTB|(dir_motor[var]<<3));
            tick=ARRAY_TICK_HIGH[var];
            flags.change=1;
        }
        else{//low pulse
            PORTB&=0x87;
            tick=ARRAY_TICK_LOW[var];
            if(var==1)var=0;
            else
                var++;
            flags.change=0;
        }
        TMR1IF=0;
        TMR1LOAD(tick);
    }
   
}
/*FUNCION PRINCIPAL*/
void main(void) {
    /*CONFIGURAMOS E/S*/
    TRISB=0X03;//RB1=RX
    CMCON=0X07;//PAGAMOS COMPARADORES
    PORTB=0X00;
    /*CONFIGURAMOS PUERTO RS232*/
    OpenUSART(64,OFF,ON);//64=19200BAUD
    /*CONFIGURAMOS TIMER1*/
    OpenTIMER1(pr_8,ON);
    GIE=1;
    PEIE=1;
    STOP_MOTORS=1;
    flags.recif=1;
    while (1){
        if(flags.recif==1){
            if(MOTOR_PWM_LEFT>0){
                dir_motor[0]=1;
            }
            else if (MOTOR_PWM_LEFT<0){
                dir_motor[0]=4;
            }

            if(MOTOR_PWM_RIGHT>0){
                dir_motor[1]=2;
            }
            else if(MOTOR_PWM_RIGHT<0){
                dir_motor[1]=8;
            }

            MOTOR_PWM_RIGHT=abs(MOTOR_PWM_RIGHT);
            MOTOR_PWM_LEFT=abs(MOTOR_PWM_LEFT);
            
            ARRAY_TICK_LOW[1]=65535-1200-(1200-(((unsigned int)MOTOR_PWM_RIGHT*3)));
            ARRAY_TICK_HIGH[1]=65535-(((unsigned int)MOTOR_PWM_RIGHT*32));
            ARRAY_TICK_LOW[0]=65535-1200-(1200-(((unsigned int)MOTOR_PWM_LEFT*3)));
            ARRAY_TICK_HIGH[0]=65535-(((unsigned int)MOTOR_PWM_LEFT*32));
            flags.recif=0;
        }
    }
}
 

Adjuntos

  • SYNC mode rs232.zip
    302.2 KB · Visitas: 10
Atrás
Arriba