Control de motor de pasos unipolar
Enviado por Luibert1208 • 21 de Agosto de 2022 • Apuntes • 2.822 Palabras (12 Páginas) • 139 Visitas
El objetivo de la presente práctica es el control de un motor de pasos unipolar, para ello recordemos que este tipo de motores tienen normalmente seis terminales, dos de las cuales son las conexiones comunes, mismas que se conectarán a una fuente de 10 V y las otras cuatro son las terminales de las bobinas a controlar. El control del motor se lleva a cabo por medio de un microcontrolador, específicamente el PIC16F887 de Microchip, en la programación del mismo se incluirá la secuencia de pasos que debe realizar el motor, tales secuencias serán en sentido horario y antihorario, a paso completo.
Para tener una visión más amplia de la secuencia que se cargará al microcontrolador y con la que se controlará el motor se muestran las siguientes tablas.
Sentido horario | Sentido antihorario | |||||||||
Bobina | A | B (RB1) | C (RB2) | D (RB3) | Bobina | A (RB0) | B (RB1) | C (RB2) | D (RB3) | |
Paso 1 | 1 | 0 | 0 | 0 | Paso 1 | 0 | 0 | 0 | 1 | |
Paso 2 | 0 | 1 | 0 | 0 | Paso 2 | 0 | 0 | 1 | 0 | |
Paso 3 | 0 | 0 | 1 | 0 | Paso 3 | 0 | 1 | 0 | 0 | |
Paso 4 | 0 | 0 | 0 | 1 | Paso 4 | 1 | 0 | 0 | 0 |
El código usado para programar el microcontrolador se encuentra a continuación, en tal código aparecen las secuencias como si estuvieran al revés, es decir, que para el paso 1 del sentido horario se escribe como 0b00000001 y en nuestra tabla anterior aparece como 1000, recordemos que en binario el último dígito es el bit menos significativo, es decir, la posición cero y con respecto a nuestra tabla se comienza de RB0, es decir, del bit menos significativo, por lo que tanto el 0b00000001 del código y el 1000 de la tabla de sentido horario son exactamente lo mismo.
// CONFIG1
#pragma config FOSC = XT // Oscillator Selection bits (XT oscillator: Crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON // RE3/MCLR pin function select bit (RE3/MCLR pin function is MCLR)
#pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = ON // Brown Out Reset Selection bits (BOR enabled)
#pragma config IESO = ON // Internal External Switchover bit (Internal/External Switchover mode is enabled)
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is enabled)
#pragma config LVP = OFF // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming)
// CONFIG2
#pragma config BOR4V = BOR40V // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V)
#pragma config WRT = OFF // Flash Program Memory Self Write Enable bits (Write protection off)
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#ifndef _XTAL_FREQ //Para evitar múltiples definiciones de _XTAL_FREQ
#define _XTAL_FREQ 4000000
#endif
//Señales de control de la LCD
#define LCD_RS RE2
#define LCD_RW RE1
#define LCD_EN RE0
#define LCD_DATA PORTD
#define LCD_STROBE()((LCD_EN = 1), (LCD_EN = 0))
void lcd_write(unsigned char c)
{
__delay_us(40);
LCD_DATA = ((c >> 4) & 0x0F);
LCD_STROBE();
LCD_DATA = (c & 0x0F);
LCD_STROBE();
}
void lcd_clear(void)
{
LCD_RS = 0;
lcd_write(0x1);
__delay_ms(2);
}
void lcd_puts(const char *s)
{
LCD_RS = 1;
while(*s)
lcd_write(*s++);
}
void lcd_putch(char c)
{
LCD_RS = 1;
lcd_write(c);
}
void lcd_goto(unsigned char pos)
{
LCD_RS = 0;
lcd_write(0x80+pos);
}
void lcd_init()
{
char init_value;
//ADCON1 = 0x06;
init_value = 0x3;
TRISE = 0;
TRISD = 0;
LCD_RS = 0;
LCD_EN = 0;
LCD_RW = 0;
__delay_ms(15);
LCD_DATA = init_value;
LCD_STROBE();
__delay_ms(5);
LCD_STROBE();
__delay_us(200);
LCD_STROBE();
__delay_us(200);
LCD_DATA = 2;
LCD_STROBE();
lcd_write(0x28);
lcd_write(0xF);
...