Ir ao conteúdo
  • Cadastre-se

- Motor de Passo não roda corretamente


RonaldoCastor

Posts recomendados

Boa noite,

Estou tentando controlar 3 motores de passo com um PIC18F4520, sendo que 2 são controlados pela porta B e um pela porta D.

O problema é o seguinte, a programação, apesar de ser "a mesma" para os dois motores da porta B, apenas um roda corretamente. O outro fica indo e voltando. Quando diminuo o delay, ele roda, porém tremendo. Para o projeto que estou desenvolvendo não é possivel deixar esta velocidade alta, pois o motor perde força e não consigo executar o movimento desejado.

O projeto está funcionando com um 24V e todas as peças ja foram testadas e estão funcionando corretamente.

O problema está relacionado ao motor correspondende aos 4bits menos significativos da porta B.

Código:


#include<p18f4520.h>
#include<delays.h>
#include<usart.h>

#pragma config OSC = HS
#pragma config WDT = OFF
#pragma config PWRT = ON
#pragma config BOREN = ON
#pragma config BORV = 1
#pragma config PBADEN = OFF
#pragma config LVP = OFF

unsigned char delay = 30;
unsigned char delaycorda = 30;
unsigned char data = 0x00;

void sobe(void){
PORTD=0x11;
Delay10KTCYx(delaycorda);
PORTD=0x33;
Delay10KTCYx(delaycorda);
PORTD=0x22;
Delay10KTCYx(delaycorda);
PORTD=0x66;
Delay10KTCYx(delaycorda);
PORTD=0x44;
Delay10KTCYx(delaycorda);
PORTD=0xCC;
Delay10KTCYx(delaycorda);
PORTD=0x88;
Delay10KTCYx(delaycorda);
PORTD=0x99;
Delay10KTCYx(delaycorda);
}

void desce(void){
PORTD=0x99;
Delay10KTCYx(delaycorda);
PORTD=0x88;
Delay10KTCYx(delaycorda);
PORTD=0xCC;
Delay10KTCYx(delaycorda);
PORTD=0x44;
Delay10KTCYx(delaycorda);
PORTD=0x66;
Delay10KTCYx(delaycorda);
PORTD=0x22;
Delay10KTCYx(delaycorda);
PORTD=0x33;
Delay10KTCYx(delaycorda);
PORTD=0x11;
Delay10KTCYx(delaycorda);
}

//
void cima (void){
PORTB = 0x10;
Delay10KTCYx(delay);
PORTB = 0x30;
Delay10KTCYx(delay);
PORTB = 0x20;
Delay10KTCYx(delay);
PORTB = 0x60;
Delay10KTCYx(delay);
PORTB = 0x40;
Delay10KTCYx(delay);
PORTB = 0xC0;
Delay10KTCYx(delay);
PORTB = 0x80;
Delay10KTCYx(delay);
PORTB = 0x90;
Delay10KTCYx(delay);
}
void baixo(void){
PORTB = 0x90;
Delay10KTCYx(delay);
PORTB = 0x80;
Delay10KTCYx(delay);
PORTB = 0xC0;
Delay10KTCYx(delay);
PORTB = 0x40;
Delay10KTCYx(delay);
PORTB = 0x60;
Delay10KTCYx(delay);
PORTB = 0x20;
Delay10KTCYx(delay);
PORTB = 0x30;
Delay10KTCYx(delay);
PORTB = 0x10;
Delay10KTCYx(delay);
}

//
void direita (void){
PORTB = 0x01;
Delay10KTCYx(delay);
PORTB = 0x03;
Delay10KTCYx(delay);
PORTB = 0x02;
Delay10KTCYx(delay);
PORTB = 0x06;
Delay10KTCYx(delay);
PORTB = 0x04;
Delay10KTCYx(delay);
PORTB = 0x0C;
Delay10KTCYx(delay);
PORTB = 0x08;
Delay10KTCYx(delay);
PORTB = 0x09;
Delay10KTCYx(delay);
}
void esquerda(void){
PORTB = 0x09;
Delay10KTCYx(delay);
PORTB = 0x08;
Delay10KTCYx(delay);
PORTB = 0x0C;
Delay10KTCYx(delay);
PORTB = 0x04;
Delay10KTCYx(delay);
PORTB = 0x06;
Delay10KTCYx(delay);
PORTB = 0x02;
Delay10KTCYx(delay);
PORTB = 0x03;
Delay10KTCYx(delay);
PORTB = 0x01;
Delay10KTCYx(delay);
}

char dataRF(void){
if(!DataRdyUSART()){
if (getcUSART() == 0x55){
while (!DataRdyUSART());
data = getcUSART();
while (!DataRdyUSART());
if (getcUSART() == 0xFF){
return data;
}
}
}
return 0x00;
}

void main(){
//0 saida 1 entrada
TRISA = 0x1F;
TRISB = 0x00;
TRISC = 0x0F;
TRISD = 0x00;

PORTB = 0x11;
PORTD = 0x11;

OpenUSART ( USART_TX_INT_OFF &
USART_RX_INT_OFF &
USART_ASYNCH_MODE &
USART_EIGHT_BIT &
USART_CONT_RX &
USART_BRGH_LOW,
25 );//4800bps

while (1){
if (PORTAbits.RA4==1){
data = dataRF();
if (data==0x00)
Nop();
if (data==0x01)
sobe();
if (data==0x02)
desce();
if (data==0x03)
cima();
if (data==0x04)
baixo();
if (data==0x05)
direita();
if (data==0x06)
esquerda();
}else{

//Colocar os valores normalmente pois nas chaves estão invertidos
if ( PORTCbits.RC3==1
&&PORTCbits.RC2==0
&&PORTCbits.RC1==0
&&PORTCbits.RC0==0
&&PORTAbits.RA3==0
&&PORTAbits.RA2==0
&&PORTAbits.RA1==0
&&PORTAbits.RA0==0){
sobe();//0000 0001
}
if ( PORTCbits.RC3==0
&&PORTCbits.RC2==1
&&PORTCbits.RC1==0
&&PORTCbits.RC0==0
&&PORTAbits.RA3==0
&&PORTAbits.RA2==0
&&PORTAbits.RA1==0
&&PORTAbits.RA0==0){
desce();//0000 0010
}

if ( PORTCbits.RC3==1
&&PORTCbits.RC2==1
&&PORTCbits.RC1==0
&&PORTCbits.RC0==0
&&PORTAbits.RA3==0
&&PORTAbits.RA2==0
&&PORTAbits.RA1==0
&&PORTAbits.RA0==0){
cima();//0000 0011
}
if ( PORTCbits.RC3==0
&&PORTCbits.RC2==0
&&PORTCbits.RC1==1
&&PORTCbits.RC0==0
&&PORTAbits.RA3==0
&&PORTAbits.RA2==0
&&PORTAbits.RA1==0
&&PORTAbits.RA0==0){
baixo();//0000 0100
}

if ( PORTCbits.RC3==1
&&PORTCbits.RC2==0
&&PORTCbits.RC1==1
&&PORTCbits.RC0==0
&&PORTAbits.RA3==0
&&PORTAbits.RA2==0
&&PORTAbits.RA1==0
&&PORTAbits.RA0==0){
direita();//0000 0101
}
if ( PORTCbits.RC3==0
&&PORTCbits.RC2==1
&&PORTCbits.RC1==1
&&PORTCbits.RC0==0
&&PORTAbits.RA3==0
&&PORTAbits.RA2==0
&&PORTAbits.RA1==0
&&PORTAbits.RA0==0){
esquerda();//0000 0110
}
}
}
}

Esquemático:

http://imageshack.us/photo/my-images/850/imagenfhg.jpg/

Datasheets:

- Motores são 16PM-M003-P1 - http://rtds.cs.tamu.edu/web_462/techdocs/Motors/HybridSeriesStepMotors.pdf ;

- Os drivers são ULN2803APG - http://pdf1.alldatasheet.com/datasheet-pdf/view/182611/TOSHIBA/ULN2803APG.html

- PIC18F4520 - http://ww1.microchip.com/downloads/en/devicedoc/39631e.pdf

Alguém tem alguma sugestão?

Link para o comentário
Compartilhar em outros sites

Não entendí uma coisa.

Os dois motores do PORTB giram independentes ou juntos?

Se voce tiver tempo,estou no trampo agora,e não tiver outra ajuda,transforme os números de saída do PORTB em binário que é mais fácil analisar a sequencia de saida.

Outra observação,voce não esqueceu de desconectar o conector ISP no teste?

Link para o comentário
Compartilhar em outros sites

Os motores giram de maneira independente. Apenas jogo zero na porta do motor que não vai movimentar pois por enquanto não estou contando passos.

Referente aos valores, agora também estou no trabalho para alterar o código inteiro (a noite eu altero e coloco aqui em binário), mas estão girando com meio passo:

0001

0011

0010

0110

0100

1100

1000

1001

Daí é só colocar essa sequencia na parte menos e mais significativa da porta B referente a cada motor.

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!