3 - Commander une LED RGB par PWM”

De Wiki L.A.B
Aller à : navigation, rechercher

Commander une led Rgb par PWM



Nous allons poussez un peu plus loin l'exploration du PWM en pilotant l’éclairage d'une led RGB.

Réaliser le montage suivant à l'aide de :

- 1 Led RGB à cathode commune

- 2 résistances de 100 Ω pour les broches Vert et Bleu

- 1 résistance de 200 Ω pour la broche rouge

La valeur de ces trois résistances permet de faire varier linéairement la tension aux bornes des broches de la led RGB permettant de générer une couleur blanche.

Voici l'emplacement des différentes broches de la led RGB

RGB-LED.png


Et le schéma de câblage

SCHEMA-LED-RGB.PNG
STM32-RGB1-LED4.PNG


Nous devons comme précédemment pré-configurer les broches du STM32 sous CubeMx comme ceci

STM32-RGB-LED1.PNG


Dans l'onglet "Configuration" , régler les Timer 2 et 3 avec le "Prescaler" à 80 et le "Counter Periode" à 100

STM32-RGB-LED5.PNG
STM32-RGB-LED6.PNG


Et le code à incorporer dans votre fichier main.c
Le programme suivant va faire varier les trois timers de 0 à 100 qui permettra une variation de tension linéaire sur l'ensemble des 3 broches RGB de la led.

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM3_Init();
  MX_TIM2_Init();

  /* USER CODE BEGIN 2 */
  HAL_TIM_PWM_Start( &htim3, TIM_CHANNEL_1 ); // Green
  HAL_TIM_PWM_Start( &htim3, TIM_CHANNEL_2 ); // Red
  HAL_TIM_PWM_Start( &htim2, TIM_CHANNEL_1 ); // Blue
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  for ( int i = 0; i < 100; i ++ ) // variation de 0 à 100 de la valeur du Timer.
	  {
  /* USER CODE END WHILE */
	  __HAL_TIM_SET_COMPARE( &htim3, TIM_CHANNEL_1, i); // Green
	  __HAL_TIM_SET_COMPARE( &htim3, TIM_CHANNEL_2, i); // Red
	  __HAL_TIM_SET_COMPARE( &htim2, TIM_CHANNEL_1, i); // Blue
	  HAL_Delay( 20 );
  }
	  for ( int i = 100; i > 0; i -- )
	  {
	   /* USER CODE END WHILE */
	 	  __HAL_TIM_SET_COMPARE( &htim3, TIM_CHANNEL_1, i); // Green
	 	  __HAL_TIM_SET_COMPARE( &htim3, TIM_CHANNEL_2, i); // Red
	 	  __HAL_TIM_SET_COMPARE( &htim2, TIM_CHANNEL_1, i); // Blue
	 	  HAL_Delay( 20 );
	   }
  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

  }


Dans l'exemple suivant , nous déterminons la valeur du timer en цs pour chaque couleur

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM3_Init();
  MX_TIM2_Init();

  /* USER CODE BEGIN 2 */
  HAL_TIM_PWM_Start( &htim3, TIM_CHANNEL_1 ); // Green
  HAL_TIM_PWM_Start( &htim3, TIM_CHANNEL_2 ); // Red
  HAL_TIM_PWM_Start( &htim2, TIM_CHANNEL_1 ); // Blue
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	
   /* USER CODE END WHILE */
	  __HAL_TIM_SET_COMPARE( &htim3, TIM_CHANNEL_1, 90); // Green
	  __HAL_TIM_SET_COMPARE( &htim3, TIM_CHANNEL_2, 60); // Red
	  __HAL_TIM_SET_COMPARE( &htim2, TIM_CHANNEL_1, 80); // Blue
	  HAL_Delay( 1000 );


	   /* USER CODE END WHILE */
	 	  __HAL_TIM_SET_COMPARE( &htim3, TIM_CHANNEL_1, 5); // Green
	 	  __HAL_TIM_SET_COMPARE( &htim3, TIM_CHANNEL_2, 5); // Red
	 	  __HAL_TIM_SET_COMPARE( &htim2, TIM_CHANNEL_1, 3); // Blue
	 	  HAL_Delay( 1000 );

}
  /* USER CODE END 3 */

  }