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 Utenteg.schgor, Foto UtenteIsidoroKZ, Foto UtenteBrunoValente, Foto Utentecarloc

0
voti

[121] Re: Problema servocomando

Messaggioda Foto Utentefantamed » 26 nov 2013, 23:57

messo il valore 178 all'interrupt maggiore di 3,ma vibra sempre
Perdonami per fluido cosa intendi?
Avatar utente
Foto Utentefantamed
30 5
Frequentatore
Frequentatore
 
Messaggi: 110
Iscritto il: 8 nov 2013, 13:44

0
voti

[122] Re: Problema servocomando

Messaggioda Foto Utentefantamed » 27 nov 2013, 0:02

volevo far si che quando premo i pulsanti si accenda il led quando lascio si spenga il led,ho provato cosi :
Codice: Seleziona tutto
  DelayMs(10);
      if (PL1==0)   setServo(1, getServo(1)+1),LED=1;
      else  {LED=0;}
      if (PL2==0)   setServo(1, getServo(1)-1),LED=1;
      else  {LED=0;}
      if (PL3==0)   setServo(2, getServo(2)+1),LED=1;
      else  {LED=0;}
      if (PL4==0)   setServo(2, getServo(2)-1),LED=1;
      else  {LED=0;}

succede pero che solo PL4 accende quando premo e spegne quando lascio,PL1,PL2,PL3 lo fanno ma con il led che si vede appena appena.
La causa dovrebbero essere i 10 ms che gli fanno da attesa? ma perché PL4 funziona?
Avatar utente
Foto Utentefantamed
30 5
Frequentatore
Frequentatore
 
Messaggi: 110
Iscritto il: 8 nov 2013, 13:44

0
voti

[123] Re: Problema servocomando

Messaggioda Foto Utentec1b8 » 27 nov 2013, 0:47

Su pl4 funziona perché è l'ultimo if e quindi non entra nella else. Con gli altri pulsanti entra almeno una volta in un else successivo che spegne il led.
Devi togliere tutte le else e spegnere il led solo 1 volta subito dopo il delay.

Strano che vibri ancora. Forse devi aumentare il valore left di 1 o 2.

Per fluido intendo che il movimento è lento ma continuo, non a scatti.
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

[124] Re: Problema servocomando

Messaggioda Foto Utentefantamed » 27 nov 2013, 20:01

ciao,ho modificato il valore di left come mi hai detto e facendo un po di prove anche con altri valori ma vibra sempre
Il movimento e fluido :ok:
Avatar utente
Foto Utentefantamed
30 5
Frequentatore
Frequentatore
 
Messaggi: 110
Iscritto il: 8 nov 2013, 13:44

0
voti

[125] Re: Problema servocomando

Messaggioda Foto Utentec1b8 » 27 nov 2013, 22:51

ok,quindi rimane solo il problema della vibrazione a fine corsa, giusto?

Direi di fare 2 prove:
1) hai scritto prima che sei riuscito a recuperare altri 2 servo, questi hanno lo stesso problema di vibrazione?
2) modificherei i limiti in questo modo:
Codice: Seleziona tutto
        #define valueLeft   222               // posizione dx 90°
        #define valueRight   102                // posizione sx 90°
        #define valueCenter   162             // posizione centrale


Fammi sapere.
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

[126] Re: Problema servocomando

Messaggioda Foto Utentefantamed » 28 nov 2013, 0:12

si rimane solo il problema della vibrazione,ho fatto la prova con gli altri servo ed e la stessa cosa,con quei valori vibra lo stesso,ho provato con altri valori sempre vicini,ma niente.
Avatar utente
Foto Utentefantamed
30 5
Frequentatore
Frequentatore
 
Messaggi: 110
Iscritto il: 8 nov 2013, 13:44

0
voti

[127] Re: Problema servocomando

Messaggioda Foto Utentec1b8 » 28 nov 2013, 0:16

OK, bisogna fare qualche modifica al programma... lo preparo e poi te lo posto, non so però se ci riesco questa sera.
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

[128] Re: Problema servocomando

Messaggioda Foto Utentefantamed » 28 nov 2013, 0:28

figurati fabio,quando hai tempo :ok:
Grazie Buonanotte
Avatar utente
Foto Utentefantamed
30 5
Frequentatore
Frequentatore
 
Messaggi: 110
Iscritto il: 8 nov 2013, 13:44

0
voti

[129] Re: Problema servocomando

Messaggioda Foto Utentec1b8 » 28 nov 2013, 11:06

Ciao, ho fatto qualche modifica al software, non molto per la verità perché mi è sorto un dubbio.
E se per destra e sinistra intendiamo posizioni diverse?
Volevo quindi chiarire per essere sicuro di parlare dello stesso verso di rotazione.
Facendo riferimento al servo1 e tenendo premeto PL1, il servo si sposta a sinistra o a destra?

Per il momento ho modificato la sola routine di interrupt perché mi sono accorto di un problema.
Ti posto questa, così la provi e mi dici per ora come va.

In settaggioservo.h ho aggiunto questa riga
Codice: Seleziona tutto
   #define valuePausa      178             // valore per pausa di 1250us


Quindi la nuova routine di interrupt
Codice: Seleziona tutto
   void interrupt ISR (void)
   {
      if (T0IF==1)                              // se si e verificato un'interrupt
      {                             
         if (intNumber<byteIntTime) {     
            SER1=0;                             //azzero servo1
            SER2=0;                             // azzero servo2
            if (intTime[intNumber]==0) intNumber++;
            TMR0=intTime[intNumber];            //assegno il tiemr0
            
            if (intNumber==0) SER1=1;           // se siamo nel primo periodo
            if (intNumber==2) SER2=1;           // se siamo nel secondo periodo
         }
         if (intNumber>=byteIntTime) {          // se il numero di interrupt e magg.o uguale a 4   
            TMR0=valuePausa;                           // imposto il timer0 a valuePausa
         }                   
         intNumber++;                           //incremento di 1 il numero di interrupt
         if (intNumber==maxIntNumber)           // se gli interrupt sono arrivati a 16
            intNumber=0;                           // azzero il conteggio degli interrupt per ricontare da 0
         T0IF=0;                                //  azzero il flag per nuovo interrupt
      }
   }


Fammi sapere se la modifica cambia qualche comportamento e da che parte si sposta il servo con PL1 premuto.
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

[130] Re: Problema servocomando

Messaggioda Foto Utentefantamed » 28 nov 2013, 12:03

se premo PL1 servo1 si muove a dx
Il servo vibra quando premo PL2 servo1 tutto a sx ,e PL4 servo2 tutto a sx.
Modificato il software ma vibra sempre,adesso il codice e questo:
Codice: Seleziona tutto
#include <PIC.h>       // contiene i nomi mnemonici di registri e porte

__CONFIG(0x3FF9);      //configurazione fuses

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

void interrupt ISR (void)
   {
      if (T0IF==1)                              // se si e verificato un'interrupt
      {                             
         if (intNumber<byteIntTime) {     
            SER1=0;                             //azzero servo1
            SER2=0;                             // azzero servo2
            if (intTime[intNumber]==0) intNumber++;
            TMR0=intTime[intNumber];            //assegno il tiemr0
           
            if (intNumber==0) SER1=1;           // se siamo nel primo periodo
            if (intNumber==2) SER2=1;           // se siamo nel secondo periodo
         }
         if (intNumber>=byteIntTime) {          // se il numero di interrupt e magg.o uguale a 4   
            TMR0=valuePausa;                           // imposto il timer0 a valuePausa
         }                   
         intNumber++;                           //incremento di 1 il numero di interrupt
         if (intNumber==maxIntNumber)           // se gli interrupt sono arrivati a 16
            intNumber=0;                           // azzero il conteggio degli interrupt per ricontare da 0
         T0IF=0;                                //  azzero il flag per nuovo interrupt
      }
   }




void setServo(unsigned char servo, unsigned char time)   //Routine per movimento servo
{
   if (time>valueLeft) time=valueLeft;          // controllo che non vengano impostati valori oltre i limiti previsti
   if (time<valueRight) time=valueRight;        // controllo che non vengano impostati valori oltre i limiti previsti
     
   servo--;                              // decremento servo di 1 quindi da 2 diventa 1
   servo=servo<<1;                       // assegno a servo il valore di servo con shift a sinistra cioe diventa 2
   intTime[servo]=time;                  // salvo il tempo Ton richiesto nella posizione dell'interrupt
   servo++;                              // incremento servo di 1
   intTime[servo]=356-time;              //Calcolo (356-time) e salvo il temponecessario a completare 2500us
                                                         // per il servo
}
 
   unsigned char getServo(unsigned char servo)
   {
      servo--;                    // decremento servo di 1
      servo=servo<<1;            // moltiplico per 2
      return intTime[servo];     // ritorno posizione attuale
   }

void main(void)
{
   settaggio();
   
   setServo(1, valueCenter);         // inizio con il servo1 in posizione tutto dx
   setServo(2, valueCenter);        // inizio con il servo2 in posizione centrale
   while(1)
{
   
      DelayMs(10);
      LED=0;
      if (PL1==0)   setServo(1, getServo(1)+1),LED=1;   
      if (PL2==0)   setServo(1, getServo(1)-1),LED=1;     
      if (PL3==0)   setServo(2, getServo(2)+1),LED=1;   
      if (PL4==0)   setServo(2, getServo(2)-1),LED=1;
     
   }

}


settaggio:
Codice: Seleziona tutto
#define PL1    RB0    // puls1
#define PL2    RB1    // puls2
#define PL3    RB2    // puls3
#define PL4    RB3    // puls4
#define LED    RA0    //led rete
#define SER1   RB4    //segnale servo 1
#define SER2   RB6    //segnale servo 2
#define numServo   2                  //  imposto che i servo sono 2
#define byteIntTime   numServo*2      //  imposto i byte di IntTime a 4 che sono i primi 4 periodi per il movimento dei servo ,e cosi? il segno * è un per(x) ?
#define maxIntNumber   byteIntTime*4  // imposto a 16 il numero max di interrupt per ottenere i 20ms per il segnale
#define valueLeft   222               // posizione dx 90°
#define valueRight   102               // posizione sx 90°
#define valueCenter   162             // posizione centrale
#define valuePausa      178             // valore per pausa di 1250us
#define PIC_CLK 4000000
volatile unsigned char intNumber;   //dichiaro la variabile volatile (cioe che puo essere modificata sia dall'interrupt che dal programma) di tipo char per il conteggio interrupt
volatile unsigned char intTime[byteIntTime];  //dichiaro un'array volatile di tipo char,di dimensione 4 
void settaggio(void)
{   
   OPTION=0b10000011;
   INTCON=0b10100000;
   TRISA=0b00011110;   
   TRISB=0b00001111;
   PORTB=0;                                         
   LED=0;
   SER1=0;
   SER2=0;

   TMR0=131;       // assegno al timer0 il valore 131 ,ovvero mmancano 125 cicli dei 256 per andare in overflow     
   intNumber=0;    // assegno alla variabile di conteggio intrrupt il valore  0
   
}

Buona giornata O_/
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: Nessuno e 51 ospiti