Outils pour utilisateurs

Outils du site


tns_nucleo_filtre

Ceci est une ancienne révision du document !


Ce tp est la suite de tns_nucleo_tp1

Mise en place de la fonction de filtrage

Une fois le DAC et l'ADC mis en place, nous pouvons à présent utiliser la classe Filtre déjà codée sour Qt. Pour cela, il vous faut copier les fichiers du projet Qt vers le projet Eclipse : filtre.h et filtre.cpp donnés dans la suite. Pour cela, copier coller dans une console:

cp ~/TP_ARCHI_TNS_ETU/filtre.cpp  ~/workspace_ac6/nucleo_tns/Src/
cp ~/TP_ARCHI_TNS_ETU/filtre.h  ~/workspace_ac6/nucleo_tns/Inc/

ensuite dans eclipse, cliquer sur l'onglet Project Explorer, ouvrir nucleo_tns, puis Src et taper sur la touche F5. Faire de même pour le dossier Inc. Normalement, les fichiers filtre.cpp et filtre.h doivent être ajoutés au projet et doivent apparaître dans les dossiers respectifs.

La classe Filtre sous Qt utilisait des types double pour les échantillons et les coefficients du filtre. Elle utilise sous Eclipse le type float car le microcontroleur STM32 de la carte nucleo ne sait pas gérer nativement le type double.

Ajout des fichiers du filtre à l'outils de gestion de version pour le projet Eclipse

Mettre à jour le suivi de version en saisissant dans une console:

echo commence
cd ~/workspace_ac6/nucleo_tns/
git add Src/filtre.cpp
git add Inc/filtre.h
commit -a -m'ajout classe Filtre'
gitk &
echo fini

Initialisation et utilisation du filtre

Inclure la définition de la classe filtre et des types au début du fichier main.cpp entre les commentaires /* USER CODE BEGIN Includes */ et /* USER CODE END Includes */.

/* USER CODE BEGIN Includes */
#include "filtre.h"
/* USER CODE END Includes */

Entre les commentaires /* USER CODE BEGIN 0 */ et /* USER CODE END 0 */, copier/coller le code suivant

filtred.cpp
//choix du filtre à utiliser
#define FILTRE1
 
//Déclaration de différents paramètres de filtres
#ifdef FILTRE1
//passe bande 
#define NB_COEFF_B 41
coefficient_t coeffB[NB_COEFF_B] = {-0.0259808358043697,-0.0275743606628094,-0.0283587041820195,-0.0282731131441959,-0.0272864868932718,-0.0253995007109912,-0.0226455146133406,-0.0190902027824487,-0.0148298919292662,-0.0099886513209803,-0.0047142306108997,0.0008270083968369,0.0064559755765054,0.0119873247646200,0.0172362600510304,0.0220254049667473,0.0261914582575037,0.0295913665059487,0.0321077620015535,0.0336534432271378,0.0341747139200087,0.0336534432271378,0.0321077620015535,0.0295913665059487,0.0261914582575037,0.0220254049667473,0.0172362600510304,0.0119873247646200,0.0064559755765054,0.0008270083968369,-0.0047142306108997,-0.0099886513209803,-0.0148298919292662,-0.0190902027824487,-0.0226455146133406,-0.0253995007109912,-0.0272864868932718,-0.0282731131441959,-0.0283587041820195,-0.0275743606628094,-0.0259808358043697};
#define NB_COEFF_A 1
coefficient_t coeffA[NB_COEFF_A]={1};
#define MEMORYSIZE 41
echantillon_t memoireVk[MEMORYSIZE];
#endif
 
 
//Déclaration de l'objet filtre avec allocation de memoireVk dans le constructeur de filtre
Filtre filtre(NB_COEFF_B,coeffB,NB_COEFF_A,coeffA,0,NULL, 2048,2048,2047,-2048); //pour ADC et DAC 12 bits

Enfin, il vous faut invoquer la méthode TraiteUnEchantillon de l'objet filtr dans la fonction d'interruption sur l'échantillon capturé.

Le code de la fonction d'interruption doit maintenant exécuter :

  • Piloter la sortie connectée à la broche PB11 et à la LED (déjà mis en place dans l'exercice précédent)
  • Piloter la sortie connectée à la broche PB12 à l'état haut (déjà mis en place dans l'exercice précédent)
  • Lancer une conversion sur l'ADC (déjà mis en place dans l'exercice précédent)
  • Attendre la fin de la conversion (HAL_ADC_PollForConversion doit retourner HAL_OK) (déjà mis en place dans l'exercice précédent)
  • Récupérer le résultat de la conversion (déjà mis en place dans l'exercice précédent)
  • Stopper le convertisseur (déjà mis en place dans l'exercice précédent)
  • Piloter la sortie connectée à la broche PB12 à l'état bas (déjà mis en place dans l'exercice précédent)
  • Appliquer le filtrage sur l'échantillon capturé
  • Ecrire l'échantillon filtré sur le DAC
  • Piloter la sortie connectée à la broche PB11 (déjà mis en place dans l'exercice précédent)

Une fois le code du filtre mis en place il vous faut le tester. Pour ce test, la carte Nucléo est associée à deux cartes : LINE_IN, LINE_OUT pour adapter les niveaux et protéger l'entrée ADC du micro-controleur. L'adaptation en entrée applique un gain de 4.54 sur le signal mis en entrée et le centre sur 1.65v.

La procédure de test est la suivante :

  1. configurer le canal génération de signal de l'oscilloscope pour une sinusoide à 400Hz centrée sur 0 avec une amplitude réglée pour ne pas saturer l'amplificateur de la carte LINE_IN (vcc=3.3v).
  2. vérifiez les caractéristiques du signal avec l'oscilloscope
  3. brancher la sortie du générateur de signaux sur l'entrée A0 de la carte d'adaptation LINE_IN
  4. brancher l'entrée du scope sur la sortie A1 de la carte d'adaptation LINE_OUT

img_20170327_130651.jpg img_20170327_130710.jpg

Le filtre de base est un filtre de recopie. A partir des caractéristiques du signal d'entrée, vérifiez la validité du signal de sortie. Il vous maintenant mesurer :

  • le temps d'éxecution total de la fonction d'interruption
  • le temps d'éxecution de la fonction de filtrage

en déplaçant l'appel des fonctions de mise à un et mise à zéro de la LED (mesure sur la broche PA5). En déduire le temps de calcul associé à un coefficient pour le filtre FIR.

tns_nucleo_filtre.1522838884.txt.gz · Dernière modification : 2018/04/04 12:48 de bvandepo