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