Outils pour utilisateurs

Outils du site


tns_nucleo_tp1

Objectifs :

  • Mettre en oeuvre les périphériques ADC, DAC, Timer
  • Générer un signal audio sur la sortie DAC de la carte
  • Capturer un signal audio sur l'entrée ADC de la carte

Les informations nécessaires au lancement de l'outil SystemWorkbench utilisé pour ce tp sont disponibles sur Mise en place du projet architecture pour le TNS sur plateforme Nucléo

Génération de la base de temps

Afin de valider le fonctionnement du timer, nous allons utiliser la fonction d'interruption mise en place lors du TD pour générer un signal périodique sur la sortie LD2 de la carte (connectée à la LED). L'interruption timer doit survenir à la fréquence de 48kHz (au plus proche). Pour cela, il faut modifier la portion de code suivante :

static void MX_TIM1_Init(void)

déjà mise en place par l'outils STM32CubeMX.

Il faut ensuite compléter la fonction d'interruption

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
   //Code executé à la fréquence d'interruption
}

pour allumer la LED, puis l'éteindre immédiatement après à l'aide des fonctions :

void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)

la valeur pour l'argument GPIOx est LD2_GPIO_Port, et pour l'argument GPIO_Pin, la valeur est LD2_Pin. Le troisième argument peut prendre la valeur GPIO_PIN_SET ou GPIO_PIN_RESET selon que l'on souhaite activer ou désactiver la sortie.

Une fois le code mis en place et compilé, il vous faut mesurer la fréquence du signal ainsi généré à l'oscilloscope pour valider le bon fonctionnement (et faire valider par l'enseignant).

la mesure se fait sur la broche PA5 de la carte :

ATTENTION :le signal généré est haute fréquence (par rapport à la fréquence analogique max de l'oscilloscope), il faut donc désactiver le filtrage HF dans le menu Mode/Coupling.

Test du DAC

Pour observer le comportement du DAC, nous allons l'utiliser pour générer un signal sinusoidal (480Hz). Pour cela il vous faut compléter la fonction d'interruption pour :

  • Activer la sortie connectée à la LED (déjà mis en place dans l'exercice précédent)
  • Calculer la valeur de l'échantillon actuel du signal sinusoidale à 480Hz
  • Ecrire l'échantillon sur le DAC
  • Désactiver la sortie connectée à la LED (déjà mis en place dans l'exercice précédent)

Les fonctions de la librairies math (sin, cos, tan …) ne sont ici pas utilisables du fait de leur lenteur. Il faut donc définir vous meme la tabulation d'une période de la fonction sinus pour la fréquence demandée en complétant le code suivant (à coller ou il faut …). Les échantillons ainsi générés doivent couvrir la dynamique du convertisseur DAC (0 ⇐ 0 ⇐ 4095).

sin_tabbed.c
 #include <math.h>
 #define SAMPLING_RATE  ((const) 48000.0f)
 #define SIN_FREQ  ((const) 480.0f)
 #define SIN_AMP 2000.0f
 #define SIN_TAB_LENGTH ((unsigned int) (SAMPLING_RATE / SIN_FREQ)) //Taille du tableau pour une période du signal sinus
  uint32_t sin_tabbed[SIN_TAB_LENGTH];
  void init_sin_tabbed(){
	unsigned int i ;
	for(i = 0 ; i < SAMPLING_RATE/SIN_FREQ; i ++ ){
		sin_tabbed[i] = ???;
	}
  }

Cette fonction est à appeler une fois au bon endroit dans le code de la fonction main

//Insérez ici l'appel de votre fonction **init_sin_tabbed**
HAL_TIM_Base_Start_IT(&htim1); //Déjà mis en place
HAL_DAC_Start(&hdac2, DAC2_CHANNEL_1); //Déjà mis en place

et le tableau “sin_tabbed” contient ensuite les échantillons à utiliser dans la fonction d'interruption.

La fonction à utiliser pour écrire sur la sortie du DAC est :

HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data); //Ecrit une valeur "Data" sur canal "Channel" du DAC "hdac" avec l'alignement "Alignement"

avec le premier argument DAC_HandleTypeDef* hdac configuré à &hdac2

le canal du DAC configuré à :

DAC2_CHANNEL_1

et l'alignement à 0.

Une fois le code complet, vous pouvez valider par la mesure à l'oscilloscope. La mesure se fait sur la broche PA6 de la carte pour la sortie du DAC. Mesurez aussi le nouveau temps d'éxecution de la fonction d'interruption sur la boche PA5.

Utilisation de l'ADC

L'ADC du micro-controleur s'utilise avec les fonctions suivantes :

HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc); // Lance la conversion 
HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef* hadc); // Stoppe la conversion 
HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout); //Attend le résultat de la conversion, le deuxième paramètre permet de limiter le temps d'attente.
uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* had) //Lit le résultat de la conversion

Les valeurs possibles du paramètre de retour “HAL_StatusTypeDef” sont :

* HAL_OK
* HAL_ERROR
* HAL_BUSY
* HAL_TIMEOUT

A l'aide de ces fonctions, complétez la fonction appelée périodiquement : void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

pour :

  • Activer la sortie connectée à la LED (déjà mis en place dans l'exercice précédent)
  • Lancer une conversion sur l'ADC
  • Attendre la fin de la conversion (HAL_ADC_PollForConversion doit retourner HAL_OK)
  • Récupérer le résultat de la conversion
  • Stopper le convertisseur
  • Désactiver la sortie connectée à la LED (déjà mis en place dans l'exercice précédent)
  • Ecrire l'échantillon convertit sur le DAC

Pour la valeur effective de l'argument “ADC_HandleTypeDef* hadc” des fonctions ADC, vous utiliserez la valeur “&hadc1”, ex :

HAL_ADC_Start(&hadc1);

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. configurez 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. branchez la sortie du générateur de signaux sur l'entrée A0 de la carte d'adaptation LINE_IN
  4. branchez l'entrée du scope sur la sortie A1 de la carte d'adaptation LINE_OUT

img_20170327_130651.jpg img_20170327_130710.jpg

Vérifiez le bon comportement du code et mesurez sur la broche PA5, le temps temps nécessaire à l'ADC pour effectuer une conversion. Déplacez ensuite l'appel de la fonction qui désactive la sortie connectée à la LED, après l'écriture de l'échantillon sur le DAC, pour déterminer le temps total d'éxecution de la fonction d'interruption.

tns_nucleo_tp1.txt · Dernière modification: 2017/03/28 09:42 par jpiat