Outils pour utilisateurs

Outils du site


tptns2018_2

Ceci est une ancienne révision du document !


TP2 Simulation des convertisseurs


homepages.laas.fr_bvandepo_files_iut_tp_pic_warning.jpeg Polycopié du cours architecture pour le TNS cours_tns.pdf

A FAIRE A LA FIN DE CHAQUE SEANCE POUR COPIER VOS FICHIERS SUR UN DISQUE PARTAGE, ET PERMETTRE LA RECUPERATION DES FICHIERS SI UN MEMBRE DU BINOME EST ABSENT, SINON TANT PIS POUR VOUS!

copier coller dans une console:

rsync -av --delete ~/TP_ARCHI_TNS_ETU /mnt/etu/s4

et compléter la ligne en appuyant 3 fois sur la touche Tabulation, puis entrée.

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 doivent être définies dans les fichiers convertisseurs.cpp et .h que vous devez compléter dans votre projet:

convertisseurs.h
double SimuADC ( double Ve, double Vmin, double Vmax, int nbBits);
double SimuDAC ( double M, double Vmin, double Vmax, int nbBits);
convertisseurs.cpp
#include <math.h>
/*!
 * \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 = round((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)) );
 
 
}

Une directive #include “convertisseurs.h” est présente dans le fichier filtretrace.h pour pouvoir appeler ces fonctions.

Ajout des convertisseurs dans la méthode ReponseEnLigne()

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 ReponseEnLigne(). Voici les opérations à effectuer:

  1. Déplacer la méthode void ReponseEnLigne(echantillon_t * e, echantillon_t * s, int nbPts); vers la classe FiltreTrace:
    1. modifier les fichiers filtre.cpp, filtre.h, filtretrace.cpp et filtretrace.h.
  2. Ajouter #include convertisseurs.h dans filtretrace.h pour pouvoir appeler les fonctions de simulation de convertisseurs depuis filtretrace.
  3. Dans le fichier filtretrace.cpp, intégrez dans la méthode ReponseEnLigne l'appel de ces 2 fonctions (dynamique 0/3,3V , 12 bits) pour que la méthode TraiteUnEchantillon traite des échantillons quantifiés en entrée et en sortie:
    1. appeler simuADC sur chaque échantillon du tableau e[k] et stocker sa valeur de retour dans une variable ekquant du bon type.
    2. appeler TraiteUnEchantillon en lui fournissant en paramètre la variable précédemment calculée afin d'obtenir l'échantillon quantifié skquant.
    3. appeler simuDAC en lui fournissant la valeur fournie par filtreUnEchantillon et ranger la valeur de sortie de simuDAC dans le tableau s[k].
  4. 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 ReponseEnLigne() sur le filtre passe-bande du second ordre 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. 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 échelon en conséquence. Vérifiez que le fonctionnement du filtre est maintenant correct.
    2. Vérifiez que les deux premiers filtres fournissent les mêmes réponses impulsionnelles et indicielles que précédemment.

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
tptns2018_2.1552247321.txt.gz · Dernière modification: 2019/03/10 20:48 par bvandepo