Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Problema pilotaggio servomotori

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[11] Re: Problema pilotaggio servomotori

Messaggioda Foto UtenteLelettrico » 1 mag 2012, 12:18

io mando il carattere 'a' al che la variabile Apri va 1 e poi nel main se Apri = 1 continua ad eseguire Apri_Porta(); cosi che continui a generare impulsi

Ok, piu' il tempo che la seriale aspetta come ti faceva notare [user]gohan[/user] ... ma quando lo riporti a zero :?: Mi sembra di capire che hai una sola variabile o non riporti il programma completo :?:

Il servo HS311 sarebbe centrato a 1500 uS, per avere l'orario di 40 gradi si va da 1500 a 2500 invece per l'antiorario si va da 1500 a 500 uS (onda quadra piu' o meno).

Semplicemente tu SEI GIA' nel posto dove dovresti essere, ecco il debole rumore e niente altro ...
Se delicatamente forzi il servo in una delle due direzioni e poi attivi il programma, si muove riportandosi alla posizione?
Avatar utente
Foto UtenteLelettrico
2.458 1 4 6
Master
Master
 
Messaggi: 1108
Iscritto il: 13 set 2010, 12:24

0
voti

[12] Re: Problema pilotaggio servomotori

Messaggioda Foto Utentealle588 » 1 mag 2012, 12:20

questo è il codice!!!

Codice: Seleziona tutto
//*************************************************
//
// modulo: main.c
// autore: Alessandro Manfredi
// data inizio: 18/01/2012
// descrizione: trasmissione seriale
// picmicro: PIC16F876A
// clock: 20MHz
//
//*************************************************

#define  XTAL_FREQ 20MHZ // questo Ë utilizzato dalle routine di ritardo contenute in Delay.C


#include <PIC.h> // contiene i nomi mnemonici di registri e porte
#include <stdio.h>
#define BAUD 9600
#define FOSC 20000000L
#define NINE 0
#define Servo1 RB0
//static bit Servo1 @ ((unsigned)&PORTB*8+0);

__CONFIG (HS & WDTDIS & PWRTEN & BORDIS & LVPDIS & DUNPROT & WRTEN & DEBUGDIS & UNPROTECT);



#include "RS232.h"
#include "delay.h" // routine per ritardi



unsigned char Carattere;

void interrupt isr ( void );
void Putch ( unsigned char byte );
unsigned char Getch ( );
void Apri_Porta ();
void Chiudi_Porta();
void Servo_A_Zero();
void Rileva_Temperatura();


int Apri , Chiudi , Zero;


void settings ( void  )
{
   PORTA = 0;
    TRISA = 0b00000000;  // per lm35

   PORTB = 0;
   TRISB = 0;
//   option_reg = 0x80;
    //TRISB = 1;//


   PORTC = 0;
    TRISC = 0x30; //0b11000000;  // Trasmissionr Seriale

   GIE = 1; // Gestione degli interupt ATTIVA
   PEIE = 1; // Interrupt di periferica attivata
   RCIE = 1; //Interrupt su Seriale attivo
   ADCON1 = 0b10000000;
   ADCON0 = 0b10001001;  //
   //ADRESL = 0;  // per temperaturs
   //ADRESH = 0;  // per temperatura
   
   Apri = 0;
   Chiudi = 0;
   Zero = 0;

}




// funzione principale, eseguita all'avvio del picmicro
void main(void)
   {

   
   settings();
   init_comms();
   
   
   while(1)
        {
   
      
         
         if ( Apri == 1 ){ Apri_Porta();  }
          if ( Chiudi == 1 ) { Chiudi_Porta();  }
         if ( Zero == 1 ){ Servo_A_Zero();  }
      
      
      
      
      }
   
   }


void interrupt isr ( void )
{
   
   if ( RCIF)
   {
      
      Carattere = Getch();
      
      switch ( Carattere )
      {
         case 'a':
             
            Apri = 1;
            Chiudi = 0;
            Zero = 0;
            break;

         case 'b':
            Apri = 0;
            Chiudi = 0;
            Zero = 1;
            Putch('b');
                break;

         case 'c':
            Apri = 0;
            Chiudi = 1;
            Zero = 0;
             break;

         case 'd':
            Rileva_Temperatura ( );
            break;

         case 'e':
            break;
         case 'f':
            break;
         default:
            Putch('\0');
            break;

      }
         
    }
   //RCIF = 0;

}

void Putch (  char byte )
{
   while ( !TXIF )
      continue;
   
    TXREG = byte;
}

unsigned char Getch ( )
{
   while ( !RCIF )
      continue;
   
   return RCREG;
}   

void Rileva_Temperatura ( )
{
   int Temp;
   char Temp2;

   DelayMs(20);
   
   ADGO = 1;
   
   while ( ADGO )
      continue;
   
   Temp = ADRESL + ( ADRESH << 8 ) ;
   
   
   
   Temp2 = (char) Temp;
   
   Putch ( Temp2 );
   //Putch('1');
   
   return;
}

void Apri_Porta ()
{
      
   
      Servo1 = 1;
      DelayUs ( 90 );
       Servo1 = 0;
      DelayUs( 1910 );

   return;
}


void Chiudi_Porta()
{
       
   
         Servo1 = 1;
         DelayUs ( 210 )
          Servo1 =0;
         DelayUs(1790);   
      

   return;
}

void Servo_A_Zero()
{
      
      Servo1 = 1;
      DelayUs ( 150 );
       Servo1 = 0;
      DelayUs(1850);   

   return;
}
Avatar utente
Foto Utentealle588
0 1 2
 
Messaggi: 16
Iscritto il: 3 feb 2012, 10:21

0
voti

[13] Re: Problema pilotaggio servomotori

Messaggioda Foto UtenteLelettrico » 1 mag 2012, 12:40

E' getch ()

getch() is a function which has its protype defined in conio.h header file.
it is basically used to take input a single characterfrom keyboard. and this char is not displayed at the screen.
it waits until itn gets a input that's why it can be used as a screen stopper.

Read more: http://wiki.answers.com/Q/Why_you_use_g ... z1tc5ZI2vj



Cosa dice il tuo manuale del compilatore?
Avatar utente
Foto UtenteLelettrico
2.458 1 4 6
Master
Master
 
Messaggi: 1108
Iscritto il: 13 set 2010, 12:24

0
voti

[14] Re: Problema pilotaggio servomotori

Messaggioda Foto Utentealle588 » 1 mag 2012, 14:57

serve per prendere un caratere in arrivo dalla seriale!!!la seriale funziona l'ho provata mille volte
Avatar utente
Foto Utentealle588
0 1 2
 
Messaggi: 16
Iscritto il: 3 feb 2012, 10:21

0
voti

[15] Re: Problema pilotaggio servomotori

Messaggioda Foto UtenteLelettrico » 1 mag 2012, 15:02

Eh .. .si ma forse non l'hai compresa benissimo, cosa dice il manuale del compilatore che usi?
Di solito:
it waits until it gets a input that's why it can be used as a screen stopper.


getch () aspetta fino a quando non riceve un input, ecco perche viene usata come "stoppa schermo"
In altre parole (ma dipende dal tuo compilatore) getch() ferma il programma che riprende solo dopo che si sia premuto un tasto ... almeno ...
Quindi mandi un solo impulso ogni volta e solo se premi un carattere sulla tastiera.
Il metodo corretto e' generare il segnale servo da interrupt :arrow: con priorita' maggiore di quella seriale e leggere su un buffer comune il valore delle variabili di stato.
Avatar utente
Foto UtenteLelettrico
2.458 1 4 6
Master
Master
 
Messaggi: 1108
Iscritto il: 13 set 2010, 12:24

0
voti

[16] Re: Problema pilotaggio servomotori

Messaggioda Foto Utentealle588 » 1 mag 2012, 15:07

la seriale viene generata da interrupt quindi getch() non aspetta niente perché è sicuro che c'è qualcosa nei registri appositi !!!ho smacchinato un po e adesso funziona!!sbagliavo i tempi del duty!!!cmnq grazie mille lo stesso!!!un ultima cosa...dovrei usare anche la tastiera a matrice solo che con quella mi rallenta molto il programma per il fatto che devo scorrere righe e colonne ad ogni giro di main e quindi il servo ruota molto piu lentamente...conoscete un meccanismo per far si che la tastiera venga gestita solo quando premo un pulsante e non ad ogni giro di main?
Avatar utente
Foto Utentealle588
0 1 2
 
Messaggi: 16
Iscritto il: 3 feb 2012, 10:21

Precedente

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 5 ospiti