Ejemplo n.º 1
0
void updateSpeeds(void) {
    for(unsigned char i = 0; i < 4; ++i) {
        Wheels[i]->Buffer[Wheels[i]->Time] = Wheels[i]->Counter;
        Wheels[i]->Counter = 0; 
        if(Wheels[i]->Time == (BUFSIZE -1)) {
            Wheels[i]->Speed = avgSpeed(Wheels[i]);
            Wheels[i]->Acceleration = updateAcc(Wheels[i]);
            Wheels[i]->Time = 0;
        }
        else {
            Wheels[i]->Time++;
        }
        
    }
}
Ejemplo n.º 2
0
//no real calibration only set the actual position as default
void calibrateAcc(void)
{
	int16_t tmp;
	updateAcc();

	for(uint8_t i=0; i<3; i++)
	{
		achse[i].offset = 0;
	}

	tmp = getAchseAcc(X_ACHSE);
	achse[X_ACHSE].offset = tmp * (-1);

	tmp = getAchseAcc(Y_ACHSE);
	achse[Y_ACHSE].offset = tmp * (-1);

	tmp = getAchseAcc(Z_ACHSE);
	achse[Z_ACHSE].offset = (tmp - 341) * (-1);
}
Ejemplo n.º 3
0
void rungeKutta4( FLOAT **rm, FLOAT **vm, FLOAT **rM, FLOAT **vM, FLOAT *M, FLOAT dt, int n_masses, int n_Masses ){
  // Crea los vectores de aceleracion, posicion y velodidad temporales
  FLOAT **newRm;
  FLOAT **newRM;
  // Crea el vector k de constantes intermedias del método RungeKutta
  FLOAT ***krm;
  FLOAT ***krM;
  FLOAT ***kvm;
  FLOAT ***kvM;
  // Aparta memoria
  newRm = allocate2d( n_masses, n_dim );
  newRM = allocate2d( n_Masses, n_dim );
  krm = allocate3d( n_masses, n_dim, 4 );
  krM = allocate3d( n_Masses, n_dim, 4 );
  kvm = allocate3d( n_masses, n_dim, 4 );
  kvM = allocate3d( n_Masses, n_dim, 4 );

  //********************************************************************
  //--------------------------------------------------------------------
  // Cuerpo del RungeKutta
  //--------------------------------------------------------------------
  //********************************************************************

  int i;

  /*
   * Rungekutta 1st step
   */

  for( i = 0; i < n_Masses; i++ ){

    // RungeKutta 1st step for n_Masses
    krM[0][0][i] = vM[0][i];
    krM[0][1][i] = vM[1][i];

  }

  for( i = 0; i < n_masses; i++ ){
   
    // RungeKutta 1st step for n_masses
    krm[0][0][i] = vm[0][i];
    krm[0][1][i] = vm[1][i];

  }
  
  // Actualiza las aceleraciones para el primer paso de RungeKutta
  updateAcc( rm, rM, kvm[0], kvM[0], M, n_masses, n_Masses );

  /*
   * Rungekutta 2nd step
   */

  for( i = 0; i < n_Masses; i++ ){
    // RungeKutta 2nd step for n_Masses
    
    newRM[0][i] = rM[0][i] + krM[0][0][i]*dt/2 ;
    newRM[1][i] = rM[1][i] + krM[0][1][i]*dt/2 ;
    krM[1][0][i]  = vM[0][i] + kvM[0][0][i]*dt/2 ;
    krM[1][1][i]  = vM[1][i] + kvM[0][1][i]*dt/2 ;

  }

  for( i = 0; i < n_masses; i++ ){
    
    // RungeKutta 2nd step for n_masses
    newRm[0][i] = rm[0][i] + krm[0][0][i]*dt/2 ;
    newRm[1][i] = rm[1][i] + krm[0][1][i]*dt/2 ;
    krm[1][0][i]  = vm[0][i] + kvm[0][0][i]*dt/2 ;
    krm[1][1][i]  = vm[1][i] + kvm[0][1][i]*dt/2 ;
  
  }

  // Actualiza las aceleraciones para el segundo paso de RungeKutta
  updateAcc( newRm, newRM, kvm[1], kvM[1], M, n_masses, n_Masses );
 
  /*
   * Rungekutta 3rd step
   */

  for( i = 0; i < n_Masses; i++ ){
    
    // RungeKutta 3rd step for n_Masses
    newRM[0][i] = rM[0][i] + krM[1][0][i]*dt/2 ;
    newRM[1][i] = rM[1][i] + krM[1][1][i]*dt/2 ;
    krM[2][0][i]  = vM[0][i] + kvM[1][0][i]*dt/2 ;
    krM[2][1][i]  = vM[1][i] + kvM[1][1][i]*dt/2 ;
 
  }

  for( i = 0; i < n_masses; i++ ){
    
    // RungeKutta 3rd step for n_masses
    newRm[0][i] = rm[0][i] + krm[1][0][i]*dt/2 ;
    newRm[1][i] = rm[1][i] + krm[1][1][i]*dt/2 ;
    krm[2][0][i]  = vm[0][i] + kvm[1][0][i]*dt/2 ;
    krm[2][1][i]  = vm[1][i] + kvm[1][1][i]*dt/2 ;

  }
 
  // Actualiza las aceleraciones para el segundo paso de RungeKutta
  updateAcc( newRm, newRM, kvm[2], kvM[2], M, n_masses, n_Masses );
 
  /*
   * Rungekutta 4th step
   */

  for( i = 0; i < n_Masses; i++ ){
   
    // RungeKutta 4th step for n_Masses
    newRM[0][i] = rM[0][i] + krM[2][0][i]*dt ;
    newRM[1][i] = rM[1][i] + krM[2][1][i]*dt ;
    krM[3][0][i]  = vM[0][i] + kvM[2][0][i]*dt ;
    krM[3][1][i]  = vM[1][i] + kvM[2][1][i]*dt ;

  }

  for( i = 0; i < n_masses; i++ ){
   
    // RungeKutta 4th step for n_masses
    newRm[0][i] = rm[0][i] + krm[2][0][i]*dt ;
    newRm[1][i] = rm[1][i] + krm[2][1][i]*dt ;
    krm[3][0][i]  = vm[0][i] + kvm[2][0][i]*dt ;
    krm[3][1][i]  = vm[1][i] + kvm[2][1][i]*dt ;
 
  }

  // Actualiza las aceleraciones para el segundo paso de RungeKutta
  updateAcc( newRm, newRM, kvm[3], kvM[3], M, n_masses, n_Masses );
 
  //-----------------------------------------------------------------
  //*****************************************************************

  // Promedia los k y actualiza los vectores de entrada en i+1
  
  for( i = 0; i < n_Masses; i++ ){
  
    // Promedia los ks de n_Masses
    // Actualiza los vectores de entrada
    FLOAT kmean = (1/6.0)*(krM[0][0][i] + 2*krM[1][0][i] + 2*krM[2][0][i] + krM[3][0][i]);
    rM[0][i] = rM[0][i] + kmean*dt;
    kmean = (1/6.0)*(krM[0][1][i] + 2*krM[1][1][i] + 2*krM[2][1][i] + krM[3][1][i]);
    rM[1][i] = rM[1][i] + kmean*dt;
    kmean = (1/6.0)*(kvM[0][0][i] + 2*kvM[1][0][i] + 2*kvM[2][0][i] + kvM[3][0][i]);
    vM[0][i] = vM[0][i] + kmean*dt;
    kmean = (1/6.0)*(kvM[0][1][i] + 2*kvM[1][1][i] + 2*kvM[2][1][i] + kvM[3][1][i]);
    vM[1][i] = vM[1][i] + kmean*dt;
  
  }

  for( i = 0; i < n_masses; i++ ){

    // Promedia los ks de n_masses
    // Actualiza los vectores de entrada
    FLOAT kmean = (1/6.0)*(krm[0][0][i] + 2*krm[1][0][i] + 2*krm[2][0][i] + krm[3][0][i]);
    rm[0][i] = rm[0][i] + kmean*dt;
    kmean = (1/6.0)*(krm[0][1][i] + 2*krm[1][1][i] + 2*krm[2][1][i] + krm[3][1][i]);
    rm[1][i] = rm[1][i] + kmean*dt;
    kmean = (1/6.0)*(kvm[0][0][i] + 2*kvm[1][0][i] + 2*kvm[2][0][i] + kvm[3][0][i]);
    vm[0][i] = vm[0][i] + kmean*dt;
    kmean = (1/6.0)*(kvm[0][1][i] + 2*kvm[1][1][i] + 2*kvm[2][1][i] + kvm[3][1][i]);
    vm[1][i] = vm[1][i] + kmean*dt;

  }

  // Libera memoria
  int q,w;
  for(q = 0; q < 4; q++){
    for( w = 0; w < 2; w++){
      free(krm[q][w]);
      free(kvm[q][w]);
    }
    free(krm[q]);
    free(kvm[q]);
  }

  for( w = 0; w < 2; w++){
    free(newRM[w]); 
  }
  
  for( w = 0; w < 2; w++){
    free(newRm[w]); 
  }

  for(q = 0; q < 4; q++){
    for( w = 0; w < 2; w++){
      free(krM[q][w]);
      free(kvM[q][w]);
    }
    free(krM[q]);
    free(kvM[q]);
  }
 

  free(krm);
  free(krM);
  free(kvm);
  free(kvM);
}