Computational routine
eng


dac

File content


/* dac Scicos Digital to Analog Converter block
 * Type 4 simulation function ver 1.0 - scilab-3.0
 * 8 Mars 2006 - INRIA - Author : A.Layec
 */

/* REVISION HISTORY :
 * $Log$
 */

#include "scicos_block.h"

/* Cette fonction de calcul réalise la convertion numérique analogique.
 *
 *
 * entrée régulière : u[0..nu-1] vecteur des entrées régulières à convertir
 * sortie régulière : y[0..ny-1] vecteur des sorties converties
 *
 * entrée évènementielle : Dates de déclenchement
 * sortie évènementeille : néant
 *
 * paramètre entier : ipar[0..nu-1]     : Nombre de bits de la valeur entière de sortie
 *                    ipar[nu..2*nu-1]  : flag code complément à 2
 *                                        0 : nombre entier non signé
 *                                        1 : nombre entier signé
 *
 * paramètre réel : rpar[0..nu-1]      : pas (ou quantum)
 *                  rpar[nu..2*nu-1]   : valeur minimale ou débute la conversion
 */

/*
 * dacv_c routine de calcul d'un convertisseur numérique analogique
 *
 * Entrées :
 * n       : taille des vecteurs
 * nbit    : longueur en bit de la valeur décimale de sortie (vecteur)
 * cc2     : flag code complément à 2 (vecteur)
 *           0 : nombre entier non signé
 *           1 : nombre entier signé
 * q       : pas de quantification (vecteur)
 * vmin    : valeur minimale du début de la quantification (vecteur)
 * u       : vecteur d'entrée (vecteur)
 *
 * Sorties :
 * y       : vecteur de sortie du convertisseur (vecteur)
 *
 */
void dacv_c(int *n,int *nbit, int *cc2,double *q,double *vmin,\
            double *u,double *y)
{
 /*Déclaration des variables compteurs*/
 int i;

 /*pour chaque elements*/
 for(i=0;i<(*n);i++)
 {
  /*Realise test sur code complément à 2*/
  if(cc2[i]==1)
    /*Calcul sortie analogique pour un code complément à 2*/
    y[i]=q[i]*(u[i]+((double)((1<<(nbit[i]-1))-1)))+vmin[i];
  else
    /*Calcul sortie analogique pour un entier non signé*/
    y[i]=q[i]*u[i]+vmin[i];
 }
 return;
}

/*prototype*/
void dac(scicos_block *block,int flag)
{
  /*Déclaration des variables*/
  double *u,*y;

  int nu;

  int nbit;
  int cc2;

  double q;
  double vmin;

  /*Récupération des adresses des ports réguliers*/
  u=(double *)block->inptr[0];
  y=(double *)block->outptr[0];

  /*Récupération de la taille du port d'entrée régulier*/
  nu=block->insz[0];

  /*Récupère le nombre de bit*/
  nbit=block->ipar[0];
  /*Récupère le type de code*/
  cc2=block->ipar[nu];

  /*Récupère le quantum*/
  q=block->rpar[0];
  /*Récupère la grandeur minimale d'entrée*/
  vmin=block->rpar[nu];

  /*Appel routine dacv_c*/
  dacv_c(&nu,&nbit,&cc2,&q,&vmin,&u[0],&y[0]);
}