TP2 Simulation des convertisseurs
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:
- simuADC dont le rôle est de convertir un nombre représentant une tension en une valeur numérique quantifiée.
- 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 “convertisseur.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:
- Ajouter #include “convertisseur.h” dans filtretrace.h pour pouvoir appeler les fonctions de simulation de convertisseurs depuis filtretrace.
- 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:
- appeler simuADC sur chaque échantillon du tableau e[k] et stocker sa valeur de retour dans une variable ekquant du bon type.
- appeler TraiteUnEchantillon en lui fournissant en paramètre la variable précédemment calculée afin d'obtenir l'échantillon quantifié skquant.
- appeler simuDAC en lui fournissant la valeur fournie par TraiteUnEchantillon et ranger la valeur de sortie de simuDAC dans le tableau s[k].
- Vérifier le bon fonctionnement des 2 filtres du TP1. Expliquez l'amplitude de la réponse impulsionnelle du filtre RIF.
Une fois les réponses validées, mettre à jour le suivi de version en saisissant dans une console:
echo commence cd ~/TP_ARCHI_TNS_ETU git commit -a -m'ADC/DAC working' gitk & echo fini
Prise en compte de l'offset numérique des échantillons
- Ajouter aux échantillons d'entrée (pour les signaux impulsion et échelon définis dans le fichier tparchi1.cpp) un offset de 3,3V/2.
- Calculer à la main la valeur de l'échantillon de sortie du filtre à $k=3$ pour le RIF de l'exercice 2 du TP1 pour le signal impulsion avec offset défini en 1) et comparer avec la valeur fournie par ReponseEnLigne(). Interpréter les résultats.
- 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 (en entrée et en sortie !!). Pour cela, vous devrez calculer les bonnes valeurs pour les offsets. Ces offset seront accessibles dans la classe Filtre grâce aux attributs suivants: offsetEntree et offsetSortie.
- Pour que ces deux attributs soient correctement initialisés, vous veillerez à ajouter les valeurs effectives pour les paramètres du constructeur de l'objet filtre offsetEntreeInit et offsetSortieInit. Par exemple la ligne:
- cons1.cpp
FiltreTrace filtre_echo_RIF(NB_COEFF_B,coeffB,NB_COEFF_A,coeffA);
devra être remplacée par:
- cons2.cpp
FiltreTrace filtre_echo_RIF(NB_COEFF_B,coeffB,NB_COEFF_A,coeffA,0,NULL,valeur_pour_offsetEntreeInit,valeur_pour_offsetSortieInit);
- Vérifiez que les deux premiers filtres fournissent les mêmes réponses impulsionnelles 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.
Une fois les réponses validées, mettre à jour le suivi de version en saisissant dans une console:
echo commence cd ~/TP_ARCHI_TNS_ETU git commit -a -m'offset working' gitk & echo fini
Saturation du calcul de l'équation de récurrence
- Définissez le nouveau filtre $s_k=2e_k$
- Tracez sa réponse indicielle. Quel problème constatez-vous ?
- 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 les valeurs effectives pour les paramètres du constructeur de l'objet filtre valeurSortieMaxInit et valeurSortieMinInit. Par exemple la ligne:
- cons3.cpp
FiltreTrace filtre_echo_RIF(NB_COEFF_B,coeffB,NB_COEFF_A,coeffA,0,NULL,valeur_pour_offsetEntreeInit,valeur_pour_offsetSortieInit);
devra être remplacée par:
- cons4.cpp
FiltreTrace filtre_echo_RIF(NB_COEFF_B,coeffB,NB_COEFF_A,coeffA,0,NULL,offsetEntreeInit,offsetSortieInit,valeur_pour_valeurSortieMaxInit,valeur_pour_valeurSortieMinIit);
- Testez le bon fonctionnement de l'ensemble sur la sinusoïde
Une fois les réponses validées, mettre à jour le suivi de version en saisissant dans une console:
echo commence cd ~/TP_ARCHI_TNS_ETU git commit -a -m'saturation working' gitk & echo fini