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
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;
}
}
}