| |
EXPERIMENTOS
: MOTOR
DC
con L298N
|
|
| |
Ese es mi primer
experimento con un Motor DC controlándolo desde el PIC. Para este caso he
utilizado el driver de National L298N por la sencilla y simple razón de
que era el único que tenía disponible. |
|
|
Experimentando con un
Motor D.C. usando el driver L298N |
|
|
|
Primera parte: Los elementos
reciclados. |
|
|
|
Gracias a mi compañero de
trabajo Jesús Mateos me he conseguido un artilugio que calza un par de
motores D.C. Maxon A-Max (corriente continua) de 12V con reductoras y
encoder incluido. Así que a desmontarlos y utilizarlos para este
experimento. |
|
|
|
 |
Aquí lo tenéis mas en detalle:
|
|
 |
|
|
|
La electrónica original
comanda estos motores mediante unos Puente-H LMD18200T (de los que ya me
he pedido unos samples) sin embargo mientras llegan vamos a acometer este
trabajo con otro tipo de driver del que si tengo existencias.
|
|
 |
|
|
|
Segunda
parte: El driver a utilizar, el
L298N. |
|
|
Este driver sirve para dos motores, pero en
este primer experimento solo vamos a utilizar uno de los "canales"
olvidándonos terapéuticamente del segundo de ellos.
|
|
Lo primero es el
Datasheet que no olvidemos es y debe ser siempre lo primero. En él
tenemos el muy fundamental pinout del driver: |
|
|
|
 |
|
|
|
Tercera parte:
Algo en forma de esquema y el PCB. |
|
|
|
A modo de introducción, algo jocosa por
cierto, pero interesante os pongo el primer esquema que monté a mano con
bolígrafo, donde aparecen las notas que tomé del datasheet y otras de
varios esquemas que encontré por Internet: |
|
|
|
 |
|
|
|
Sin embargo y de forma bastante mas
académica también he realizado el mismo esquema en
Eagle v4.16r2: |
|
|
|
 |
|
|
|
Cuya cara de componentes queda de la
siguiente forma: |
|
|
|
 |
|
|
|
Y las pistas (haciendo click sobre ella la
podéis descargar en formato PDF) |
|
|
|
 |
|
|
|
Cuarta (y última) parte:
Haciendo que funcione. |
|
|
|
No he podido resistirme, y antes de realizar
el PCB como Dios manda me he tirado a rematar de cabeza sobre una de esas
placas taladradas y he montado la versión cutre de este circuito: |
|
|
|
 |
|
|
|
Y aquí está todo completo: El PIC (18F1320)
el Driver y el Motor, junto al MAX232 para monitorizar y comandar su
funcionamiento: |
|
|
|
 |
|
|
|
Y por último el programa que lo hace
funcionar, con las funciones Stop(), Forward() y Reverse(): |
|
|
| |
|
|
| |
#include
<18f1320.h>
#fuses HS,NOMCLR,PUT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOCPD,NODEBUG,NOWRT
#use delay(clock=20000000)
#use rs232(baud=115200, xmit=PIN_B1, rcv=PIN_B4)
#include <ctype.h>
#define MOTORDC_CTRL1 PIN_B2
#define MOTORDC_CTRL2 PIN_A3
#define MOTORDC_ENPWM PIN_B0
static char command;
#int_rda
void serial_isr(void){
if(kbhit()){
command=getc();
}
}
void stop(void) {
output_low(MOTORDC_CTRL1);
output_low(MOTORDC_CTRL2);
output_low(MOTORDC_ENPWM);
}
void forward(void) {
output_low(MOTORDC_CTRL2);
output_high(MOTORDC_CTRL1);
output_high(MOTORDC_ENPWM);
}
void reverse(void) {
output_low(MOTORDC_CTRL1);
output_high(MOTORDC_CTRL2);
output_high(MOTORDC_ENPWM);
}
void pres_menu(void){
printf("\r\nA 18F1320 listen on RS-232");
printf("\r\n Motor DC driver by L298N");
printf("\r\n");
printf("\r\n[?] This menu");
printf("\r\n[F] Forward");
printf("\r\n[R] Reverse");
printf("\r\n[S] Stop");
printf("\r\n\n>");
}
void main(void) {
int1 valid_command;
int8 i, step;
disable_interrupts(global);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
setup_timer_0(RTCC_OFF);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED);
port_b_pullups(FALSE);
set_tris_a(0b00000000);
set_tris_b(0b00010000);
stop();
delay_ms(1000);
command='\0';
enable_interrupts(int_rda);
enable_interrupts(global);
pres_menu();
do {
if(command!='\0'){
command=toupper(command);
valid_command=0;
printf("%c\r\n>",command);
if(command=='?'){
pres_menu();
valid_command=1;
}
if(command=='F'){
printf("> Forward\r\n>");
Forward();
valid_command=1;
}
if(command=='R'){
printf("> Reverse\r\n>");
Reverse();
valid_command=1;
}
if(command=='S'){
printf("> Stop\r\n>");
Stop();
valid_command=1;
}
if(!valid_command) printf("?\r\n>");
command='\0';
}
} while (TRUE);
}
|
|
| |
|
|
Esta página se modificó el
27/12/2008
|