Corregir desfase entre señal de entrada y señal de salida

Hola a ver si me podeis ayudar. Tengo una señal que entra a mi arduino atraves de un pin digital y esa misma señal la saco por otro pin digital, pero se dibuja en el osciloscopio con un desfase de unos 40us. Este desfase entre la señal de entrada y la de salida, me produce ruido en la señal de salida ya que tengo conectado un servo a dicho pin y no deja de temblar.

He realizado una prueba para ver si realmente el causante del ruido es el desfase y creo que asi es.

Veamos, tengo un programa hecho para mi proyecto, que es el que me da el problema y tengo un tiempo de loop de aproximadamente el desfase que he indicado anteriormente. Pues bien, he creado un nuevo programa de prueba en el que solo leo y escribo la señal sin ningun tipo de procesado utilizando digitalRead() para la lectura y digitalWrite() para la escritura y el ruido es practicamente despreciable, por eso, he llegado a la conclusion de que el fallo esta en el desfase de la señal que entra y la que sale, eso es lo que hace que el servo no deje de temblar.

Alguien me puede ayudar a corregir este desfase.

Adjunto una imagen del osciloscopio donde se puede ver dicho desfase.

https://mega.nz/#!mR1lXLSI!-GdwfsQ75gelc4BBoY_viZuWw8QrRGRoYGow696dhBE

Bukanan: Hola a ver si me podeis ayudar. Tengo una señal que entra a mi arduino atraves de un pin digital y esa misma señal la saco por otro pin digital, pero se dibuja en el osciloscopio con un desfase de unos 40us. Este desfase entre la señal de entrada y la de salida, me produce ruido en la señal de salida ya que tengo conectado un servo a dicho pin y no deja de temblar.

He realizado una prueba para ver si realmente el causante del ruido es el desfase y creo que asi es.

Veamos, tengo un programa hecho para mi proyecto, que es el que me da el problema y tengo un tiempo de loop de aproximadamente el desfase que he indicado anteriormente. Pues bien, he creado un nuevo programa de prueba en el que solo leo y escribo la señal sin ningun tipo de procesado utilizando digitalRead() para la lectura y digitalWrite() para la escritura y el ruido es practicamente despreciable, por eso, he llegado a la conclusion de que el fallo esta en el desfase de la señal que entra y la que sale, eso es lo que hace que el servo no deje de temblar.

Alguien me puede ayudar a corregir este desfase.

Adjunto una imagen del osciloscopio donde se puede ver dicho desfase.

https://mega.nz/#!mR1lXLSI!-GdwfsQ75gelc4BBoY_viZuWw8QrRGRoYGow696dhBE

pon el codigo!

ahi va. . .

/////// DEFINICION DE PINES ENTRADA / SALIDA ///////////
const int Pin_in_ch1 = 2; // Pin entrada ch1 (direccion)
const int Pin_in_ch2 = 3; // Pin entrada ch2 (traccion)
const int Pin_out_ch1 = 7; // Pin entrada ch1 (direccion)
const int Pin_out_ch2 = 6; // Pin entrada ch2 (traccion)
/////////////////////////////////////////////////////////

float Tmicro = 0.064; // CTE DE TIEMPO

 
/////////// VARIABLES CH1 //////////////
char giro = 0;
char giro_ant = 0;
unsigned int Tini_giro = 0;
unsigned int Tini_giro_ant = 0;
unsigned int Tact_giro = 0;
unsigned int cuentas_T_giro = 0;
unsigned int cuentas_duty_giro = 0;
boolean periodo_giro_OK = 0;
boolean duty_giro_OK = 0;
float T1 = 0.0;
float Duty_giro = 0.0;
boolean ch1_ok = 0;
unsigned int periodo_giro = 0;
unsigned int duty_giro = 0;
boolean validar_periodo_giro = 0;
boolean validar_duty_giro = 0;
////////////////////////////////////////


///////// VARIABLES CH2 //////////////
char trac = 0;
char trac_ant = 0;
unsigned int Tini_trac = 0;
unsigned int Tini_trac_ant = 0;
unsigned int Tact_trac = 0;
unsigned int cuentas_T_trac = 0;
unsigned int cuentas_duty_trac = 0;
boolean periodo_trac_OK = 0;
boolean duty_trac_OK = 0;
float T2 = 0.0;
float Duty_trac = 0.0;
boolean ch2_ok = 0;
unsigned int periodo_trac = 0;
unsigned int duty_trac = 0;
boolean validar_periodo_trac = 0;
boolean validar_duty_trac = 0;
//////////////////////////////////

//////// VARIABLES GENERACION PWM COCHE PROTOTIPO ////////////////////////////////////////
unsigned int ant_T_giro_coche = 0;
unsigned int ini_T_giro_coche = 0;
unsigned int ant_T_trac_coche = 0;
unsigned int ini_T_trac_coche = 0;
const int Tcoche = 277;  // cuentas equivalentes a al periodo(17.7 ms) del coche escala 1:8
int estado_giro = LOW;
int estado_trac = LOW;
unsigned int Duty_trac_coche = 0;
unsigned int cont_giro; // contador generar seañl giro
unsigned int cont_ant_giro; // contador generar seañl giro
unsigned int cont_trac; // contador generar señal traccion
//////////////////////////////////////////////////////////////////////////////////////////


////// VARIABLES TIEMPO EJECUCION ////////
unsigned long tini_loop = 0;
unsigned long tact_loop = 0;
unsigned long totalT_loop = 0;
//////////////////////////////////////////

int numLoops=0; // ESPACIADO PARA IMPRESION DE DATOS

boolean Estado_Joystick = 0;
unsigned int intervalo_validacion = 16000;
unsigned int tiempo_validacion = 0;

boolean  joystick_ON = 0;
unsigned long datoCH1 = 0;
unsigned long datoCH2 = 0;
boolean flag = 0;
unsigned long dato1 = 0;
unsigned int m = 0;

void setup() {

  Serial.begin(9600);
  
  pinMode(Pin_in_ch1,INPUT);
  pinMode(Pin_in_ch2,INPUT);
  pinMode(Pin_out_ch1,OUTPUT);
  pinMode(Pin_out_ch2,OUTPUT);
     
  TCCR1A = 0;
  //TCCR1B = 0;
  TCNT1 = 0;
  //TCCR1B = _BV(CS11); // prescaler 8 , nuevo periodo del micro 500e-9 (cuenta hasta 32.7 ms)
  //TCCR1B = _BV(CS11) | _BV(CS10)  ; // prescaler 64 , nuevo periodo del micro 4e-6 (cuenta hasta 262 ms)
  TCCR1B = _BV(CS12) | _BV(CS10)  ; // prescaler 1024 , nuevo periodo del micro 64e-6 (cuenta hasta 4 seg)
  
  Comprobar_Estado_Joystick();
 
}

void loop() {
 
  tini_loop = micros();
  
  Iniciar_Joystick();
  
  totalT_loop = micros() - tini_loop;
 
// if(++numLoops >= 2000)
 //{
   /*
    Serial.println("----------------------------------  ");
    Serial.println("           CH1               ");
    Serial.println("----------------------------------  ");
    Serial.print ("CUENTAS PERIODO GIRO: ");
    Serial.println (cuentas_T_giro);
    Serial.print ("PERIORO CH1 Ok: ");
    Serial.println (periodo_giro_OK);
    Serial.print ("PERIORO GIRO: ");
    Serial.println (T1);
    Serial.println("----------------------------------  ");
    Serial.print ("CUENTAS DUTY GIRO : ");
    Serial.println (cuentas_duty_giro);
    Serial.print (" DUTY CH1 OK : ");
    Serial.println (duty_giro_OK);
    Serial.print (" DUTY CYCLE GIRO : ");
    Serial.println (Duty_giro);
    Serial.print ("VALIDACION CH1: ");
    Serial.println (ch1_ok);
    Serial.println(" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  ");
    Serial.println("----------------------------------  ");
     */
    
    /*
 Serial.println("----------------------------------  ");
    Serial.println("           CH2               ");
    Serial.println("----------------------------------  ");
    Serial.print ("CUENTAS PERIODO TRACCION: ");
    Serial.println (cuentas_T_trac);
    Serial.print ("PERIORO CH2 Ok: ");
    Serial.println (periodo_trac_OK);
    Serial.print ("PERIORO TRACCION: ");
    Serial.println (T2);
    Serial.println("----------------------------------  ");
    Serial.print ("CUENTAS DUTY TRACCION : ");
    Serial.println (cuentas_duty_trac);
    Serial.print (" DUTY CH2 OK : ");
    Serial.println (duty_trac_OK);
    Serial.print (" DUTY CYCLE TRACCION : ");
    Serial.println (Duty_trac);
    Serial.print ("VALIDACION CH2: ");
    Serial.println (ch2_ok);
    Serial.println(" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  ");
    Serial.println("----------------------------------  ");
      */
      
    Serial.println("----------------------------------  ");
    Serial.print(" Periodo LOOP : ");
    Serial.print("  ");
    Serial.println(totalT_loop);
    Serial.println("----------------------------------  ");
    /*
    Serial.print(" ESTADO JOYSTICK (1 = ON) (0 = OFF) ) : ");
    Serial.print("  ");
    Serial.println(joystick_ON);
    
    Serial.print(" bandera ");
    Serial.println(flag);
    */
   // numLoops = 0;
   // }
  
}
void Comprobar_Estado_Joystick(){
  
  datoCH1 = pulseIn(Pin_in_ch1,HIGH);
  datoCH2 = pulseIn(Pin_in_ch2,HIGH);
  
  if(datoCH1 != 0 && datoCH2 != 0) // comprueba que hay señal antes de iniciar el el Joystick
  {
    joystick_ON = 1;
  }
  else
  {  
    joystick_ON = 0;
  }
  if(joystick_ON != 1){ // si no esta encendido sigue comprobando hasta que este encendido
    
  datoCH1 = 0;
  datoCH2 = 0;

    
    Comprobar_Estado_Joystick();
    }
    else{
      Iniciar_Joystick();
      }
   
}
void Iniciar_Joystick(){
  
  Leer_Ch1(); // lee el canal 1 (direccion vehiculo)
  Leer_Ch2(); // lee el canal  (traccion vehiculo)
  Validar_Estado_Ch1(); // valida estado canal
  Validar_Estado_Ch2(); 
  
  
  
  }
void Leer_Ch1(){
  
  giro = digitalRead(Pin_in_ch1);
  
  if (giro != giro_ant)
  {
    if(giro)
    {
      Tini_giro = TCNT1;
      cuentas_T_giro = (Tini_giro - Tini_giro_ant);
      Tini_giro_ant = Tini_giro;
      Comprobar_Periodo_Ch1();
    }
    else
    {
      Tact_giro = TCNT1;
      cuentas_duty_giro = (Tact_giro - Tini_giro);
      Comprobar_Duty_Ch1();
    }
    giro_ant = giro;
  }
  
}
void Comprobar_Periodo_Ch1(){
    
////////// VERIFICACION PERIODO CH1 ////////////////7

  if(cuentas_T_giro >= 240 && cuentas_T_giro <= 260)// se comprueba que hay un periodo valido
  {
    periodo_giro++; //contabiliza periodos validos
    T1 = cuentas_T_giro * Tmicro; // calculo del periodo en tiempo
  }
  else 
  {
    T1 = 0.0;
  }
  
   if(periodo_giro >= 100) // validacion de periocidada de la señal durante poco mas de 1 seg
  {
    periodo_giro_OK = 1;
  }
  else
  {
    periodo_giro_OK = 0;
  }

}
///////////// VEREFICIACION DUTY-CYCLE CH1 //////////////

void Comprobar_Duty_Ch1() {
  
  if(cuentas_duty_giro >= 15  && cuentas_duty_giro <= 33) //se comprueba que hay duty-cycle de giro validos
  {
    duty_giro++; // contabiliza duty-cycle validos de giro
    Duty_giro = cuentas_duty_giro *  Tmicro;  // calculo duty-cycle giro en tiempo
  }
  else
  {
    //cuentas_duty_giro = 0;
    Duty_giro = 0.0;
  }
  
  if (duty_giro >= 100) // validacion de que hay ciclos de trabajos de giro validos durante poco mas de 1 seg
  {
    duty_giro_OK = 1;
  }
  else
  {
    duty_giro_OK = 0;
  }

  
  
}
void Validar_Estado_Ch1(){
  
 
  if(periodo_giro_OK == 1)
  {
    validar_periodo_giro = 1; 
  }
  else
  {
    validar_periodo_giro = 0;
  }
  
  
  if(duty_giro_OK == 1)
  {
    validar_duty_giro = 1; 
  }
  else
  {
    validar_duty_giro = 0;
  }
  
  if(validar_periodo_giro == 1 && validar_duty_giro == 1)
  {
    ch1_ok = 1;
  }
  else 
  {
    ch1_ok = 0;
    Comprobar_Duty_Ch1();
    Comprobar_Periodo_Ch1();
  }
    
}

el resto es lo mismo pero para el canal 2