Partage
  • Partager sur Facebook
  • Partager sur Twitter

[STM32L476RG] DAC + Haut Parleur

2 octobre 2019 à 20:47:46

Bonjour,

Après mon premier post sur la liaison SPI, je bloque désormais sur l'utilisation du DAC pour émettre des sons avec une STM32L4.

Pour remettre un peu de contexte : J'ai un microphone MEMS, qui transmet des data 8bit en SPI. L'objectif est d'utiliser ces data 8 bit pour les retransmettre directement sur un haut parleur branché en série avec une résistance.

Le son obtenu s'apparente plus à du bruit qu'à l'enregistrement fait par les micros...

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  SpiData[0]=0x5555;
  Data=0;
  SPI_TypeDef *spi = hspi1.Instance;			// Definition de *spi pour le spi1
  spi->CR1|=SPI_CR1_SPE;						// Activation module SPI
  HAL_DAC_Start(&hdac1, DAC_CHANNEL_2);
  while (1)
  {
		while ((spi -> SR & SPI_SR_RXNE) != SPI_SR_RXNE);		// Attente
		SpiData[1] = *(volatile uint16_t *)&spi->DR;			// Lecture de 2 Data (16 bit)
		Data = extraction8bits(SpiData[1]);				// Extraction de 8bits
		HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_2, DAC_ALIGN_8B_R, Data);	// Envoie sur le DAC
		HAL_Delay(50);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

Afin de m'assurer que mon système fonctionne j'ai tout de même fait une petite fonction mélodie, avec laquelle j'arrive à emettre un son un petit peu plus "musicale". Cette fonction marche bien.

void Melodie(void)
{
	int i=0,j=0;
	const uint16_t sine_wave_array[32] = {2047, 1648, 1264, 910, 600,  345,
	                   156, 39,  0,  39,  156,  345,
	                   600, 910, 1264, 1648, 2048, 2447,
	                   2831, 3185, 3495, 3750, 3939, 4056,
	                   4095, 4056, 3939, 3750, 3495, 3185,
	                   2831, 2447};

	for (j=0;j<15;j++)
	{
		for (i=0;i<32;i++)
		{
			HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_2, DAC_ALIGN_12B_R, sine_wave_array[i]); // Sinus
			HAL_Delay(j);							// Variation
		}
	}
}

Grace à cette fonction mélodie j'ai remarqué que l'utilisation d'un delay était indispensable pour entendre le son :

1ms --> son plutot aigu

15ms --> son plutot grave

Au dela de 15ms, le son saccade trop

J'ai donc tenté d'utiliser ce système de delay dans ma transmission DAC mais sans succès. J'ai lu que l'utilisation du TIM6 en trigger pouvait être utilisée, mais j'ai du mal à comprendre ce fonctionnement : lorsque j'active le trigger du TIM6 (via Cube MX) je n'entends plus aucun son, meme avec ma fonction Melodie (dans laquelle je met en commentaire le delay)

Voilà, si qqn à une idée du problème, je suis preneur.

Merci


  • Partager sur Facebook
  • Partager sur Twitter
N'hésitez pas à visiter mon site en construction et à donner des avis :) Merci !! Lien : http://foxwork.esy.es/