Subversion Repositories shark

Rev

Rev 1655 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include <math.h>

#include <modules/hartport.h>
#include <kernel/kern.h>
#include <kernel/func.h>
#include <ll/i386/x-dos.h>

#include "drivers/pclab.h"

#include "const.h"

float vmax = 0.0, vmin = 0.0, vmaxth = 0.0, vminth = 0.0;

int da_motor(float v)
{

  da_conv( 2.5 , 2 );
  da_conv( v + 2.5 , 1 );

  return(0);

}

float v2x(float v)
{
  float x;

  x= LUNGH * (v-(vmax+vmin)/2 ) / (vmax-vmin);

  return x;

}

float v2theta(float v)
{
  float theta;
 
  theta=2.0*(THETAMAX/FCA) * (v-(vmaxth+vminth)/2 ) / (vmaxth-vminth);
 
  return theta;

}

float bass1(float u)
{
  float y;
  static float oldy=0;

  y=(oldy + prm.WCUT * DEADSECX(PERIOD_CARRELLO) *u)/(1+ prm.WCUT * DEADSECX(PERIOD_CARRELLO));
  oldy=y;

  return y;

}

float bass2(float u)
{
  float y;
  static float oldy=0;

  y=(oldy + prm.WCUT1 * DEADSECX(PERIOD_CARRELLO) *u)/(1+ prm.WCUT1 * DEADSECX(PERIOD_CARRELLO));
  oldy=y;

  return y;

}

float bass3(float u)
{
  float y;
  static float oldy=0;

  y=(oldy + prm.WCUT * DEADSECTH(PERIOD_CARRELLO) *u)/(1+ prm.WCUT * DEADSECTH(PERIOD_CARRELLO));
  oldy=y;

  return y;

}

float bass4(float u)
{
  float y;
  static float oldy=0;

  y=(oldy + prm.WCUT1 * DEADSECTH(PERIOD_CARRELLO) *u)/(1+ prm.WCUT1 * DEADSECTH(PERIOD_CARRELLO));
  oldy=y;

  return y;

}

float  dx(float u)
{
  static float oldu=0;
  float y;

  y=(u-oldu)/DEADSECX(PERIOD_CARRELLO);
  oldu=u;

  return y;

}

float  dth(float u)
{
  static float oldu=0;
  float y;

  y=(u-oldu)/DEADSECTH(PERIOD_CARRELLO);
  oldu=u;

  return y;

}

TASK carrello(void)
{
  float   y[2]={0,0}, yp[2]={0,0};
  PORT    px, pth;                        
 
  float th_input = 0.0,arr_th_input[AVR],th_eff,av_th_input;
  float x_input = 0.0,arr_x_input[AVR],x_eff,av_x_input;

  int flag_th=1,flag_x=1,index_th=0,index_x=0;
 
  int i;
  float offset,vout,vout_total;
 
  px = port_create("porta1",sizeof(float),1,STICK,WRITE);
  pth = port_create("porta2",sizeof(float),1,STICK,WRITE);

  while (1) {

    task_nopreempt();
    th_input=ad_conv(10);
    task_preempt();
     
    if(flag_th==1) {
      for(i=0; i<AVR;++i) arr_th_input[i] = th_input;
      flag_th=0;
    }
    av_th_input=0;
    for(i=0;i<AVR;++i) av_th_input += arr_th_input[i];
    av_th_input /= AVR ;

    if(fabs(th_input-av_th_input)>=prm.NOISE) th_input=av_th_input;

    arr_th_input[index_th]=th_input;
    index_th = (index_th+1) % AVR ;

    th_eff = v2theta(th_input);
    y[1] = bass3(th_eff);
    yp[1] = bass4(dth(y[1]));

    task_nopreempt();
    x_input=ad_conv(11);
    task_preempt();

    if(flag_x==1) {
      for(i=0; i<AVR;++i) arr_x_input[i] = x_input;
      flag_x=0;
    }
    av_x_input=0;
    for(i=0;i<AVR;++i) av_x_input += arr_x_input[i];
    av_x_input /= AVR;
    if(fabs(x_input-av_x_input)>=prm.NOISE) x_input = av_x_input;

    arr_x_input[index_x] = x_input;
    index_x = (index_x+1) % AVR ;
       
    x_eff = v2x(x_input);      
    y[0] = bass1(x_eff);
    yp[0] = bass2(dx(y[0]));
       
    vout = prm.COST * (prm.GUAD[0] * (y[0]-v2x((vmax+vmin)/2)) + prm.GUAD[1] * th_eff\
                    + prm.GUAD[2] * yp[0] + prm.GUAD[3] * yp[1]);

    if(vout >= 0) offset=prm.OFFSVAL;
        else offset=-prm.OFFSVAL;

    vout_total = vout + offset;

    if(vout_total >= VDANG ) vout_total = VDANG ;
        if(vout_total <= -VDANG ) vout_total = -VDANG ;
       
    da_motor(vout_total);

    port_send(px, &y[0], NON_BLOCK);
    port_send(pth, &y[1], NON_BLOCK);

    task_endcycle();
 
  }
 
  port_delete(px);
  port_delete(pth);

}   /* FINE DEL TASK CARRELLO */