Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Problema servocomando

Elettronica lineare e digitale: didattica ed applicazioni

Moderatori: Foto UtenteDirtyDeeds, Foto UtenteIsidoroKZ, Foto UtenteBrunoValente, Foto Utentecarloc, Foto Utenteg.schgor

0
voti

[21] Re: Problema servocomando

Messaggioda Foto Utentec1b8 » 11 nov 2013, 0:36

E' giusto, strano che giri tutto da un lato.
Puoi postare tutto il codice che stai utilizzando adesso?
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[22] Re: Problema servocomando

Messaggioda Foto Utentefantamed » 11 nov 2013, 10:19

settaggio: i pulsanti 1-2-3 sono collegati in pull-up
Codice: Seleziona tutto
#define N1    RB0     
#define PL1    RB1    // puls1
#define PL2    RB2    // puls2
#define SER    RB3    //segnale servo
#define LED    RA0    //led rete
#define N3    RB5
#define N4    RB6
#define N5    RB7 
#define N6    RA1
#define N7    RA2
#define PL3   RA4     //puls3
#define N2    RB4
#define N8    RA3
#define  XTAL_FREQ 4MHZ
int i;

void settaggio(void)
{   
                OPTION=0b10000000;
   TRISA=0b00010000;           
   TRISB=0b00000110;
    N1=0;
    N2=0;   
    LED=0;
    SER=0;
    N3=0;   
    N4=0;   
    N5=0;   
    N6=0;   
    N7=0;   
    N8=0;       
   
}


programma:

Codice: Seleziona tutto
#include <PIC.h> // contiene i nomi mnemonici di registri e porte
__CONFIG (XT & WDTDIS & PWRTEN & UNPROTECT);
#include "settaggioservo.h" // file che contiene il settaggio delle porte
#include "delay.c"
void main(void)
{
   settaggio();
   
  while(1)
   {
   
             LED=1;            // accendo led
             SER=1;            // segnale livello alto 1
          for (i=0;i<6;i++)
             {                                           
              DelayUs(250);      //attesa  1.5 millisec. (per posizione centrale)
              }               
             SER=0;              // segnale livello basso 0
          for (i=0;i<74;i++)
              {
               DelayUs(250);     // attesa 18,5 millisec.
              }     
   }

}



Buona giornata
Avatar utente
Foto Utentefantamed
30 5
Frequentatore
Frequentatore
 
Messaggi: 110
Iscritto il: 8 nov 2013, 13:44

0
voti

[23] Re: Problema servocomando

Messaggioda Foto Utentec1b8 » 11 nov 2013, 13:45

Mi puoi postare anche il sorgente del delay.c ?
Grazie.
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[24] Re: Problema servocomando

Messaggioda Foto Utentefantamed » 11 nov 2013, 13:57

Delay.c

Codice: Seleziona tutto
/*
*   Delay functions
*   See delay.h for details
*
*   Make sure this code is compiled with full optimization!!!
*/

#include   "delay.h"
//unsigned char cnt;
void
DelayMs(unsigned char cnt)
{
#if   XTAL_FREQ <= 2MHZ
   do {
      DelayUs(996);
   } while(--cnt);
#endif

#if    XTAL_FREQ > 2MHZ   
   unsigned char   i;
   do {
      i = 4;
      do {
         DelayUs(250);
      } while(--i);
   } while(--cnt);
#endif
}


Avatar utente
Foto Utentefantamed
30 5
Frequentatore
Frequentatore
 
Messaggi: 110
Iscritto il: 8 nov 2013, 13:44

0
voti

[25] Re: Problema servocomando

Messaggioda Foto Utentec1b8 » 11 nov 2013, 14:34

Allora, ho provato e quelle delay con funzionano proprio. Quale sia il motivo non te lo so dire, ma il tempo di esecuzione è circa 3 volte quello che ci si aspetta. Un DelayUs(250) in realtà dura circa 750 us.
Forse la versione lite del compilatore che sto utilizzando e che non ottimizza?

Ci sono due soluzioni:
- ti riscrivi tu le delay in modo che funzionino come ci si aspetta
- utilizzi un timer e relativo interrupt per dettare i tempi

Personalmente preferisco di gran lunga la seconda. Il mio .hex lavora con l'interrupt.
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[26] Re: Problema servocomando

Messaggioda Foto Utentefantamed » 11 nov 2013, 15:46

non ho ben capito:
c1b8 ha scritto:Allora, ho provato e quelle delay con funzionano proprio. Quale sia il motivo non te lo so dire, ma il tempo di esecuzione è circa 3 volte quello che ci si aspetta. Un DelayUs(250) in realtà dura circa 750 us.Forse la versione lite del compilatore che sto utilizzando e che non ottimizza?


la delay e giusta ma non funziona?
Forse la versione lite del compilatore che sto utilizzando e che non ottimizza?

Come dicevo all'inizio sto imparando come autodidatta, le delay.c e delay.h che utilizzo le ho prese dalla rete e purtroppo non sono ancora in grado di farmene una da solo.

Una modifica:mi si e spezzato un pin del quarzo da 4mhz che utilizzavo,lo ho sostituito con un quarzo che credo sia anche lui da 4 MHz e di tipo basso con su scritto S4B000D3 non vorrei che fosse proprio quel D3 il motivo delle circa 3 volte inaspettate.
Teni conto che con il tuo .HEX e questo quarzo il servo funziona. (forse con tempi diversi ma funziona Puo essere :?:)

Un'altra prova che voglio fare e sostitire il quarzo da 4Mhz con uno che andro ad acquistare presto e che sia 4mhz sicuri.
Posso permettermi di inviarti una richiesta in mp?
O_/ Buona Giornata
Avatar utente
Foto Utentefantamed
30 5
Frequentatore
Frequentatore
 
Messaggi: 110
Iscritto il: 8 nov 2013, 13:44

0
voti

[27] Re: Problema servocomando

Messaggioda Foto Utentec1b8 » 11 nov 2013, 18:54

Anche a me quelle delay funzionano male, quindi non è colpa del quarzo.
Avevo preso le stesse delay anch'io in rete e visto che a me non funzionavano ho chiesto le tue delay pensando potessero essere diverse, ma sono le stesse e con lo stesso risultato.

Ho fatto qualche ricerca ed alla fine ho trovato delle delay che sembrano funzionare molto meglio.
Ti allego un file zip con tutti i file che ho utilizzato per eseguire la prova e sembra andare molto meglio.

Servo_84.zip
(5.16 KiB) Scaricato 27 volte
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[28] Re: Problema servocomando

Messaggioda Foto Utentefantamed » 12 nov 2013, 1:30

halways.h che file e ? devo includere anche lui tra gli header ?
Avatar utente
Foto Utentefantamed
30 5
Frequentatore
Frequentatore
 
Messaggi: 110
Iscritto il: 8 nov 2013, 13:44

0
voti

[29] Re: Problema servocomando

Messaggioda Foto Utentec1b8 » 12 nov 2013, 11:38

E' un file utilizzato dalle routine di delay, viene già incluso dagli altri file.
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[30] Re: Problema servocomando

Messaggioda Foto Utentefantamed » 12 nov 2013, 14:54

:ok: grazie mille per tutto
ho fatto qualche modifica ai delay per far arrivare il servo a finecorsa
sembrerebbe che funziona
Potresti provarlo anche tu?
il codice:
Codice: Seleziona tutto
#define SER1  RB0                 //segnale servo1
#define PL1    RB1                // puls1
#define PL2    RB2               // puls2
#define SER2  RB3              //segnale servo2
#define LED   RA0              //led rete
#define N3     RB5
#define N4    RB6
#define N5    RB7
#define N6    RA1
#define N7    RA2
#define PL3   RA4                 //puls3
#define N2    RB4
#define N8    RA3

#define  XTAL_FREQ 4MHZ
#define  _XTAL_FREQ 4MHZ

unsigned char i;
int a=1;

unsigned char m;
void settaggio(void)
{   
   OPTION=0b10000000;
   TRISA=0b00010000;           
   TRISB=0b00000110;
   N2=0;   
   LED=0;
   SER1=0;
    SER2=0;
   N3=0;   
   N4=0;   
   N5=0;   
   N6=0; 
   N7=0;   
   N8=0;
     
}


Codice: Seleziona tutto
#include <PIC.h> // contiene i nomi mnemonici di registri e porte

__CONFIG(0x3FF9);

#define PIC_CLK 4000000 //4Mhz


#include "delay.c"
#include "settaggioservo.h" // file che contiene il settaggio delle porte


void main(void)
{
   settaggio();
   DelayUs(100);

      while(a)
         {   
          for (m=0;m<30;m++)
            {
             LED=1;                                     // accendo led
             SER1=1;                                  // segnale livello alto 1     
            for (i=0;i<6;i++)
                {                                           
                DelayUs(250);                     //attesa  1.5 millisec. (per posizione centrale)
                }               
              SER1=0;                               // segnale livello basso 0         
            for (i=0;i<74;i++)
                {
                DelayUs(250);                     // attesa 18,5 millisec.
                }               
             }
          LED=0;                                  //spengo led
          a=0;                                    //esco dal ciclo while(a)
        }
      while(1)
         {       
          if(PL1==0)                            //se premo pulsante 1
              {             
              LED=1;                            //accendo led
              SER1=1;                          // segnale livello alto 1
              for (i=0;i<21;i++)
                 {                                           
                  DelayUs(100);             //attesa  2.1 millisec.
                 }                           
              SER1=0;                         // segnale livello basso 0         
              for (i=0;i<180;i++)
                 {                                           
                  DelayUs(99);              //attesa  17.9 millisec.                  }                                                       
              }
           else{LED=0;}                   //altimenti spengo led   
          if(PL2==0)                        //se premo pulsante 2
              {         
              LED=1;                         //accendo led
              SER1=1;                      // segnale livello alto 1 
              for (i=0;i<6;i++)
                 {                                           
                  DelayUs(100);         //attesa  0.6 millisec.
                 }                                                   
              SER1=0;                     // segnale livello basso 0                               
              for (i=0;i<194;i++)
                 {                                           
                  DelayUs(100);        // attesa 19.4 millisec.
                 }                     
              }
           else{LED=0;}                 //altrimenti spengo led
          if(PL3==0)                    //se premo pulsante 3
              {             
               LED=1;                    // accendo led
               SER1=1;                   // segnale livello alto 1           
               for (i=0;i<6;i++)
                  {                                           
                  DelayUs(250);       //attesa  1.5 millisec. (per posizione centrale)
                  }               
               SER1=0;                   // segnale livello basso 0         
               for (i=0;i<74;i++)
                  {
                   DelayUs(250);      // attesa 18,5 millisec.
                  }                           
              }                       
            else{LED=0;}
       }
   a=0;
}

Se hai qualche consiglio ancora in merito per sistemare il programma,bacchettami pure :mrgreen:
#-o come si fa per darti il voto nel forum?
Vorrei chiederti se potresti inviarmi il programma del .hex che mi hai postato(quello dei 4 servi)
cosi se riesco me lo studio per benino.
O_/ alla prossima
Buona giornata ;-)
Avatar utente
Foto Utentefantamed
30 5
Frequentatore
Frequentatore
 
Messaggi: 110
Iscritto il: 8 nov 2013, 13:44

PrecedenteProssimo

Torna a Elettronica generale

Chi c’è in linea

Visitano il forum: Google [Bot] e 32 ospiti