Subido por CARLOS LEGAZPI TAPIA

Control de velocidad y dirección motor DC con L298n

Anuncio
Universidad Politécnica de Aguascalientes
Nombre de la practica:
Control de velocidad y dirección motor DC con L298n
Alumnos:
Carlos Legazpi Tapia
Diego Alberto Durón Silva
Matriculas:
UP180242
UP180557
Carrera:
Ingeniería Electrónica
Grupo:
ELE03A
Materia:
Programación de Periféricos
Profesor:
Ing. Iván Salazar
Fecha:
31/10/2019
1
Desarrollo.
Objetivo:
Implementar un control de velocidad y dirección para motores de corriente directa,
utilizando señales PWM y el controlador de potencia para motores L298n.
Lista de materiales:

Osciloscopio

Modulo Microcontrolador (LP-MSP430FR2476)

Controlador L298n
Teoría Básica:
Texas Instruments LP-MSP430FR2476.
El dispositivo MSP430FR2476 de 16MHz cuenta con 64 KB de memoria de acceso
aleatorio ferro eléctrico (FRAM), una memoria no volátil conocida por su acceso de
escritura de muy baja potencia, alta resistencia y alta velocidad. En combinación con los
8 KB de SRAM en chip, los usuarios tienen acceso a 64 KB de memoria para dividir entre
su programa y los datos según sea necesario. Por ejemplo, una aplicación de registro de
datos puede requerir una memoria de datos grande con una memoria de programa
relativamente pequeña, por lo que la memoria puede asignarse según sea necesario
entre el programa y la memoria de datos.
L298n.
El driver puente H L298N es el modulo más utilizado para manejar motores DC de hasta
2 amperios. El chip L298N internamente posee dos puentes H completos que permiten
controlar 2 motores DC o un motor paso a paso bipolar/unipolar.
El módulo permite controlar el sentido y velocidad de giro de motores mediante señales
TTL que se pueden obtener de microcontroladores y tarjetas de desarrollo como Arduino,
Raspberry Pi o Launchpads de Texas Instruments. El control del sentido de giro se realiza
mediante dos pines para cada motor, la velocidad de giro se puede regular haciendo uso
de modulación por ancho de pulso (PWM por sus siglas en inglés).
2
Tiene integrado un regulador de voltaje LM7805 de 5V encargado de alimentar la parte
lógica del L298N, el uso de este regulador se hace a través de un Jumper y se puede
usar para alimentar la etapa de control.
Señal PWM.
Una señal PWM puede implementarse de diversas maneras, una de ellas es mediante
funciones de retraso. La función de retraso que desarrollo previamente será utilizada para
controlar el ciclo útil de la señal.
El ciclo útil es la porción de la señal que permanece en estado alto, el cual complementa
el periodo completo de la señal junto con el tiempo de estado bajo.
Duty Cycle.
En electrónica, el ciclo de trabajo, ciclo útil o régimen de trabajo es la relación que existe
entre el tiempo en que la señal se encuentra en estado activo y el periodo de la misma.
Su valor se encuentra comprendido entre 0 y 1.
Procedimiento:
-Configuramos 3 bits, como salida, para controlar el L298n.

PWM - P1.1

DIR1 - P1.0

DIR2 – P6.6
-Uno de los bits controlara ENx, enviando la señal PWM (P1.1).
-Utilizaremos los botones para ajustar la velocidad del motor.
-Un botón conectado en el puerto 2 en el bit 3, aumentara 1% la velocidad cada vez que
es presionado y soltado.
-El otro botón conectado en el puerto 4 en el bit 1, recude 1% la velocidad cada vez que
es presionado y soltado.
-Utilizando un botón conectado en el puerto 2 en el bit 0, para cambiar la dirección de
giro del motor.
-La señal INx se deben invertir al presionar el botón, cambiando la dirección del motor.
3
Resultados.
Código C implementado en CCS:
#define bMIn
P4IN
// declara
IN para boton-
#include <msp430.h>
#define bPOut
/*
P2OUT
//
declara OUT para boton+
* Seccion de Declaraciones
#define bMOut
P4OUT
*/
declara OUT para boton-
// ENTRADAS
#define bPBit
#define bPIOSet
P2DIR
//
declara DIR para boton+
#define bMIOSet
P4DIR
declara DIR para boton#define bPRen
P2REN
declara REN para boton+
#define bMRen
P4REN
//
P2IE
IE para boton+
#define bMIen
// declara
IE para boton#define bPIes
P2IES
// declara
//
declara IES para boton#define bPIn
P2IN
//
P2REN
//
declara REN para boton direccion
P2IE
// declara
IE para boton direccion
P2IES
// declara
IES para boton direccion
#define bDirIn
// declara
P2DIR
declara DIR para boton direccion
#define bDirIes
P4IES
(bMIn&bMBit)/bMBit //
declara etiqueta para leer boton-
#define bDirIen
IES para boton+
#define bMIes
declara etiqueta para leer boton+
#define bDirRen
P4IE
(bPIn&bPBit)/bPBit //
#define bDirIOSet
// declara
// declara
bit especifico del boton-
//#define bM
declara REN para boton#define bPIen
BIT1
//#define bP
//
// declara
bit especifico del boton+
#define bMBit
//
BIT3
//
P2IN
// declara
IN para boton direccion
IN para boton+
4
#define bDirOut
P2OUT
//
declara OUT para boton direccion
#define bDir
BIT0
void setup(void);
/*
// declara
* Seccion de Variables Globales
bit especifico del boton direccion
*/
// SALIDAS
unsigned char Control;
#define PWMIOSet
P1DIR
//
unsigned char vbutton;
declara DIR para PWM
#define PWMOut
P1OUT
//
const unsigned char count = 100;
declara registro de escritura del PWM
unsigned char duty = 50;
#define PWM
/*
BIT1
// declara
bit especifico del PWM
* Seccion Codigo Principal
#define dir1IOSet
P1DIR
//
*/
declara DIR para ctrl dir 1
#define dir2IOSet
P6DIR
//
{
declara DIR para ctrl dir 2
#define dir1Out
P1OUT
//
declara registro de escritura de ctrl dir 1
#define dir2Out
P6OUT
//
declara registro de escritura de ctrl dir 2
#define dir1
BIT0
int main(void)
// declara
WDTCTL = WDTPW | WDTHOLD; //
stop watchdog timer
PM5CTL0 &= ~LOCKLPM5;
//
Disable the GPIO power-on default highimpedance mode
bit especifico del ctrl de dir 1
#define dir2
BIT6
bit especifico del ctrl de dir 2
// declara
setup();
setup_TB();
/*
* Seccion de Prototipos
*/
void setup_TB(void);
dir1Out |= dir1;
dir2Out &= ~dir2;
// establece un
sentido de giro incial
5
do{
bPOut
|= bPBit; // pull-up en bP
bMOut
|= bMBit; // pull-up en bM
}while(1);
bDirOut
|= bDir;
return 0;
bPIen
// pull-up en bDir
|= bPBit;
// habilitar
interrupcion en bP
}
bMIen
/*
|= bMBit;
// habilitar
interrupcion en bM
* Seccion de Funciones Adicionales
bDirIen
*/
|= bDir;
// habilitar
interrupcion en bDir
void setup(void)
{
bPIes
bPIOSet
&= ~bPBit; // bP como
flanco neg en bP
entrada
bMIOSet
bMIes
&= ~bMBit; // bM como
bDirIes
&= ~bDir;
// bDir como
|= bMBit; // interrupcion por
flanco neg en bM
entrada
bDirIOSet
|= bPBit; // interrupcion por
|= bDir;
// interrupcion por
flanco neg en bDir
entrada
PWMIOSet
bPRen
|= bPBit;
// habilitar
|= bMBit;
// PWM como
salida
resistencia interna bP
bMRen
|= PWM;
dir1IOSet |= dir1; // dir1 como salida
// habilitar
dir2IOSet |= dir2; // dir2 como salida
resistencia interna bP
}
bDirRen
|= bDir;
// habilitar
resistencia interna bDir
6
void setup_TB(void)
}
{
TB0CCR0 |= 5-1;
#pragma vector=PORT2_VECTOR
TB0CCTL0|= CCIE;
__interrupt void Port_2(void)
TB0CTL |= TBSSEL_1 + MC_1;
{
P2IFG &= ~bPBit&~bDir;
_BIS_SR(GIE);
// limpiar
banderas para siguiente interrupcion
vbutton = bPIn&bPBit;
}
if(vbutton == 0)
// si bP es
presionado entra al if
#pragma vector=TIMER0_B0_VECTOR
{
__interrupt void Timer0_B0 (void) {
duty++;
if(duty > 99) duty = 100;
if (Control == duty)
}
{
vbutton = bDirIn&bDir;
PWMOut &= ~PWM;
if(vbutton == 0)
}
// si bDir es
presionado entra al if
{
if (Control == count)
dir1Out ^= dir1;
{
dir2Out ^= dir2;
PWMOut |= PWM;
Control = 0;
}
}
}
Control++;
#pragma vector=PORT4_VECTOR
7
__interrupt void Port_4(void)
if(vbutton == 0)
// si bM es
presionado entra al if
{
P4IFG &= ~bMBit;
// limpiar
{
banderas para siguiente interrupcion
duty--;
vbutton = bMIn&bMBit;
if(duty < 2) duty = 1;
}
Capturas:
Figura 1. Se muestra la fuente de voltaje donde se muestra que nuestro circuito es alimentado
con 12V.
8
Figura 2. Se muestra la conexión del circuito, ya que se utilizó un protoboard, un módulo
Microcontrolador (LP-MSP430FR2476) y Controlador L298n
9
Bibliografía
BLOG DE RISOUL. (9 de Mayo de 2018 ). BLOG DE RISOUL. Obtenido de Risoul.
Rafael Lesur , L. (2014). Manual De Mantenimiento Electrico Industrial. En L. Rafael Lesur , Manual De
Electrico Industrial (págs. 204-210). Mexico: Trillas.
10
Descargar