Sei sulla pagina 1di 16

Control de Motor paso a paso a travs de un PIC

1.

#include <16F877.h>

2.

#use delay(clock=1000000)

3.
#fuses
NOWDT,NOPROTECT,NOLVP,NODEBUG,PUT
4.

int retardo;

5.

void main()

6.
{ retardo=300; //CON ESTE VALOR SE
CAMBIA LA VELOCIDAD DE GIRO DEL MOTOR
7.
WHILE(input(PIN_C0)) // INICIALIZO
LOS PINES EN VALOR BAJO, PARA QUE EL MOTOR
NO SE MUEVA
8.

9.

OUTPUT_LOW(PIN_B0);

10.

OUTPUT_LOW(PIN_B1);

11.

OUTPUT_LOW(PIN_B2);

12.

OUTPUT_LOW(PIN_B3);

13.
14.

15.

do{

16.

if(!input(pin_C0)&&(input(pin_c1)))
// GIRO EN UN SENTIDO (GIRO 1)

17.

18.

OUTPUT_LOW(PIN_B0);

19.

OUTPUT_HIGH(PIN_B1);

20.

OUTPUT_LOW(PIN_B2);

21.

OUTPUT_LOW(PIN_B3);

22.
delay_ms(retardo); }if(!
input(pin_C0)&&(input(pin_c1)))
EN UN SENTIDO (GIRO 1)
23.

24.

OUTPUT_LOW(PIN_B0);

25.

OUTPUT_LOW(PIN_B1);

26.

OUTPUT_HIGH(PIN_B2);

27.

OUTPUT_LOW(PIN_B3);

28.
delay_ms(retardo); }if(!
input(pin_C0)&&(input(pin_c1)))
EN UN SENTIDO (GIRO 1)
29.

// GIRO

30.

OUTPUT_LOW(PIN_B0);

31.

OUTPUT_LOW(PIN_B1);

32.

OUTPUT_LOW(PIN_B2);

33.

OUTPUT_HIGH(PIN_B3);

// GIRO

34.
delay_ms(retardo); }if(!
input(pin_C0)&&(input(pin_c1))) // GIRO EN
UN SENTIDO (GIRO 1)
35.

36.

OUTPUT_HIGH(PIN_B0);

37.

OUTPUT_LOW(PIN_B1);

38.

OUTPUT_LOW(PIN_B2);

39.

OUTPUT_LOW(PIN_B3);

40.
delay_ms(retardo); }
if(input(pin_C0)&&(!input(pin_c1)))// GIRO
EN UN SENTIDO (GIRO 2)
41.

42.

OUTPUT_HIGH(PIN_B0);

43.

OUTPUT_LOW(PIN_B1);

44.

OUTPUT_LOW(PIN_B2);

45.

OUTPUT_LOW(PIN_B3);

46.
delay_ms(retardo); }
if(input(pin_C0)&&(!input(pin_c1)))
GIRO EN UN SENTIDO (GIRO 2)
47.

48.

OUTPUT_LOW(PIN_B0);

49.

OUTPUT_LOW(PIN_B1);

50.

OUTPUT_LOW(PIN_B2);

//

51.

OUTPUT_HIGH(PIN_B3);

52.
delay_ms(retardo); }
if(input(pin_C0)&&(!input(pin_c1)))
GIRO EN UN SENTIDO (GIRO 2)
53.

//

54.

OUTPUT_LOW(PIN_B0);

55.

OUTPUT_LOW(PIN_B1);

56.

OUTPUT_HIGH(PIN_B2);

57.

OUTPUT_LOW(PIN_B3);

58.
delay_ms(retardo); }
if(input(pin_C0)&&(!input(pin_c1))) //
GIRO EN UN SENTIDO (GIRO 2)
59.

60.

OUTPUT_LOW(PIN_B0);

61.

OUTPUT_HIGH(PIN_B1);

62.

OUTPUT_LOW(PIN_B2);

63.

OUTPUT_LOW(PIN_B3);

64.

delay_ms(retardo); }}while(true);

65.

66.

Programa utilizado: CCS Compiler


Control de velocidad para un Motor Paso a Paso para el

PIC 16f877a

#include <16F877A.h>
#device adc=8
#FUSES NOWDT, RC, PUT, NOPROTECT,NODEBUG,
NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#org 0x1f00,0x1fff{}
#build (reset=0x04)
#use
rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bit
s=8)
#define t1 delay_ms(200);
#include <lcd.c>
//#device ICD=TRUE
//#fuses HS,NOWDT,NOPROTECT,NOLVP
//#use delay(clock=20000000)
//#use
rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bit
s=8)
#use FAST_IO(B)

#use FAST_IO(C)
#byte FASES= 0x06
int velocidad=300;
void GiroDerecha(){
output_b (0x30); //paso 1
delay_ms(velocidad);
output_b (0x60); //paso 2
delay_ms(velocidad);
output_b (0xc0); //paso 3
delay_ms(velocidad);
output_b (0x90); // paso 4
delay_ms(velocidad);
}
void GiroIzquierda(){
FASES=0b001100; //paso 1
delay_ms(velocidad);
FASES=0b001001; //paso 2
delay_ms(velocidad);
FASES=0b000011; //paso 3
delay_ms(velocidad);
FASES=0b001100; // paso 4
delay_ms(velocidad);

}
void main(void)
{
char valor=0;
SET_TRIS_B(0x00);
while(TRUE){
if(kbhit())
valor=getc();
switch (valor){
case 'a'://motor parado
FASES=0b000000;
break;
case 'b': //Marcha Manual Lenta Izquierda
velocidad=10;
GiroIzquierda();
break;
case 'c': //Motor parado
FASES=0b000000;
break;

case 'd': //Marcha manual rpida izquierda


velocidad=3;
GiroIzquierda();
break;
case 'e': //Motor parado
FASES=0b000000;
break;
case 'f': //Marcha manual lenta derecha
velocidad=10;
GiroDerecha();
break;
case 'g': //Motor parado
FASES=0b000000;
break;
case 'h': //Marcha manual rpida derecha
velocidad=3;
GiroDerecha();
break;

case 'A': //Marcha Automtica lenta izquierda


velocidad=10;
GiroIzquierda();
break;
case 'B': //Marcha Automtica lenta izquierda
velocidad=10;
GiroIzquierda();
break;
case 'C': //Marcha Automtica rpida izquierda
velocidad=3;
GiroIzquierda();
break;
case 'D': //Marcha Automtica rpida izquierda
velocidad=3;
GiroIzquierda();
break;
case 'E': //Marcha automtica lenta derecha

velocidad=10;
GiroDerecha();
break;
case 'F': //Marcha automtica lenta derecha
velocidad=10;
GiroDerecha();
break;
case 'G': //Marcha automtica rpida derecha
velocidad=3;
GiroDerecha();
break;
case 'H': //Marcha automtica rpida derecha
velocidad=3;
GiroDerecha();
break;
case 'n':
break;
default:
velocidad=15;

break;
}
}
}

zona de codigo AVR Studio 4

PROGRAMADO: jose yovany rojas tecnologo BIOMEDICA SENA CEET


*graduacion 2013*
ESTUDIANTE INGENIERIA FUNDACION UNIVERSIDAD CENTRAL *activo*
/*sena CEET biomedica 28/09/2012********************************/

#include <stdio.h>
// Libreria standar
#include <avr/io.h>
// Libreria para usar puertos de entrada y salidas
#include <util/delay.h> // Libreria para retardos
int main (void)
{
DDRD= 0b11110100;
PORTD=0b00000011;
DDRB= 0b00111001;

char A,B;
char i;

// declaran los bit 7 al 4 como salida; 0 y 1 como entrada


// activamos resistencias pull-up en los bit 1 y 0

//variable de tipo caracter

while(1)
{
A=PIND & 0b00000001; // bit 1 activa pulsador 1 pind es nombrar el puerto
B=PIND & 0b00000010; // bit 2 activa pulsador 2
for(i=0;i<=11;i++)// codigo a repetir 0 a 11veces
if (A==0) //sentecia if para giro hacia sentido del reloj (derecha)

{
PORTD=0b10000011; // paso 1
_delay_ms(200);
PORTB=0b00000001;
_delay_ms(200);

//Cdigo del dgito 1

PORTD=0b11000011; // paso 2
_delay_ms(200);
PORTB=0b00001000;
_delay_ms(200);

//Cdigo del dgito 2

PORTD=0b01000011; // paso 3
_delay_ms(200);
PORTB=0b00001001;

//Cdigo del dgito 3

_delay_ms(200);
PORTD=0b01100011; // paso 4
_delay_ms(200);
PORTB=0b00010000;
_delay_ms(200);

//Cdigo del dgito 4

PORTD=0b00100011; // paso 5
_delay_ms(200);
PORTB=0b00010001;
_delay_ms(200);

//Cdigo del dgito 5

PORTD=0b00110011; // paso 6
_delay_ms(200);
PORTB=0b00011000;
_delay_ms(200);

//Cdigo del dgito 6

PORTD=0b00010011;
_delay_ms(200);

// paso 7

PORTB=0b00011001;
_delay_ms(200);

//Cdigo del dgito 7

PORTD=0b10010011;
_delay_ms(200);

// paso 8

PORTB=0b00100000;
_delay_ms(200);

//Cdigo del dgito 8

}
for(i=0;i<=11;i++) //le decimos que repita el ciclo 12 veces
if (B==0) //sentecia if para giro hacia sentido antihorario del reloj (izquierda)
{

PORTD=0b10010011;
_delay_ms(200);

// paso 8

PORTB=0b00100000;
_delay_ms(200);

//Cdigo del dgito 8

PORTD=0b00010011;
_delay_ms(200);

// paso 7

PORTB=0b00011001;
_delay_ms(200);

//Cdigo del dgito 7

PORTD=0b00110011; // paso 6
_delay_ms(200);
PORTB=0b00011000;
_delay_ms(200);

//Cdigo del dgito 6

PORTD=0b00100011; // paso 5
_delay_ms(200);
PORTB=0b00010001;
_delay_ms(200);

//Cdigo del dgito 5

PORTD=0b01100011; // paso 4
_delay_ms(200);
PORTB=0b00010000;
_delay_ms(200);

//Cdigo del dgito 4

PORTD=0b01000011; // paso 3
_delay_ms(200);
PORTB=0b00001001;
_delay_ms(200);

//Cdigo del dgito 3

PORTD=0b11000011; // paso 2
_delay_ms(200);
PORTB=0b00001000;
_delay_ms(200);

//Cdigo del dgito 2

PORTD=0b10000011; // paso 1
_delay_ms(200);
PORTB=0b00000001;
_delay_ms(200);

//Cdigo del dgito 1

}
// fin if de el motor
else
{
PORTD=0b00000011; // apagar todo si no cumple la condicion
}
//
}
// fin main
}

Potrebbero piacerti anche