Outils pour utilisateurs

Outils du site


Action disabled: diff
tptns2017

Ceci est une ancienne révision du document !


TP2 Simulation des convertisseurs

Fonctions simulant les convertisseurs

Dans la démarche qui consiste à se rapprocher des conditions réelles dans lesquelles la fonction FiltreUnEchantillon sera utilisée, nous souhaitons maintenant intégrer les convertisseurs dans la chaîne de traitement en les simulant par des fonctions:

  1. simuADC dont le rôle est de convertir un nombre représentant une tension en une valeur numérique quantifiée.
  2. simuDAC dont le rôle est de convertir une valeur numérique quantifiée en un nombre représentant une tension.

Le schéma suivant représente l'agencement de ces deux fonctions relativement à FiltreUnEchantillon.

Les fonctions simuADC et simuDAC sont définies dans les fichiers convertisseurs.cpp et .h suuivants à copier dans votre dossier projet: <file cpp convertisseurs.h> double SimuADC ( double Ve, double Vmin, double Vmax, int nbBits); double SimuDAC ( double M, double Vmin, double Vmax, int nbBits); </file> <file cpp convertisseurs.cpp> /*! * \brief SimuADC simule un ADC avec sortie non signée */ double SimuADC ( double Ve, double Vmin, double Vmax, int nbBits) { double q = (Vmax-Vmin)/(pow(2,nbBits)-1); double ekQuant; if (Ve<Vmin) ekQuant = 0; else if (Ve>Vmax) ekQuant = pow(2,nbBits)-1; else ekQuant = round1)

1)
Ve-Vmin)/q);
  return ekQuant;
} /*! * \brief SimuDAC simule un DAC avec entrée non signée */ double SimuDAC ( double M, double Vmin, double Vmax, int nbBits) {
  double q = (Vmax-Vmin)/(pow(2,nbBits)-1);
  return (Vmin + q*( (unsigned int)M % (1<<nbBits)) );
} void test_conv(void) {
  const double vmin = -3.3;
  const double vmax = 3.3;
  const int nbbits = 4;
  const int nbpts = 1000;
  double ve[nbpts], caractADC[nbpts] ;
  double M[(int) pow(2,nbbits)], caractDAC[(int) pow(2,nbbits)];
  for(int i=0;i<nbpts;i++)
  {
      ve[i]=vmin-1+(vmax+1-vmin+1)/(nbpts-1)*i;
      caractADC[i]=SimuADC(ve[i],vmin,vmax,nbbits);
  }
  for(int i=0;i<pow(2,nbbits);i++)
  {
      M[i]=i-5;
      caractDAC[i]=SimuDAC(i-5,vmin,vmax,nbbits);
  }
  // Définissez les données à tracer
  DataATracer dataADC,dataDAC;
  initDataATracer( &dataADC ,nbpts,ve,caractADC);
  initDataATracer( &dataDAC ,pow(2,nbbits),M,caractDAC);
  // Créez une ou plusieurs fenêtres
  MainWindow *w1 = new MainWindow;
  MainWindow *w2 = new MainWindow;
  styleTrace style1 = {Qt::red,QCPGraph::lsNone,QCPScatterStyle::ssCross}, style2 = {Qt::blue,QCPGraph::lsLine,QCPScatterStyle::ssNone};
  w1->plot(dataADC,style2);
  w1->setLegend(0,"Ve","M");
  w1->setWindowTitle("caractéristique E/S ADC");
  w1->show();
  w2->plot(dataDAC,style1);
  w2->setLegend(0,"M","Vs");
  w2->setWindowTitle("caractéristique E/S DAC");
  w2->show();
} </file> === Visualisation de signaux quantifiés (45' max) ===
  1. Créez une nouvelle fonction. On souhaite visualiser sur une même fenêtre mais sur 2 axes différents (car les échelles sont différentes) l'impulsion et l'impulsion quantifiée pour 7 échantillons. Vous devez donc utiliser simuADC() pour quantifier échantillon par échantillon tout le signal impulsion et stocker le résultat dans un tableau impQuant. Simulez un CAN ayant une plage de conversion de 0/3,3V sur 4 bits (déclarez vmin, vmax, nbbits comme constantes globales).
    1. Afficher alors les deux signaux demandés.
    2. Superposer ensuite l'échelon et l'échelon quantifié.
  2. Vous pouvez constater que l'impulsion et l'échelon sont à la limite de la dynamique du CAN. Comme lors de l'utilisation de montage à AOp (souvenez-vous du télémètre !), il est préférable de centrer les signaux d'entrée sur la tension $(vmax+vmin)/2$ plutôt que sur 0V. Modifiez les signaux impulsion et echelon en conséquence. Quelle est la nouvelle valeur de repos des signaux quantifiés ?
  3. Générez un signal sinusoïdal d'amplitude 1,5V, de fréquence 1 kHz correctement centré. Dans une nouvelle fenêtre, visualisez ce signal, ce signal quantifié sur 4 bits et ce signal quantifié sur 8 bits (dynamique 0/3,3V).
  4. Faites valider votre travail.
=== Ajout des convertisseurs dans la fonction calculReponseFiltreEnLigne() === Comme cela a été dit en introduction de ce TP (relisez là si vous avez oublié…) il faut maintenant inclure les convertisseurs analogique↔numérique dans calculReponseFiltreEnLigne().
  1. Reprenez la fonction tparchi1() et intégrez dans la fonction calculReponseFiltreEnLigne l'appel de ces 2 fonctions (dynamique 0/3,3V , 12 bits) pour les utiliser avec la fonction filtreUnEchantillon:
    1. appeler simuADC et stocker sa valeur de retour dans une variable du bon type.
    2. appeler filtreUnEchantillon en lui fournissant en paramètre la variable précédemment calculée.
    3. appeler simuDAC en lui fournissant la valeur fournie par filtreUnEchantillon et ranger la valeur de sortie de simuDAC dans le tableau sk.
  2. Vérifier le bon fonctionnement des 2 filtres du TP1. Expliquez l'amplitude de la réponse impulsionnelle du filtre RIF.
=== Prise en compte de l'offset numérique des échantillons===
  1. Tester à nouveau le fonctionnement de calculReponseFiltreEnLigne() sur le filtre passe-bande de paramètres H0=2, f0=1000, Q=0,7. Il a été numérisé par transformée bilinéaire avec Fech=48000 : b[3]={0.1703 , 0.0000 , -0.1703}; a[3]={1.0000 , -1.8140 , 0.8297};
    1. Que constatez-vous ?
  2. Ce phénomène est provoqué par l'offset numérique de ek_quant (sa valeur de repos est différente de 0). Modifiez filtreUnEchantillon() pour respecter le schéma de la P11 du cours.
    1. Vérifiez que le fonctionnement du filtre est maintenant correct.
    2. Vérifiez que les deux premiers filtres fonctionnent toujours
=== Saturation du calcul de l'équation de récurrence===
  1. Définissez le nouveau filtre $s_k=2e_k$
    1. Tracez sa réponse indicielle. Quel problème constatez-vous ?
  2. Pour corriger ce problème, vous devez saturer le résultat du calcul de l'équation de récurrence avant de le retourner (donc avant la fin de filtreUnEchantillon())
    1. Testez le bon fonctionnement de l'ensemble sur la sinusoïde
</ifauth>
tptns2017.1489579072.txt.gz · Dernière modification : 2017/03/15 12:57 de bvandepo