Vai al contenuto
PLC Forum


16f876 E Stepper


cloe

Messaggi consigliati

ciao a tutti,

sto pilotando (o meglio, sto cercando di pilotare) uno stepper.

Per avere una rotazione devo inviare un segnale ad onda quadra su un pin dell'azionamento.

per quanto riguarda la movimentazione non ho problemi, l'unico ostacolo è farlo fermare!

ho scritto un programmino davvero stupido con CCS. in pratica, in un while(true) ho inserito un if-then-else. nell'if c'è il codice per generare l'onda quadra e far muovere il motore, inoltre c'è un'istruzione che rende falsa la condizione di entrata nell'if; nell'else invece c'è un'istruzione per far lampeggiare un led.

in teoria, dopo avere eseguito un volta l'if, il pic dovrebbe eseguire sempre l'else, quindi il motore dopo aver girato di un angolo richiesto dovrebbe restare fermo.

il problema è che il pic rientra nell'if, per cui il motore riprende a girare!

qlc mi spiega perchè non funziona?

poichè non so inserire un allegato, riporto qui sotto il mio codice:

#include <16f876.h>

#use delay(clock=20000000)

//#use standard_io(A)

//#use standard_io(B)

#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7)

#BYTE spbrg = 0x00

#BYTE RCREG = 0x00

#BIT brgh = 0x0b.2

#BIT sync = 0x0b.4

#BIT spen = 0x0b.7

#BIT tx9 = 0x0b.6

#BIT rx9 = 0x0b.6

#BIT txen = 0x0b.5

#BIT cren = 0x0b.4

#BIT sren = 0x0b.5

#BIT txie = 0x0b.4

#BIT rcie = 0x0b.5

#BIT RCIF = 0x0b.5

#BIT TXIF = 0x0b.4

void main()

{

//valori di default per gli input

int16 i,t,w,c,p;

int16 num_step;

int16 angolo=270;

int attiva;

SET_TRIS_A(0x00);

SET_TRIS_B(0x00); //configura tutto il porto B come porto di output

//RA2 = segnale a livello per l'abilitazione del motore

//RA1 = segnale a livello per la direzione di rotazione del motore

// 0 --> rotazione a sinistra

// 1 --> rotazione a destra

//RA0 = segnale ad onda quadra per l'ingresso di step

output_high(PIN_A2);

attiva=1;

while(TRUE)

{

if(attiva)

{

output_high(PIN_A1);

delay_us(150);

for(i=0;i<500;i++) //i<200*w

{

output_high(PIN_A0);

delay_us(400);

output_low(PIN_A0);

delay_us(400);

}

attiva=0;

delay_ms(3000);

}

else

{ output_low(PIN_B7);

output_high(PIN_B7);

}

}

}

Link al commento
Condividi su altri siti


Sostituisci "if(attiva)" con "if(attiva==1)".

però mi sembra un po' un sistema UCAS. A cosa serve il while, l'if e l'else? per fare quello che hai scritto bastava il for ed al termine del for fai eseguire le due righe dell'else. Poi metti il ciclo infinito se vuoi che il processore stia li a girare i pollici. Oppure lega la scelta tra il marcia e l'arresto ad uno stato di un ingresso.

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

ciao livio

prima di tutto volevo ringraziarti per avermi risposto

ho introdotto qll'if perchè il mio pic non ne vuole saxe di "girare i pollici"!

ho modificato il programma in Questo modo (l'ho riscritto come mi hai suggerito, sperando di aver capito cosa intendevi :-) )

#include <16f876.h>

#use delay(clock=20000000)

#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7)

#BYTE spbrg = 0x00

#BYTE RCREG = 0x00

#BIT brgh = 0x0b.2

#BIT sync = 0x0b.4

#BIT spen = 0x0b.7

#BIT tx9 = 0x0b.6

#BIT rx9 = 0x0b.6

#BIT txen = 0x0b.5

#BIT cren = 0x0b.4

#BIT sren = 0x0b.5

#BIT txie = 0x0b.4

#BIT rcie = 0x0b.5

#BIT RCIF = 0x0b.5

#BIT TXIF = 0x0b.4

void main()

{

int16 i;

SET_TRIS_A(0b00001000);

SET_TRIS_B(0x00);

output_high(PIN_A2);

output_high(PIN_A1);

delay_us(150);

for(i=0;i<200;i++)

{

output_high(PIN_A0);

delay_us(400);

output_low(PIN_A0);

delay_us(400);

}

delay_ms(3000);

while(TRUE)

{ output_low(PIN_B7);

output_high(PIN_B7); }

}

il motore fa il primo mezzo giro e poi, invece di fermarsi nel while, continua a fare altri mezzi giri!

non so davvero come spiegarmelo!

grazie mille per qls suggerimento

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...