Outils pour utilisateurs

Outils du site


Action disabled: diff
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 méthode TraiteUnEchantillon 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 à TraiteUnEchantillon.

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. Ajouter #include “convertisseurs.h” dans filtretrace.h pour pouvoir appeler les fonctions de simulation de convertisseurs depuis filtretrace.
  2. 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 TraiteUnEchantillon et ranger la valeur de sortie de simuDAC dans le tableau s[k].
  3. 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. Adapter les valeurs des échantillons pour les signaux d'entrée impulsionnel et indiciel afin que le 0 corresponde à la la tension 3.3V/2 et le 1 à la tension 1V+3.3V/2
  2. Tester à nouveau le fonctionnement de ReponseEnLigne() sur le filtre RIF de l'exercice 2 du TP1 et vérifier si la réponse indicielle est toujours valide. Interpréter les résultats en observant en mode debug la valeur de l'échantillon de sortie quantifié numéro 3 (stocké dans sk_quant).
  3. Ce phénomène est provoqué par l'offset numérique de ek_quant (sa valeur de repos est différente de 0). Modifiez TraiteUnEchantillon() pour respecter le schéma de la P11 du cours. Pour cela, vous utiliserez les attributs de la classe Filtre suivants: offsetEntree et offsetSortie. Pour que ces deux attributs soient correctement initialisés, vous veillerez à ajouter en valeurs effectives correctes pour paramètres du constructeur de l'objet filtre offsetEntreeInit et offsetSortieInit. Par exemple la ligne:

FiltreTrace filtre_echo_RIF(NB_COEFF_B,coeffB,NB_COEFF_A,coeffA); devra être remplacée par

FiltreTrace filtre_echo_RIF(NB_COEFF_B,coeffB,NB_COEFF_A,coeffA,offsetEntree,offsetSortie);
- Vérifiez  que les deux premiers filtres fournissent les mêmes réponses impulsionnelles et indicielles qu'avant ajout des convertisseurs (à la précision de la quantification près).

Remarque: C'est le même phénomène que lors de l'utilisation de montage à AOp (souvenez-vous du télémètre !), où il a fallu centrer les signaux d'entrée sur la tension $(vmax+vmin)/2$ plutôt que sur 0V.

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 TraiteUnEchantillon()). Pour cela, vous utiliserez les attributs de la classe Filtre suivants: valeurSortieMax et valeurSortieMin. Pour que ces deux attributs soient correctement initialisés, vous veillerez à ajouter en valeurs effectives correctes pour paramètres du constructeur de l'objet filtre valeurSortieMaxInit et valeurSortieMinInit. Par exemple la ligne:

FiltreTrace filtre_echo_RIF(NB_COEFF_B,coeffB,NB_COEFF_A,coeffA,offsetEntree,offsetSortie); devra être remplacée par

FiltreTrace filtre_echo_RIF(NB_COEFF_B,coeffB,NB_COEFF_A,coeffA,offsetEntree,offsetSortie,valeurSortieMaxInit,valeurSortieMin); 
  - Testez le bon fonctionnement de l'ensemble sur la sinusoïde
tptns2018_2.1553093685.txt.gz · Dernière modification : 2019/03/20 15:54 de bvandepo